kategória | ||||||||||
|
||||||||||
|
||
Dinamikus változók és adatszerkezetek (lista, fa). Tárfelosztás és tárgazdálkodás.
Az eddig megismert adattípusoknál a program a globális változók deklarálásával egy idõben lefoglalja a memóriából a szükséges mennyiségû byte-ot a változó számára. A lefoglalt memóriaterület csak a program lefutása utá 525i85f n szabadul fel, akkor is, ha csak egy rövid programrészletben használjuk a változót. A dinamikus változók nagy elõnye, hogy a memóriából csak addig foglalnak le helyet, amíg a program használja õket. A dinamikus változók élettartamát a programozó szabályozza.
Egyszerû mutató
Dinamikus változót a pointer kulcsszóval, vagy a típusmegnevezés elé írt ^
jellel deklarálhatunk.
var p1,p2:pointer;
p_int:^integer;
A mutatók - vagy pointerek - tartalma egy (4 byte-os) memóriacím, ahol a dinamikus változó értéke megtalálható. A deklaráció után a mutató még semmilyen címet nem tartalmaz, nem mutat sehova. A pointereknek a halomtárban (heap) foglalunk helyet a New eljárással:
New(dinamikus_valtozo);
Az eljárás a deklarációban megadott típus tárolásához szükséges byte-ot foglal le. Hely-foglalás elõtt leellenõrizhetjük, hogy van-e elegendõ memória a halomtárban a pointer számára.
maxblokk:=Maxavail;
summemo:=Memavail;
A
maxblokk nevû, longint típusú változó értéke a halomtár legnagyobb
szabad blokkjának mérete, míg a summemo szintén longint típusú változó értéke
a halomtár összes szabad memóriaterületének mérete lesz.
Egy dinamikus változóknál az
értékadás során a mutatott memóriacímtõl kezdõdõen kerül
tárolásra a megadott érték.
p_int^:=107;
p_int^:=3*p_int^;
p_int^:=p_int^+13;
A értékadásnál a ^ jel jelentése: "értéke". A fenti értékadások tehát így értelmezhetõk:
Egy mutató típusú változó felveheti a nil értéket, mely az érték nélküli pointert jelöli. Ha már nincs szükségünk egy dinamikus változóra, akkor fel kell szabadítani az általa lefoglalt memóriát a halomtárban a Dispose paranccsal:
Dispose(dinamikus_valtozo);
Értelemszerûen, ha egy dinamikus változó azelõtt próbálunk használni, hogy helyet foglalnánk neki, vagy az után, hogy a változó helyét felszabadítottuk, akkor a program futása hibához vezet.
Láncolt listák
Amikor egy tömböt használunk, néha elõfordul, hogy több adatot
szeretnénk tárolni, mint amennyit a tömb mérete megenged. Ha tetszõleges
mennyiségû adatok sorozatát akarjuk a memóriában tárolni, akkor
használunk láncolt listákat.
A listaelem két részbõl álló rekord: egyik rész az adat, másik a
következõ listaelemre mutató pointer.
type mutato=^sor;
sor=record
s:string;
kovetkezo:mutato;
end;
var elso,utolso:mutato;
A példában a mutato típus egy sor típusú pointer. A sor típus egy olyan rekord, mely egy s stringbõl és egy mutato típusú dinamikus változóból áll. Az elso nevû változó a lista legelsõ elemére fog mutatni, az utolso pedig az utoljára beillesztett listaelemre.
Fa
A fa olyan adatszerkezet, ahol egy elemnek több leszármazottja lehet, de csak egy őse (illetve a fa gyökerének nincs őse). A levél leszármazott nélküli elem. A fát többnyire hierarchia ábrázolására használjuk (pl. a gyökér a vezérigazgató, a közvetlen beosztottak közvetlen leszármazottak a fában, vagy a DOS könyvtár-struktúrája).
A legegyszerűbb fa a bináris fa, ahol egy elemnek legfeljebb két (egy bal- és egy jobboldali) leszármazottja lehet. A bináris fát ábrázolhatjuk táblázattal, ahol mutató adja meg egy elem jobb- és baloldali leszármazottjának helyét.
Tárgazdálkodás
A változó jellemzôje, hogy adott idôpontban létrehozzák, és esetleg valamikor késôbb törlik. A létrehozás és a törlés közötti idôintervallum a változó élettartama. Az élettartam gyakorlati okból fontos, u.i. csak élô változónak kell helyet fenntartani a tárban. Egy változó törlése után a felszabaduló helyet más változó foglalhatja le. Ez a tárgazdálkodás (strorage allocation) feladata.
Találat: 1192