Copy 2D array of structure – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu
Reklama
Reklama

Copy 2D array of structure – C / C++ – Fórum – Programujte.comCopy 2D array of structure – C / C++ – Fórum – Programujte.com

 

Hledá se programátor! Plat 1 800 € + bonusy (firma Boxmol.com)
Kent0
Stálý člen
27. 2. 2016   #1
-
0
-

Ahojte, mam strukturu

typedef struct block
{
  //premenne	
} block;

a chcem si vytvoriť pole týchto štruktúr pričom počet prvkov v tomto poli sa bude meniť(zväčšovať sa) takže si zadefinujem pole ako:

block **blocks;

a chcem počas vykonávania programu aby sa do tohto poľa pridal nový prvok keď ho vytvorím a tým pádom sa veľkosť poľa zväčšila o 1.
Skúšal som to kopírovať a skúsil som použiť aj funkcie ako memcpy ale akosi sa mi to nepodarilo.

Vedeli by ste mi poradiť?

Ďakujem. 

Nahlásit jako SPAM
IP: 147.175.176.–
Reklama
Reklama
KIIV+42
God of flame
27. 2. 2016   #2
-
0
-

Chce to vedet hlavne v jakem jazyce a rovnou hod i ukazku, co si s tim zkousel (a kompletni struktura taky neni od veci - kdo vi co tam pouzivas)...

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
Kent0
Stálý člen
27. 2. 2016   #3
-
0
-

#2 KIIV
zabudol som napísať, že je to v C.

v štruktúre sú len číselné a stringové premenné takže to asi nejaký veľký vplyv mať nebude ale keď už tak:
 

typedef struct block
{
  char *label_name;
  char *last;
  int ID;
  int number_of_int;
} block;

a ako som písal skúšal som kopírovanie cez strcpy čo asi nebol najlepší nápad a posledný pokus bol s  realloc
 

blocks = (block**)realloc(blocks, (number_of_blocks + 1) * sizeof(block *));
Nahlásit jako SPAM
IP: 147.175.176.–
Kent0
Stálý člen
27. 2. 2016   #4
-
0
-

jaaaaaj...to nie je 2D pole ale len 1D .. nadpis som teda trošku domotal

Nahlásit jako SPAM
IP: 147.175.176.–
KIIV+42
God of flame
27. 2. 2016   #5
-
0
-

Technicky vzato je to 2D pole, jen ten jeden rozmer moc nepouzivas, tim jak na kazdou pozici pravdepodobne hodis neco jako:  

block * novy = malloc(sizeof(block));
novy->label_name = malloc(n*sizeof(char)); // strcpy(novy->label_name, neco);
novy->last = malloc ...
novy->ID = ...;
novy->number_of_int = ...;

blocks[number_of_blocks-1] = novy; // za predpokladu, ze jsi po reallokaci uz zvetsil number_of_blocks o 1

// a pristup je klasicky
// blocks[index][0]
// nebo
// *(blocks[index])
// nebo
// **(blocks+index) 

Kazdopadne realloc bude zvetsovat jen to pole pointeru, tim by se nemelo dit nic zasadniho se strukturama samotnejma... S memmove a podobne, se pak nesmi zapominat na uvolnovani stareho pole (ale ne tech polozek v nem)

Po skonceni ale uvolnit veskere alokace vcetne retezcu ve strukturach

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
PiranhaGreg0
Stálý člen
27. 2. 2016   #6
-
0
-

   

#include <stdlib.h>

struct Block {
	char * label_name;
	char * last;
	int ID;
	int number_of_int;
};

void add(struct Block ** array, size_t * length, const struct Block item) {
	*array = realloc(*array, ++(*length) * sizeof(struct Block));
	*(*array + *length - 1) = item;
}

int main(void) {
	struct Block * myArray = NULL;
	size_t myArrayLength = 0;

	struct Block myBlock1 = { 0 };
	struct Block myBlock2 = { 0 };
	struct Block myBlock3 = { 0 };

	add(&myArray, &myArrayLength, myBlock1);
	add(&myArray, &myArrayLength, myBlock2);
	add(&myArray, &myArrayLength, myBlock3);

	free(myArray);
}

Případně to zvětšuj po mocnině dvou. Takhle je to dost neefektivní...

Nahlásit jako SPAM
IP: 2001:718:2:a2::16...–
Kent0
Stálý člen
28. 2. 2016   #7
-
0
-

Vďaka za rady. Už mi to funguje.

Nahlásit jako SPAM
IP: 147.175.176.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 106 hostů

Podobná vlákna

C++ copy — založil Old Spice sahara

Imap_mail_move/copy — založil sagto

Copy may be unsafe — založil Porcepoque

Funkce copy() — založil Anonymní uživatel

Std::copy may be unsafe — založil Lizzyx

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032016 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý