1 / 30

DYNAMICKÉ PREMENNÉ

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

carol
Télécharger la présentation

DYNAMICKÉ PREMENNÉ

An Image/Link below is provided (as is) to download presentation Download Policy: Content on the Website is provided to you AS IS for your information and personal use and may not be sold / licensed / shared on other websites without getting consent from its author. Content is provided to you AS IS for your information and personal use only. Download presentation by click this link. While downloading, if for some reason you are not able to download a presentation, the publisher may have deleted the file from their server. During download, if you can't get a presentation, the file might be deleted by the publisher.

E N D

Presentation Transcript


  1. DYNAMICKÉ PREMENNÉ A TYP UKAZOVATEĽ

  2. Premenné Doteraz preberané premenné sa nazývajú STATICKÉ V pamäti majú staticky pridelené miesto.

  3. Pamäť BIOS OS TP

  4. 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é

  5. STATICKÉ PREMENNÉ - globálne Program XXL; var a : integer; b, c : real; slovo : string; begin .... end. Globálne premenné

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

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

  8. 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é

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

  10. BIOS Pamäť OS Halda Aplikácia1 Aplikácia2 TP Aplikácia37 Halda Halda

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

  12. 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 ! 

  13. • 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 

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

  15. 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 }

  16. 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í.

  17. Objekt typu ukazovateľ teda obsahuje informáciu o tom, kde je umiestnený iný údajový objekt ukazovateľ premenná adresa údaj

  18. Pamäť ukazovateľ dát.segment TP dyn.premenná halda

  19. Deklarácia type        veta = string[100];    ukaz = ^veta; var       V1, V2 : ukaz;   

  20. 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:

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

  22. 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 :=

  23. type      veta = string[100];    ukaz = ^veta; var       V1, V2 : ukaz; begin ..... New(V1);  V1^ := 'Dynamické premenné vôbec nie sú zložité ;-) ';  ..... end.

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

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

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

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

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

  29. 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); ...

  30. 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; ...

More Related