Realokace 2D pole v C – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Realokace 2D pole v C – C / C++ – Fórum – Programujte.comRealokace 2D pole v C – C / C++ – Fórum – Programujte.com

 

Melouch
~ Anonymní uživatel
2 příspěvky
21. 1. 2011   #1
-
0
-

Zdravím, měl bych dotaz ohledně realokace 2D pole v C.

Mám pole [x][4], kde x se stále zvětšuje, podle vstupů které přijdou z hlavní funkce programu. Po zadání 4 souřadnicí se zavolá následující funkce.



void addRectangle(int **rectangles, int count, int x1, int y1, int x2, int y2)
{
int **val = NULL; int i;
val = (int **)malloc(count * sizeof(int*));
for (i = 0; i < count; i++)
{
val[i] = (int*)malloc(4*sizeof(int));
if(i < count-1)
{
memcpy(val[i], rectangles[i],(4*sizeof(int)));
free(rectangles[i]);
}
}
free(rectangles);
rectangles = val;
}


Problém však je v tom, že to nefunguje :) při zadávání druhého řádku souřadnic se to tváří tak, jako by řadek [1] v poli neexistoval.

Díky za rady,
Melouch

Nahlásit jako SPAM
IP: 82.113.51.–
nervak0
Věrný člen
21. 1. 2011   #2
-
0
-

Ten nový ukazatel se ti nějak musí dostat z té funkce ven.
Když už "ručně" kopíruješ původní obsah, tak stačí new[i] = old[i].
Pro zvětšení můžeš použít realloc a nemusíš původní obsah kopírovat vůbec.

Nahlásit jako SPAM
IP: 213.211.51.–
nervak0
Věrný člen
21. 1. 2011   #3
-
0
-

int addRectangle(int ***pList, int *pCount, int x1, int y1, int x2, int y2)

{
int **oldList = *pList, count = *pCount;
int **newList = NULL, *newRect = NULL;

if ((newList = realloc(oldList, (count + 1) * sizeof(int *))) &&
(newRect = malloc(4 * sizeof(int))))
{
newRect[0] = x1; newRect[1] = y1;
newRect[2] = x2; newRect[3] = y2;
newList[count] = newRect;
*pList = newList;
*pCount = count + 1;
return 1;
}

if (newList) free(newList);
if (newRect) free(newRect);
return 0;
}

Nahlásit jako SPAM
IP: 213.211.51.–
Melouch
~ Anonymní uživatel
2 příspěvky
22. 1. 2011   #4
-
0
-

To nervak : Díky za pomoc.
Jenom teda se stále v hlavní funkci nemůžu dostat k dalšímu řádku než jen k tomu prvnímu. Prolezu první řádek, ale na druhým mě to už hodí chybu, že na tý adrese nic není.

Nahlásit jako SPAM
IP: 82.113.51.–
nervak0
Věrný člen
22. 1. 2011   #5
-
0
-

A jak to děláš? Pro tu moji funkci by to bylo třeba takhle

int main()

{
int **list = NULL, count = 0, i;
if (!addRectangle(&list, &count, 0,0,1,1)) error...;
if (!addRectangle(&list, &count, 1,1,2,2)) error...;
if (!addRectangle(&list, &count, 2,2,3,3)) error...;
for (i = 0; i < count; i++) {
int *rect = list[i];
printf("[%d,%d, %d,%d]\n", rect[0], rect[1], rect[2], rect[3]);
}
freeList(list, count);
return 0;
}

Nahlásit jako SPAM
IP: 213.211.51.–
KIIV
~ Moderátor
+43
God of flame
22. 1. 2011   #6
-
0
-

napadne mi to pripomina jeden projekt z cvut nebo kde to meli...
tam se popravde hodi spojovej seznam .. s timdle bys v zivote nedokazal splnit casovy limty

Nahlásit jako SPAM
IP: 93.91.152.–
Program vždy dělá to co naprogramujete, ne to co chcete...
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, 12 hostů

Moderátoři diskuze

 

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