tak som trochu pozeral po strankach a na
http://mircosoft.ic.cz/index2.htm som nasiel celkom podrobny clanok o dynamickych premennych a podobnych vecach, tu je to najdolzeitejsie, mozno sa to niekomu raz zide (skusal som to a vyzera to ze to funguje
):
Dynamicka pole
Tyto datove struktury slouzi k ukladani datovych polozek, jejichz pocet sice
nezname pri psani programu, ale pozdeji ho za behu programu jeste pred
zacatkem ukladani dat nejakym zpusobem zjistime.
Oproti spojovemu seznamu se setri pameti (nepotrebujeme ukazatel v kazde
polozce) a dosahuje se rychlejsiho pristupu (prosty index pole misto
postupneho prochazeni spojoveho seznamu).
Dynamicka pole v podstate funguji jako obycejna staticka pole (var pole:
array[...] of ...), jenomze je alokujeme dynamicky (na hromade a ne v Data
segmentu) za chodu programu a pri pristupu k nim musime napsat znak ^ navic.
Jak na to:
1) Definujeme si "sablonu" pole:
type SablonaPole=array[Min..Max] of PozadovanyTypPrvku;
Je potreba, aby typ prvku odpovidal budoucimu dynamickemu poli. Cislo Min
(minimalni index pole) musi odpovidat skutecnemu pozadovanemu minimalnimu
indexu dynamickeho pole, cislo Max muze byt cokoli od Min vys.
2) Definujeme druhy pomocny typ - ukazatel na jiz definovanou sablonu:
type UkazatelNaSablonu=^SablonaPole;
3) Vypneme kontrolu rozsahu: bud direktivou {$R-} nebo nastavenim Options ->
-> Compiler -> Range checking. Bude to potreba, protoze prave to nam umozni
zapisovat do budouciho dynamickeho pole kamkoli, treba i za index Max, pokud
to SKUTECNA velikost alokovane pameti dovoli.
4) Deklarujeme prislusnou promennou - ukazatel:
var DynPole:UkazatelNaSablonu;
To mame zatim 4 "zbytecne zaplacane" byty (jeden ukazatel), ale vic uz jich,
na rozdil od spojovych seznamu, nebude.
5) Alokujeme pamet pro pole. Nejdriv si vypocitame, kolik ji budeme
potrebovat. Vezmeme velikost jednoho prvku (napr. pomoci sizeof(typ prvku))
a vynasobime ji pozadovanym poctem prvku (ktery uz v tomto okamziku znat
musime). Ted pomoci naseho ukazatele alokujeme dynamickou promennou prislusne
velikosti: Getmem(DynPole,velikost). Ukazatel DynPole sice je typovy, ale
procedura Getmem je univerzalni a jde pouzit i v tomto pripade. Kdybychom
pouzili New, alokovalo by se tak velke pole, jak jsme definovali v typu
SablonaPole, coz ale nechceme, ze jo, to by pak nebylo nic skutecne
dynamickeho.
6) A to je vsechno. Nyni mame pole, do ktereho muzeme ukladat prislusne
hodnoty jako do kazdeho jineho pole, jenom nesmime zapomenout na to, ze jdeme
pres ukazatel: DynPole^[index]:=hodnota apod.
Pozor na indexy. Je vypnuta kontrola rozsahu, takze ne abyste neco zapsali
mimo alokovane pole! Rozmery pole si musite celou dobu pamatovat.
7) Zruseni pole: Freemem(DynPole,velikost) (velikost stejna jako pri alokaci).