Globális memóriaterület foglalása. UPP-vel.

Fórumok

Sziasztok. Abba a probémába ütközte, hogy van egy félkész program, ami lokális memóriaterületeket foglal le (ami alapból nem rossz ötlet, de nekem most lehetelené tszi a munkát). Nem nagy memóra 5-6Mb. Gondoltam, hogy a fügvények között ne kelljen vacakolni, átírom a lokális memórioakezelést egy nagy globáls tömbbe, mert sokkal kényelmesebb, és egyébként sem nagy. Na most kellene egy olyan modul ami a másik 3-külön memóriában kutat, ami ráadásul a felhasználás időpontjára már nem is létezik. Ez ugye nem lehet. Hogy tudom megtenni azt, hogy mint C++-ban, ha a main-be közvetlenűl beíroom a memóriafoglalást akkor az végig él.

Na én így láttam logikusnak:
GUI_APP_MAIN
{
alakmatrix *Alak2;
Alak2 = (alakmatrix *) calloc( 1 , sizeof(alakmatrix));

MyAppWindow app;
app.Run();
}
de erre továbbra is nem lefoglal memóriát ad hibának.

Hozzászólások

"továbbra is nem lefoglal memóriát ad hibának."
Hol adja , hogyan ?

hiba: A kododban lefoglalsz memoriat ES NEM SZABADITOD FEL, valamit a blokk vegen , elveszted azt a cimet ,hogy ugyan HOVA IS FOGLALTAD LE. Sehove nem csinalsz masolatot -se rola.

Ne keverjük a szezont a fazonnal! A main()-ben foglalt memória valóban a program teljes futása alatt él, de csak azért, mert a main függvény a program teljes futása alatt "meghívás alatt" van. De ettől még a main()-ban definiált változók _lokálisak_ maradtak, tehát ha sehol nem adod át, akkor azt másik függvényből nem is fogod elérni se. Ha ezt így akarod megcsinálni, akkor két lehetőséged van:
- az alakmatrix *Alak2 igenis globális változó lesz, de a main()-ben gyorsan megcsinálod a calloc() hívást. (Amit természetesen illik ellenőrizni is, hogy sikerült-e!)
- a MyAppWindow osztályt úgy definiálod, hogy az app.Run() át tudja venni a lefoglalt területet, tehát app.Run( Alak2 ); módon hívod

Pár apró megjegyzés:
- a calloc()-kal foglalt területet illik felszabadítani. Akkor is, ha a main()-ben foglalsz...
- ha már úgyis saját osztályt definiálsz, akkor miért nem jó az, hogy a MyAppWindow konstruktorában foglalsz memóriát? Akkor ez a pointer lehetne a MyAppWindow egy saját változója...

Az hozzá tartozik még, hogy UPP fordítás-gyorsítója (BLITZ) nem fogja lefordítani a kódodat a globális változóval. Külön jelölnöd kell neki valami makróval, hogy globális.

Amúgy meg egyáltalán nem ajánlott globális változók használata, mert csak gáz lesz belőle.

A calloc() helyett meg használj Upp::Vector<> sablont, sokkal biztonságosabb.
Mellesleg azért kiabál, mert Ultimate++ memóriadebuggerrel fordít és a calloc() hívás után nincs free.

free az van (ill abban a függvényben ahol eredetileg volt), csak azt a részt nem vágtam be. Tehát akkor annyi a dolgom, hogy beírom a zárójelbe hogy vigye magával, és kész? Az van hogy én nem programozó vagyok, csak elkezdtem tanulni, és nem igazán értek még mindent, csak csinálom.

Ha tényleg globális adat megosztás kell neked, akkor a shared memory management-re vannak megfelelő függvények (shmget, shmat, ...). Nézz utána. Már persze ha tényleg ez kell neked.

Üdv,
Dw.

"Jegyezze fel a vádhoz - utasította Metcalf őrnagy a tizedest, aki tudott gyorsírni. - Tiszteletlenül beszélt a feljebbvalójával, amikor nem pofázott közbe."

Ok már értem a problémát.

Más probléma lépet fel. Egy függvény át tud adni egy komplett pointertömböt? A lényeg hogy van egy ALAK (nagybetűs) függvény (egész pontosan egy másik file-ban is, mert annyira hosszú a függvény, hogy külön file-t kapott.):
void rdx::alak ()
{
....
alakmatrix *Alak;
Alak = (alakmatrix *) calloc( 1 , sizeof(alakmatrix));
....
}
Egyenlőre void. Na az alak teljes tömböt, hogy tudom átadni egy olyan függvénynek ahol a rajzolás történik. Eghyenlőre minden void amit definiáltam, mint nagy függvényt, mert csak le kellett hogy fusson. Az eredmény mindíg egy file volt.