3rozměrné dynamické pole – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

3rozměrné dynamické pole – C / C++ – Fórum – Programujte.com3rozměrné dynamické pole – C / C++ – Fórum – Programujte.com

 

nareklam
~ Anonymní uživatel
7 příspěvků
27. 10. 2010   #1
-
0
-

Zdravím,
poradili byste mi jak alokovat 3rozměrné dynamické pole?

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
27. 10. 2010   #2
-
0
-

zalezi jestli ma vsechny rozmery stejne velke..
pokud ma tak staci jednorozmerne a pocitat si offsety podle druheho a tretiho rozmeru

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
nareklam
~ Anonymní uživatel
7 příspěvků
27. 10. 2010   #3
-
0
-

To KIIV :
Rozměr může být libovolný, podle zadání uživatele. Pomohl by mi nějaký kod.

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
27. 10. 2010   #4
-
0
-

rx = 20;

ry = 35;
rz = 59;

pole = malloc(sizeof(int) * rx * ry * rz);

// pozice v x y z

prvek = x + y * rx + z * rx * ry; // resp pozice prvku v poli

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
nareklam
~ Anonymní uživatel
7 příspěvků
27. 10. 2010   #5
-
0
-

To KIIV :
Jednoduché řešení ale já bych rád přistupoval k poli pomocí indexu pole[x][y][z].

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
27. 10. 2010   #6
-
0
-

tak
int ** pole
a pak hromady mallocu
a hlavne to musis spravne uvolnit potom..

pole = malloc(sizeof(int **) * z);
for 0; z<rz.. malloc( sizeof(int *) * y)
for 0; y<ry malloc( sizeof(int) * x ) ...

a pak muzes pristupovat pomoci [z][y][x]

Nahlásit jako SPAM
IP: 62.168.56.–
Program vždy dělá to co naprogramujete, ne to co chcete...
m->29+6
Super člen
27. 10. 2010   #7
-
0
-

Nemalo by to byť int ***pole?

Nahlásit jako SPAM
IP: 83.208.112.–
KIIV
~ Moderátor
+43
God of flame
27. 10. 2010   #8
-
0
-

To m->29 : nevim takovejm saskarnam se vyhybam :D

EDIT: jo mas pravdu..
(int ***) ukazatel -> z * (int **) -> y * (int *) -> x * int

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
nareklam
~ Anonymní uživatel
7 příspěvků
27. 10. 2010   #9
-
0
-

Díky moc, už se mi to povedlo. Mimochodem dealokace je takto?

  for(j=0; j<SizeX; j++){

for(k=0; k<SizeY; k++){
for(l=0; l<SizeZ; l++){
free(platno[j][k][l]);
}}}

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
28. 10. 2010   #10
-
0
-

To nareklam : nikoliv.. musis uvolnit jeste ty zbyly 2 rozmery.. vesmes to bude opak alokace..
nejprve uvolnis vsechny pole intu.. pak vsechny pole ukazatelu na ne
a pak pole ukazatelu na ukazatele

no proste takhle ti to hodi nejspis segfault ma linuxu / nebo neco podobnyho na win
protoze uz se snazis uvolnovat az neco co je ulozeny v tom poli ne samotny pole

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
nareklam
~ Anonymní uživatel
7 příspěvků
28. 10. 2010   #11
-
0
-

To KIIV : Pořád se mi to nedaří dealokovat. Takto alokuju:

  if((platno=(short int***)malloc(sizeof(short int**)*SizeX))!=NULL){  

for(j=0; j<SizeX; j++){
if((platno[j]=(short int**)malloc(sizeof(short int*)*SizeY))!=NULL){
for(k=0; k<SizeY; k++)
if((platno[j][k]=(short int*)malloc(sizeof(short int)*SizeZ))!=NULL);
}
}
}

A náznak dealokace?

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
28. 10. 2010   #12
-
0
-



for(j=0; j<SizeX; j++) {
for(k=0; k<SizeY; k++) {
free(platno[j][k]);
}
free(platno[j]);
}
free(platno);


maximalne muzes nahodit podminky jestli tam nejsou NULL pointery.. nebo si tam null po uvolneni mista nahazet

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
nareklam
~ Anonymní uživatel
7 příspěvků
28. 10. 2010   #13
-
0
-

To KIIV : Přesně tak jsem to měl, jenže když se podívám na využití paměťi programu ve správci úloh po uvolnění paměť neklesne, má smysl taková kontrola?

Nahlásit jako SPAM
IP: 217.197.36.–
KIIV
~ Moderátor
+43
God of flame
28. 10. 2010   #14
-
0
-

muzes zkusit udelat tu alokaci treba tisickrat po sobe a pak jeste to samy akorat vynechat to uvolnovani..
pak pochopis

jinak nejlepsi je na ladeni pameti linux a jeho nastroj valgrind... pro windows sem zadnou obdobu nenasel .. ikdyz uz dlouho sem ani nehledal

Nahlásit jako SPAM
IP: 94.142.234.–
Program vždy dělá to co naprogramujete, ne to co chcete...
m->29+6
Super člen
28. 10. 2010   #15
-
0
-

Na tieto veci existuje veľa nástrojov: valgrind , memprof , dmalloc 2 , ccmalloc , mpatrol , ElectricFence. Najlepší mi príde ten ElectricFence, ale teraz som po ňom pozeral na Googli a asi už nie je podporovaný, lebo mi nenašlo ani offic. stránku :-(

Nahlásit jako SPAM
IP: 83.208.112.–
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, 146 hostů

Podobná vlákna

Dynamicke pole — založil Earl Cash

Dynamicke pole — založil george6565

Ne/dynamicke pole — založil cecilconrad

Dynamické pole reťazcov — založil gaben

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ý