Zkoušel jsem to asi takhle, ale řek bych, že to nebude to prvé ořechové...
long * PolickoBrambor[22];
for(int i=0; i<23; i++)
PolickoBrambor[i]=new long;
:?
Fórum › C / C++
Lekce 10: Jak mám postupovat, když chci alokovat místo pro pole?
Huge napsal:
Zkoušel jsem to asi takhle, ale řek bych, že to nebude to pravé ořechové...
long * PolickoBrambor[22];
for(int ii=0; ii<23; ii++)
PolickoBrambor[ii]=new long;
:
Z tveho dotazu mi neni jasne, co vlastne potrebujes. Totiz to, co jsi tu napsal je pole ukazatelu. Pokud jsi chtel tohle, tak pak je to vporadku(az na ty meze) a k jednotlivym polozkam pole pristupujes pres *PolickoBrambor[index]= 5;, ale pokud chces alokovat jen dynamicke pole, tak na to staci:
long * PolickoBrambor = new long[22];
//Potrebne kontroly
PolickoBrambor[0] = 5;
delete [] PolickoBrambor;
Je to OT, ale p?ijde mi zbyte?n? kv?li tomu zakl?dat novej topic - p?ed ned?vnem jsem pracoval s polem struktur (Vector), kter? mi ukl?daly pozice kostek na obrazovce. To pole se alokovalo podle pot?eby (zad?no u?ivatelem), vypo??talo, pak se vykreslil obsah a pak bylo zase zru?en? pomoc? delete [], p?i nov?m vstupu zase alokov?no, pro jinou hodnotu. Z n?jak?ho d?vodu se ale stalo ?e ur?it? ??st obsahu prost? z?stala - v p??pad? ?e jsem alokoval men?? pole, tak se prost? stalo ?e po??ta? vykreslil prvky kter? ?ly jakoby "p?es" obsah pole - ?ili:
Alokoval jsem 20 prvk?, vykreslil, zru?il.
Pak jsem alokoval 15, vykreslil je na jin?ch m?stech, ale tak? jsem vykreslil 15-20 na m?stech kde byly um?st?ny pro 20 polo?ek. Na druhou stranu kdy? bylo alokov?no t?eba pro 50, a pak pro 35, tak to vykreslilo ?patn? t?eba jen 20-25 a 26-35 a u? zase spr?vn? a 36-50 u? ne , prost? celkem podivn? chov?n?.
Jedin? co mi pomohlo bylo ZeroMemory(). Nev?te ??m to je?
Asan napsal:
Je to OT, ale přijde mi zbytečné kvůli tomu zakládat novej topic - před nedávnem jsem pracoval s polem struktur (Vector), které mi ukládaly pozice kostek na obrazovce. To pole se alokovalo podle potřeby (zadáno uživatelem), vypočítalo, pak se vykreslil obsah a pak bylo zase zrušené pomocí delete [], při novém vstupu zase alokováno, pro jinou hodnotu. Z nějakého důvodu se ale stalo že určitá část obsahu prostě zůstala - v případě že jsem alokoval menší pole, tak se prostě stalo že počítač vykreslil prvky které šly jakoby "přes" obsah pole - čili:
Alokoval jsem 20 prvků, vykreslil, zrušil.
Pak jsem alokoval 15, vykreslil je na jiných místech, ale také jsem vykreslil 15-20 na místech kde byly umístěny pro 20 položek. Na druhou stranu když bylo alokováno třeba pro 50, a pak pro 35, tak to vykreslilo špatně třeba jen 20-25 a 26-35 a už zase správně a 36-50 už ne , prostě celkem podivné chování.
Jediné co mi pomohlo bylo ZeroMemory(). Nevíte čím to je?
Tohle chovani je opravdu podivne, jen mi neprijde, ze by s tim melo co docineni C++, protoze jakmile se zavola operator delete/delete [], tak sice nedojde k zadnemu uvolneni pameti(fyzicky), ale o tomto prostoru operator prohlasi, ze jej jiz nadale nebude potrebovat a tim se vrati systemove prostredky. Samozrejmosti po pouziti by melo byt to pole/promennou inicializovat na 0(NULL). Ale jednak, tohle neni odpoved na tvoji otazku a prijde mi nepravdepodobne, ze by inicializace na 0 neco ovlivnila, a druhak, abych se priznal sam nevim, cim by to mohlo byt. Snad me jen napada, jestli to neni zalezitosti rozhrani, ktere pouzivas pro vykreslovani(Direc3D, OpenGL...).
Bylo to skrze D3D9 - problém se vyskytoval jen u vstupu 7-9 (jednalo se o počet kostek strany pyramidy). U čísel 1-6 a 10-999 problém nebyl.
Hele, moc tomu nerozum?m, tak nap??klad pro? se prvek toho alokovan?ho pole inicializje
PolickoBrambor[0] = 5;
a ne *PolickoBrambor[0] = 5;
d?le co je my?leno t?m //Potrebne kontroly
a to maz?n? delete [] PolickoBrambor;
je taky zaj?mav?, ikdy? pochopiteln? (to [] znamen? jako v?echny prvky, ne?)
Taky po??d nech?pu jak ud?lat ukazatel na pole.
D?ky za odpov?di, ale budu vd??nej i za link na tyto informace.
Pretoze 'long *' nie je to iste ako 'char *'
// potrebne kontroly // myslim, ze to znamena to, ze si musis dat pozor v kladani cisel do pola, pretoze alokujes pamat pre 22 cisel, ale ako vies index pola zacina od 0 a nie od 1, takze index konci pri 21 a nie 22.
// delete [] PolickoBrambor; // no a tymto prikazom manualne uvolnujes alokovanu pamat. Ukazovatel mazes prikazom 'delete pf' bez [].
Přidej příspěvek
Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku
×Vložení zdrojáku
×Vložení obrázku
×Vložení videa
Uživatelé prohlížející si toto vlákno
Podobná vlákna
Jak provázat soubory, když chci využít třídu A pro objekt B a každá… — založil PazziCZ
Jak se v Jave resi Consumer Producer, kdyz chci mit filtry? — založil verejneuzitecnysw
C# Pls. Jak mám dát do pole několik ... — založil Tomix
Chci vrátit pole — založil RePRO
Misto na disku pro win7 — založil KoseK
Moderátoři diskuze