310 likes | 473 Views
DYNAMICKÉ PREMENNÉ. A TYP UKAZOVATEĽ. Premenné . Doteraz preberané premenné sa nazývajú STATICKÉ V pamäti majú staticky pridelené miesto. Pamäť. BIOS OS TP. STATICKÉ PREMENNÉ. Podľa dĺžky života: Globálne trvajú od začiatku behu programu až do konca programu
E N D
DYNAMICKÉ PREMENNÉ A TYP UKAZOVATEĽ
Premenné Doteraz preberané premenné sa nazývajú STATICKÉ V pamäti majú staticky pridelené miesto.
Pamäť BIOS OS TP
STATICKÉ PREMENNÉ Podľa dĺžky života: • Globálne • trvajú od začiatku behu programu až do konca programu • znamená to, že od začiatku až do konca behu programu zaberajú miesto v pamäti, ktoré im bolo pridelené
STATICKÉ PREMENNÉ - globálne Program XXL; var a : integer; b, c : real; slovo : string; begin .... end. Globálne premenné
STATICKÉ PREMENNÉ • Lokálne • Vznikajú po vyvolaní podprogramu, v časti pamäti nazývanej zásobník (stack), v ktorej je miesto na všetky premenné lokálne deklarovanév podprogramoch • Končia s ukončením podprogramu – po ukončení podprogramu sa miesto v zásobníku uvoľní pre ďalšie použitie
STATICKÉ PREMENNÉ - lokálne Globálne premenné Program XXL; var a : integer; b, c : real; slovo : string; Procedure Vypocet; var x,y : byte; a : shortint; begin .... end; Begin .... End. Lokálne premenné
DYNAMICKÉ PREMENNÉ • Príkaz na jej vytvorenie dáva programátor počas behu programu • Programátor tiež musí zadať príkaz aj na jej likvidáciu • Takáto premenná prežije aj podprogam, v ktorom bola vytvorená • Netreba dopredu stanoviť, koľko premenných bude a kedy budú vytvorené
DYNAMICKÉ PREMENNÉ • Dynamická premenná sa vytvára v časti pamäti nazývanej halda (heap) • Halda je časť operačnej pamäte, ktorá je práve voľná – nepoužíva ju OS, ani aplikácie a nie sú tam ani uložené údaje
BIOS Pamäť OS Halda Aplikácia1 Aplikácia2 TP Aplikácia37 Halda Halda
Prečo dynamické premenné? • Veľa programov spracováva skupiny rovnakých údajov (napr. 30 žiakov v triede) • Doteraz sme na to využívali typ pole a typ súbor ALE !!! • u typu súbor je pomalý prístup k položkám na disku • u typu pole musí byť presne stanovený počet položiek už na začiatku programu
Príklad Škola: tvorí ju pole tried a v každej triede je pole žiakov • 9-ročná ZŠ so 4 paral. triedami v ročníku => 9x4=36 =>zaokrúhlime na 40 tried • kapacita tried býva aj viac ako 30 => zaokrúhlime na 40 žiakov => 40x40=1600 žiakov • ak údaje o 1 žiakovi zaberajú 100 B =>treba pamäť 160 000B = 160KB • ! LenžeTP má pre glob. premenné len 64 KB !
• Takže sa naučíme využívať pamäť, ktorá je mimo miesta určeného pre TP – haldu • Ako? • Budeme na to potrebovať ďalší údajový typ, ktorý nám to umožňuje
TYP UKAZOVATEĽ • Je štruktúrovaný údajový typ • Nazýva sa tiež smerník alebo pointer (alebo tiež referencia alebo adresa) • V pamäti zaberá 4 bajty rovnako ako typ Integer (lebo adresy v počítači sú 4-bajtové) a rovnako ako iné lokálne premenné aj tieto majú pri štarte podprogramu nedefinovanú hodnotu.
Smerníkový typ definujeme znakom ^ (strieška), za ktorým nasleduje identifikátor nejakého existujúceho typu – to bude ten typ, na ktorého premennú sa bude môcť tento odvolávať. Napr.: type PInteger = ^Integer; označuje smerníkový typ, pomocou ktorého sa budeme môcť odvolávať na nejaké celočíselné premenné. Za znakom môžeme zapísať len identifikátor typu, napr.: type PReal = ^Real; PChar = ^Char; PPoint = ^TPoint; POZNÁMKA: { v programátorskej obci je zaužívané identifikátory typu ukazovteľ označovať s P na začiatku –ako pointer,typy sa označujú s T na začiatku identifikátora a premenné s V – ako variables }
Hodnota uložená v premennej typu ukazovateľmá odlišný význam od hodnôt premenných, na ktoré sme boli doposiaľ zvyknutí. • Všetky údajové typy, okrem typu ukazovateľ, totiž obsahujú konkrétne hodnoty - údaje (dáta). • Hodnota uložená v premennej typu ukazovateľ je pamäťováadresa, samotné dáta však neobsahuje. • Inými slovami, ukazovateľ "ukazuje na isté miesto" v pamäti počítača. V podstate je to obyčajná premenná obsahujúca číslo, ktoré predstavuje adresu nejakého pamäťového miesta, obyčajne inej premennej. A až na tejto adrese sa ukrýva príslušná hodnota, na ktorú sme boli doteraz zvyknutí.
Objekt typu ukazovateľ teda obsahuje informáciu o tom, kde je umiestnený iný údajový objekt ukazovateľ premenná adresa údaj
Pamäť ukazovateľ dát.segment TP dyn.premenná halda
Deklarácia type veta = string[100]; ukaz = ^veta; var V1, V2 : ukaz;
Aby sme mohli s premennou typu ukazovateľ v programe pracovať, musíme jej prideliť určitú časť voľnej pamäti a adresu na túto časť pamäti uložiť do premennej typu ukazovateľ. • To robíme pomocou procedúry New:
type veta = string[100]; ukaz = ^veta; var V1, V2 : ukaz; begin ..... New(V1); ..... end. • Týmto príkazom sa vytvorí v pamäti dynamická premenná typu veta (^V1) s nedefinovanou hodnotou a jej adresa sa uloží do statickej premennej V1.
Pokiaľ chceme do dynamickej premennej niečo uložiť, musíme k nej pristupovať cez premennú typu ukazovateľ. • Toto sa vykonáva pomocou operátora nepriamej adresácie ^ • Tento operátor použijeme zároveň s príkazom priradenia :=
type veta = string[100]; ukaz = ^veta; var V1, V2 : ukaz; begin ..... New(V1); V1^ := 'Dynamické premenné vôbec nie sú zložité ;-) '; ..... end.
Keď už dynamickú premennú nepotrebujeme, treba ju zrušiť, aby sa uvoľnila pamäť pre ďalšie využitie. • Robíme to pomocou procedúry Dispose
type veta = string[100]; ukaz = ^veta; var V1, V2 : ukaz; begin ..... New(V1); V1^ := 'Dynamické premenné nie sú zložité.'; ..... Dispose(V1); ..... end. Týmto príkazom uvoľníme z pamäti dynamickú premennú typu veta a zmažeme adresu z premennej V2.
Inicializácia premennej typu ukazovateľ • Na začiatku sa premennej typu ukazovateľ priradí špeciálna hodnota, ktorá hovorí, že ukazovateľ nikam neukazuje • Je to prázdny ukazovateľ, ktorý neidentifikuje žiadnu dynamickú premennú. • Označujeme ho kľúčovým slovom NIL.
type veta = string[100]; ukaz = ^veta; var V1, V2 : ukaz; begin ..... V1:= nil; New(V1); V1^ := 'Dynamické premenné nie sú zložité.'; ..... Dispose(V1); ..... end.
Poznámka • Podobá sa to inicializácii statickej premennej, keď na začiatku do číselnej premennej priradíme nulu Var pocitadlo : byte; begin pocitadlo := 0; pocitadlo := pocitadlo + 1; ...... end.
Príklady práce so smerníkmi • Dynamická premenná celé číslo: var s: ^Integer; begin s := nil; New(s); s^ := 0; for i := 1 to 10 do s^ := s^+i; Writeln(s^); Dispose(s); ...
Príklady práce so smerníkmi • Dynamický záznam: type Zaznam = record x, y: Integer; end; var z: ^Zaznam; begin New(z); z^.x := 100; z^.y := 200; ...