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

 ( emberk | 2008. március 11., kedd - 11:22 )

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ás megjelenítési lehetőségek

A választott hozzászólás megjelenítési mód a „Beállítás” gombbal rögzíthető.

"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.

Nem baj, mindenki volt kezdő :)

Ezt az oldalt mindenképp javaslom végigolvasni:
http://ultimatepp.org/www$uppweb$overview$en-us.html

Különösen az "Everything belongs somewhere" fejezetet. Ha megérted, nagyon világos kódokat leszel képes írni.

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.