Programming | Pascal » Programozás II., Pascal vizsgatételek

Datasheet

Year, pagecount:1997, 29 page(s)

Language:Hungarian

Downloads:1504

Uploaded:June 22, 2004

Size:146 KB

Institution:
-

Comments:

Attachment:-

Download in PDF:Please log in!



Comments

No comments yet. You can be the first!

Content extract

Programozás II. Vizsgatételek Típusdefiníciók a PASCAL-ban, közvetlen és közvetett típusdefiníció. Adott típushoz tartozó változó deklarálása. 1.Közvetlen típusdefiníció: A típusdefiníció megelőzi a változó deklarálását. A típusok lehetnek előredefíniáltak, vagy a programozó által defíniált, ún. saját stílusok Ebben az esetben a típusdeklarációs részt a Type fenntartott szóval kell bevezetni. A típus meghatározza a változó tárfoglalását, a végezhető műveletek körét. Pl.: Type SajatSor = String[12]; Var Sorom : SajatSor ; 2.Közvetett típusdefiníció: • A mutató típus deklarációja megelőzi a mutatott típusét. Oka : a mutatott típus tartalmazza a mutató típust. Ezzel a megoldással válik lehetővé a mutató típus beépítése a rekordba. Pl.: Type Sormutató = ^szovegsor ; Szovegsor = Record Sor : String; Elozo : Sormutato ; Kovetkezo : Sormutato ; end ; • Abszolút változó, rádefíniálás: A

programozónak lehetősége van a változó fizikai címének meghatározására. Var Valtozo : Tipus ABSOLUTE szegmens:offszet Abszolút változó deklarálásakor a konkrét fizikai cím helyett írhatunk egy másik változónevet is: Var Valtozo1 : Tipus1 ; Valtozo2 : Tipus2 ABSOLUTE Valtozo1 A rádefíniált változók esetében figyelni kell a változók memória foglalására, nehogy Valtozo2 belelógjon a rákövetkező változó tárterületébe! 3. Adott típushoz tartozó változó deklarálása: Type Sajattipus = String[12] ; Var Valtozo : Sajattipus ; 1. tétel ^ Programozás II. Vizsgatételek Struktúrálatlan és struktúrált típusok 4.Struktúrálatlan típusok: 4.1Sorszámozott típusok Minden lehetséges értékhez hozzárendelhető egy sorszám Az értékek sorszám szerint rendezettek. egészek: • Byte • Word • ShortInt • Integer • LongInt 8 bit 16 bit 8 bit 16 bit 32 bit előjeles előjeles előjeles logikai: Boolean karakter: Char felsorolt

típus: Var F : (reggeli, ebed, vacsora) ; résztartomány (intervallum) típus: Var F : -5.5; C : ’a’.’z’ ; 4.2Valós típusok • • • • • Real Single Double Extended Comp 6 bájt 4 bájt 8 bájt 10 bájt 8 bájt 5.Struktúrált típusok: • • • • • • 2. tétel Tömb Rekord Objektum Halmaz Állomány típusok Mutató típusok • típusos • típusnélküli ^ Programozás II. Vizsgatételek A halmaz típus SET OF alaptípus A halmaz elemei ugyanolyan típusúak: ez a SET alaptípusa. Alaptípus csak sorszámozott lehet, elemszám 0 és 255 között. A halmaznak -többek közt- halmazkonstruktorral adhatunk értéket. A halmazkonstruktor elemei változókat is tartalmazhatnak Pl.: Const maganhangzok : Set Of Char = [‘a’,’e’,’i’,’o’,’u’] ; Var H1 : Set Of 1.100; H2 : Set Of 4.7; H3 : Set Of ‘a’.’z’; N : Byte ; C : Char; Begin N := 20; H1 := [N,1,7,3,15]; H2 := []; End; Tárolás: 1 elem = 1 bit Műveletek: * + =

<> <=,>= IN metszet egyesítés különbség egyenlőség egyenlőtlenség tartalmazás elemvizsgálat A halmaz elemeit úgy kaphatjuk meg, hogy az összes lehetséges értékről megállapítjuk, hogy eleme-e az adott halmaznak. Ha ezt egy FOR ciklussal hajtjuk végre, akkor az elemeket rendezetten kapjuk meg. Egy halmaz egy elemet csak egyszer tartalmazhat. 3. tétel ^ Programozás II. Vizsgatételek A rekurzív eljárás fogalma Egy eljárás vagy függvény önmagából való hívását rekurzív hívásnak nevezzük. Ilyenkor a visszatérési címek, lokális változók újból és újból a verembe kerülnek, tehát a verem egyre csak telik, könnyen túlcsordul (Stack Owerflow). Rekurzió esetén meg kell adni a lehetőséget a verem kiürülésére. A verem akkor tud csökkenni, amikor az eljárás vagy függvény záró Endjére kerül a vezérlés Ekkor megszünnek a lokális változók és a visszatérési cím alapján folytatódik a programvezérlés.

Általában egy feltételtől függően szokás újra hívni a rutint, majd ha az a fektétel már nem teljesül, a program vissza tud keveredni az induló programszintre. 4. tétel ^ Programozás II. Vizsgatételek Rekord típus RECORD [mezőlista: típus]; [CASE [szelektormező:] sorszámozott típus OF értékleírás: (mezőlista)]] End ; Egy rekord különböző típusú elemeket fog össze, azokat egy adatként kezeli. Általában akkor használjuk, ha több összetartozó adatot szeretnénk együtt mozgatni. A deklarált adatokat, amelyeket a rekord mezőinek nevezünk a RECORD.END fenntartott szavak közé írjuk Változó rekord esetén a rekord egy részét többféleképpen kerül felosztásra. A CASE fenntartott szó előtti rész a fix része a rekordnak, a többi a változó rész. A változó részben az adatok felosztását többféleképpen is megadhatjuk. Ez olyan esetekben fontos, amikor a rekord fix részének tartalmától fügően más-és más adatokat

szeretnénk tárolni a változó részben. A rekordnak bármelyik felosztása bármikor elérhető, a szelektormező segíti a programozót a helyes felosztás kiválasztásában. szelektormezőt akkor érdemes használni, ha különböző adatokat tárolunk el a rekordokba és azokat a feldolgozásnál meg kell különböztetni. Egy rekordnak csak egy változó része lehet a fix rész mögött A változó rész elhagyható. • Hivatkozás a rekord egy mezőjére: rekordazonosító.mezőazonosító Előfordulhat, hogy a rekord egy mezője szintén rekord típus. Pl: SzemelyAnyaSzulDatumEv • A WITH utasítás WITH rekordazonosító DO utasítás Ha egy programrészben több utalás történik egy rekord mezőire, érdemes azt a részt egy WITH utasítással összefogni. Ilyenkor ugyanis a mezőnevek elé a fordító odateszi a WITH utasításban megadott rekordazonosítót. A WITH utasításban több rekordazonosító is felsorolható, ekkor az utolsónak legnagyobb a prioritása.

• Rekord konstans Pl.: Type Pont = Record x,y,z : integer ; end; Const Origo : Pont = (X:0; Y:0; Z:0); • A REKORD típus több összetartozó típusból áll, szerkezetét a programozó határozza meg a feladat logikai tervének megfelelően. 5. tétel ^ Programozás II. Vizsgatételek A PASCAL nyelv által kezelt állományfajták, Az állományváltozó fogalma, Fizikai és logikai állománynév összerendelése, Állomány lezárása. 1. Szöveges állomány TEXT Soros szervezésű állomány, a sorok változó hosszúságúak, fizikai címüket nem lehet sorszám alapján megállapítani. A sorokat a sorvégjel (CR,LF), az állományt az állományvégjel (^Z) zárja le. Az állomány elérése csak sorosan történhet Az állományt egyidőben vagy csak olvasni, vagy csak írni lehet. Az írás, olvasás egysége a karakter, vagy a sor. Operátorok : Read, ReadLn, Write, WriteLn, A SYSTEM egység két TEXT típusú logikai állományt is deklarál: az INPUT és az

OUTPUT szöveges állományokat. Az egység inicializáló részében mindkettőt a CON perifériához rendeli, amely bevitelkor a billentyűzet, kiíráskor a képernyő. TÁROLÁS: A program a logikai és fizikai állomány közti kapcsolatot egy TEXTREC típusú változó segítségével hozza létre, amely összesen 256 bájtnyi helyet foglal le. 2. Típusos állomány FILE OF alaptípus A típusos állomány komponensei (elemei) egyforma méretűek és alaptípus típusúak. A komponensek nem lehetnek állomány illetve objektum típusúak, valamint ilyen típusokat tartalmazó struktúrált típusúak. A komponensek száma elvileg korlátlan A beolvasás illetve kiírás egysége a komponens. A komponenseknek egyértelmű sorszámuk (pozíciójuk) van: 0,1. stb Az elérés szekvenciálisan, vagy a komponens sorszáma szerint direkt módon történhet. A típusos állomány írható és olvasható is TÁROLÁS: A program a logikai és fizikai állomány közti kapcsolatot egy

FILEREC típusú változó segítségével hozza létre, amely összesen 128 bájtnyi helyet foglal le. 3. Típusnélküli állomány FILE Elemeire nem a típus hanem a hossz a jellemző. A bevitel/kivitel alacsony szintű puffer nélküli. Általában akkor használjuk, ha ismeretlen az állomány, vagy gyors adatmozgatásra van szükség. A komponens hossza az állomány nyitásakor megadható (default = 128) Elérés szekvenciálisan, vagy a komponens sorszáma alapján direkten történhet. Az állomány írható és olvasható is. Minden file típussal kompatibilis, a Read/Write utasítás kivételével minden utasítás használható. TÁROLÁS: A program a logikai és fizikai állomány közti kapcsolatot egy FILEREC típusú változó segítségével hozza létre, amely összesen 128 bájtnyi helyet foglal le. Állományváltozó fogalma, fizikai és logikai állomány összerendelése, állomány lezárása: A program mindig egy logikai állományt kezel. A logikai állományt

jelképező állományváltozóhoz az ASSIGN eljárással rendeljük hozzá a konkrét fizikai állományt. Az állományt használat előtt meg kell nyitni. Az állományt feldolgozás után a Close(F) utasítással zárjuk le. Var F : Text; Begin Assign(F, ‘Olvasdel.Txt’); Reset(F); Close(F); End; 6. tétel ^ Programozás II. Vizsgatételek Szöveges állomány fogalma. Megnyitási módok szöveges állomány esetén Írási és olvasási műveletek: Soros szervezésű állomány, a sorok változó hosszúságúak. A sorokat a sorvégjel (CR,LF), az állományt az állományvégjel (^Z) zárja le. Az állomány elérése csak sorosan történhet Az állományt egyidőben vagy csak olvasni, vagy csak írni lehet. Az állomány mérete elvileg korlátlan, annak csak a háttértár kapacitása szab határt. A DOS megszakításokon keresztül kezeljük az állományokat. A memóriában lemez puffert foglalunk le, ide másoljuk az állomány egy blokkját. (CONFYGSYS : BUFFERS

változó) A puffer tartalma akkor kerül a lemezre, ha a puffer megtelt, vagy lezárom az állományt. Operátorok : Read, ReadLn, Write, WriteLn, Az írás, olvasás egysége a bájt (karakter), vagy a sor. Az író-olvasó műveletek a kétféle komponens kezelése céljából különböznek egymástól. A Writeln-Readln utasítás pár a sor szervezésű műveleteket, a Write-Read utasítás pár pedig a bájt szervezésű műveleteket támogatja. A Writeln utasítás a (CR,LF) sorvég karaktereket is kiírja. A Readln eljárás egy teljes sorra vonatkozik Amennyiben a sorvég karakterek előtt adjuk ki az utasítást, úgy a sorvégig hátralévő karaktereket átugorva olvassa be a sort. A Read-Write utasításokkal a műveletvégzés folytonos, az utoljára olvasott-írt karakter után folytatódik. Megnyitása történhet: • Reset(Var F); olvasásra. Az állománymutató az állomány elejére áll FilePos(F) = 0 Ha az eljárást nyitott állományra alkalmazzuk, akkor azt

automatikusan lezárja újranyitás előtt. Ha az állományváltozóhoz üres karakterláncot rendeltünk, akkor az Input állományt nyitja meg. • Rewrite(Var F); írásra. Ha az álomány már létezik, akkor előbb törli annak tartalmát, ha nem létezik, akkor létrehozza azt. Az állománymutató az állomány elejére áll. FilePos(F) = 0 és az állomány üres lesz FileSize(F) = 0 Ha az állományváltozóhoz üres karakterláncot rendeltünk, akkor az Output állományt nyitja meg írásra. • Append(Var F:Text); megnyitja írásra az F szöveges állományt, és az állománymutatót az állomány végére állítja. Ha az állomány nyitva volt, akkor az eljárás előbb lezárja, majd újra nyitja azt. Ha az utolsó 128 bájtos blokkban volt állományvégjel, akkor a mutató az első ilyenre áll. A SYSTEM egység két TEXT típusú logikai állományt is deklarál: az INPUT és az OUTPUT szöveges állományokat. Az egység inicializáló részében mindkettőt a CON

perifériához rendeli, amely bevitelkor a billentyűzet, kiíráskor a képernyő. TÁROLÁS: A program a logikai és fizikai állomány közti kapcsolatot egy TEXTREC típusú változó segítségével hozza létre, amely összesen 256 bájtnyi helyet foglal le. Szabványos eljárások, függvények: Append, Assign, Close, Eof, Eoln, Erase,Flush, IOResult, Read, ReadLn, Rename, Reset, Rewrite, SeekEof, SeekEoln, SetTextBuf, Write, WriteLn 7. tétel ^ Programozás II. Vizsgatételek A standard perifériák és a standard állományváltozók fogalma 1, A SYSTEM egységben deklarált standard perifériák a következők: • CON Console, írás esetén a képernyő, olvasás esetén a billentyűzet. Az Input és Output szabványos szöveges állományok alapértelmezésben a CON perifériához (eszközhöz) vannak rendelve. • LPT1 (=PRN), LPT2, LPT3 Line Printer (nyomtató) összesen három csatlakoztatható a géphez, csak írható eszköz. A PRINTER egység deklarálja az LST

szöveges állományt, és azt az LPT1-hez rendeli. • COM1 (=AUX), Com2 Communication Port Külvilággal történő egyéb, általában kétirányú kapcsolattartásra használatos, mint például az egér, modem, fax, stb. • NUL Nyelő - erre az eszközre való íráskor az adat eltünik, onnan való olvasáskor EOF=True. Általában tesztelési célokra használják A Turbo Pascal az egyes fizikai eszközökhöz logikai állományokat rendel, elősegítve ezzel azok kezelését. 1, A SYSTEM egységben deklarált standard állományváltozók a következők: • INPUT : TEXT; Szabványos Pascal beviteli állomány. Az egység inicializáló része a nullstring-hez, vagyis alapértelmezésben a CON perifériához (billentyűzet) rendeli, és megnyitja olvasásra. Assign(Input,’ ‘) == Assign(Input,’Con‘); Reset(Input); Read(Input,.) esetén Input elhagyható • OUTPUT : TEXT; Szabványos PASCAL kiviteli állomány. Az egység inicializáló része a nullstringhez,

alapértelmezésben a CON perifériához (képernyő) rendeli és megnyitja írásra Assign(Output,’ ‘) == Assign(Output,’Con‘); Reset(Output); Write(Output,.) esetén Output elhagyható • Lst : Text ; Szabványos kiviteli állomány. A rendszer alapértelmezésben a PRN perifériához rendeli és megnyitja írásra. A hozzárendelés a Printer egységben történik Assign(Lst,‘Prn’) ; Rewrite(Lst); Amennyiben a program használja a Crt egységet, Input és Output a Turbo Pascalban definiált CRT perifériához rendelődik és a Crt egység inicializáló része nyitja meg azokat. 8. tétel ^ Programozás II. Vizsgatételek A sornyomtató használata a PASCAL-ban. Az ESCAPE szekvenciák fogalma Ha a nyomtatóra szeretnénk írni, akkor valamelyik LPT vagy PRN perifériát meg kell nyitnunk írásra: 1, Printer egység a PASCAL-ban Változó: LST : text ; Az egység inicializáló része hozzárendeli az első nyomtatót (LPT1-et v. PRN-t) LSThez és megnyitja azt

írásra Assign(Lst, ‘LPT1’); Rewrite(Lst); Így az egységet használó program írhat az Lst állományba, azaz a nyomtatóra. A nyomtató által megjelenített írásképnek csupán tartalmi eleme a kiírt szöveg. A nyomtatók -még a legegyszerűbbek is- többet tudnak, mint csupán a szöveg puszta kiírása. A leggyakoribb funkciók -a nyomtató típusától részben függetlenül- többnyire azonosak. Természetesen a nyomtató típusától függően speciális képességek is beépítésre kerülnek. A nyomtatóknak ezeket a különleges képességeit csak részben lehet külső kezelő szervekről elérni, többségük csak az ún. vezérlő karakterekkel aktivizálható. A vezérlő karakterek jellegzetessége, hogy ASCII megfelelőik nem keltik értelmes karaktersorozat benyomását, viszont a nyomtatók megértik üzenetüket, és hatásukra az íráskép megváltozik, lapdobást, soremelést, karakter-méret változást, karakter-típus változást érünk el. Az

ilyen vezérlő karakter sorozatokat jellemző elemükről ESCAPE szekvenciáknak is nevezik. Segítségükkel a programozó a felhasználótól függetlenül vezérelheti a nyomtatót. A vezérlő karakterek nyomtató típusonként különböznek. 9. tétel ^ Programozás II. Vizsgatételek Állomány és sor vége vizsgálat szöveges állományok esetén (EOF, EOLN, SEEKEOF, SEEKEOLN) 1, EOF[(Var F : text)] : Boolean A függvény értéke True, ha az aktuális pozíció az állomány logkai végén (^Z karakteren), vagy fizikai végén áll, egyébként False. Ha F hiányzik, a függvény az Input állományt vizsgálja. Amennyiben EOF(F) True, EOLN(F) is True lesz $I- esetén az IoResult függvénnyel a művelet eredményessége lekérdezhető. 2, EOLN[(Var F : Text)] : Boolean A függvény értéke True, ha az aktális pozíció a szöveges állomány sorvégjelén (CR/LF karakterpár), vagy állományvégjelén (^Z karakteren) áll, egyébként False. Ha F hiányzik, a

függvény az Input állományt vizsgálja. A művelet eredményessége $I- esetén az IoResult függvénnyel lekérdezhető. 3, SEEKEOF[(Var F : Text)] : Boolean A függvény az F szöveges állomány következő TAB, szóköz és sorvégjeleit átugorja és értéke True lesz, ha a mutató állományvégjelre került, egyébként False. Ha F hiányzik, a függvény az Input állományt vizsgálja. Az állománynak nyitva kell elnnie A művelet eredményessége $I- esetén az IoResult függvénnyel lekérdezhető. 4, SEEKEOLN[(Var F : Text)] : Boolean A függvény az F szöveges állomány következő TAB, szóköz és sorvégjeleit átugorja és értéke True lesz, ha a mutató sorvégjelre került, egyébként False. Ha F hiányzik, a függvény az Input állományt vizsgálja. Az állománynak nyitva kell elnnie A művelet eredményessége $I- esetén az IoResult függvénnyel lekérdezhető. 10. tétel ^ Programozás II. Vizsgatételek A típusos állomány fogalma.

Megnyitási módok típusos állomány esetén Írási és olvasási műveletek. 1, A típusos állomány fogalma • A típusos állomány a PASCAL legalapvetőbb állománytípusa. Segítségével azonos típusú adatokat lehet lemezre írni, illetve onnan visszaolvasni. A típusos állomány direkt szervezésű állomány. Egyforma típusú komponensekből áll, melyeket írni és olvasni is lehet. Az írás és olvasás egysége a komponens A komponensek sorszámozva vannak, az első sorszáma a 0. A komponens típusát az állomány deklarálásakor meg kell adni A komponens típusa meghatározza annak hosszát. A programban meg kell adni legalább egy pufferváltozót, melybe a megfelelő komponenst beolvassuk, illetve onnan kiírjuk. A pufferváltozó típusa meg kell, hogy egyezzen a komponens típusával. Alaptípusa szinte bármelyik Pascal alaptípus lehet, pédául egész, karakterlánc, tömb vagy rekord. Az állomány típusának és a változó típusának -amelyikbe a

komponenst beolvassuk- meg kell egyeznie. Minden állománnyal kapcsolatos eljárás, illetve függvény első paramétere az állomány logikai neve. Nyitás előtt az Append eljárással az állományváltozóhoz hozzá kell rendelni a fizikai állománynevet. 2, megnyitási módok típusos állomány esetén: • A REWRITE(F) eljárással egy új állományt hozunk létre. Ha ilyen nevű állomány már létezett a lemezen, akkor azt az eljárás törli. Nyitáskor az új állomány üres, mutatójának értéke 0. • A RESET(F) egy már létező állományt nyit meg. Futási hibát eredményez, ha nincs ilyen nevű állomány a lemezen. Az állomány mutatója nyitáskor 0 3, Írás és olvasás típusos állomány esetén: • Típusos állományból a READ eljárással olvashatunk be egy komponenst READ(F,Pufferváltozó). Az eljárás azt a komponenst olvassa be Pufferváltozóba, amelyiken az állomány mutatója áll. Beolvasás után az állomány mutatója eggyel tovább

lép, elősegítve ezzel a szekvenciális feldolgozást. Ha a mutató nem létező elemen áll, olvasási hiba következik be! • Típusos állományba WRITE eljárással írhatunk ki egy komponenst: WRITE(F,Pufferváltozó) Az eljárás a Pufferváltozó tartalmát kimásolja a lemezen arra a helyre, ahol az állomány mutatója áll. Kiírás után az állomány mutatója eggyel tovább lép, elősegítve ezzel a szekvenciális feldolgozást. Ha egy elemet módosítani szeretnénk, akkor az elem kiírása előtt vissza kell pozícionálni, mert olvasásnál a mutató továbblép. • Állomány vége: Ha az állomány mutatója az utolsó komponens után áll, akkor vége van az állománynak. Ekkor EOF(F) = True 11. tétel ^ Programozás II. Vizsgatételek Input/output hibák programozói kezelése Pascal-ból. A {$I-} fordítóprogram direktíva • A futási hibák a program azonnali leállását okozzák. Ha a futási hiba az integrált környezetben fordul elő, akkor a

hiba szövegének kiírása mellett a kurzor a hiba sorára áll. Ha azonban a programot DOS alatt futtajuk, akkor a rendszer a ‘Run-Time Error nnn at xxxx:yyyy’ hibaüzenetet írja aképernyőre, ahol nnn a hiba kódja xxxx:yyyy pedig a hiba szegmens:offszet címe. A hibás utasítás ilyenkor is visszakereshető a keretrendszer Search/Find error parancsával. • A futási hibákat négy csoportra osztjuk: ◊ DOS hibák (1.99) ◊ B/K hibák (100.149) ◊ Kritikus hibák (150.199) ◊ Fatális hibák (200.255) • A bekövetkezett hibák a fentiek szerinti hibakódokat adnak vissza, amelyből következtetni lehet a hiba okára. A hibák kezelésére a Pascal a {$I+/-} fordítóprogram direktívát kínálja A lehetőségek a következők: ◊ {$I+} esetén (alapértelmezés) a hibaellenőrzés bekapcsolt állapotban van, bekövetkezett hiba esetén a program hibaüzenet kíséretében leáll. A programozónak ekkor semmiféle lehetősége hibakezelésre nincsen. ◊ {$I-}

esetén a hibaellenőrzés kikapcsolt állapotban van, bekövetkezett hiba esetén a program a programozó által meghatározott módon fog viselkedni. A System egység InOutRes változója tartalmazza a futási hiba kódját, aminek lekérdezésével a programozó felkészítheti programját a hiba-esetek kezelésére. Megjeleníthet magyar nyelvű hibaüzenetet, nem létező állományra vonatkozó nyitási művelet esetén megnyithat üres munkalapot szerkesztésre, elvégezheti a névadást, stb. További hibakezelés céljából a hibakódot tartalmazó változó értékét megőrizheti, vagy az IoResult függvénnyel lenullázhatja azt. A hibakód lekérdezésére így két módszer kínálkozik: ◊ az InOutRes változó értékének figyelése és megőrzése későbbi hibakezelés céljára, ◊ az IoResult függvénnyel való lekérdezés, amikor az InOutRes változó értéke a függvénnyel nullázásra kerül. • Minden állománykezelési műveletnél hibakezelést kell

alkalmazni. A ciklus utasítások közül a While ciklus használata ajánlott, mivel lehetőséget biztosít a hibaellenőrzésre. 12. tétel ^ Programozás II. Vizsgatételek Állomány létezésének ellenőrzése. Védekezés létező állomány felülírása ellen • Állomány létezésének vizsgálata is a {$I+/-} fordítóprogram direktíva használatával lehetséges. A hibaellenőrzés kikapcsolt ({$I-}) állapotában a mentés megkezdése előtt a mentési névvel állomány nyitási kísérletet teszünk. A nyitás eredményességét az IoResult függvénnyel lekérdezve, meggyőződhetünk az állomány létezéséről, és ennek ismeretében irányíthatjuk a felhasználót a program segítségével. Amennyiben a nyitási kísérlet eredménytelen volt, úgy az állomány mentése elvégezhető a megadott névvel. A hibaellenőrzést az eljárás végén bekapcsolt állapotba kell helyezni. 13. tétel ^ Programozás II. Vizsgatételek Pozícionálás

típusos állományban. A SEEK eljárás SEEK(Var F ; N : LongInt) • F típusos vagy típusnélküli állomány mutatóját az N-edik komponensre állítja. Az első komponens sorszáma 0 Ha N > FileSize(F), akkor az állomány a legközelebbi íráskor a megadott sorszámú komponensig bővül, olvasáskor B/K hiba lép fel. Az állománynak nyitva kell lennie. Típusnélküli állományok esetén a komponens mérete 128 bájt, vagy a nyitáskor megadott érték. {$I-} esetén a művelet sikeressége lekérdezhető az IoResult függvénnyel. 14. tétel ^ Programozás II. Vizsgatételek A direkt állománykarbantartás fogalma. Az állománykarbantartás alapműveletei • Az adatállomány naprakész állapota az állománykarbantartással biztosítható. Funkciói a következők: • új rekord felvitele • meglévő rekord törlése • meglévő rekord módosítása egyéb megfontolások miatt ide sorolandók még a következő műveletek is: • keresés •

újraszervezés • Direkt állománykarbantartásról akkor beszélünk, amikor a karbantartáshoz semmilyen segédeszköz (indextömb, tranzakciós állomány) nem áll rendelkezésre. A következő eseteket különböztetjük meg: • nem rendezett állomány, felvitel sorrendje nem számít • új rekord ellenőrzés: létezik-e ? írás : az állomány végére • törlés megkeresni a törlendőt, -> törlés írás : az utolsó rekord a helyére törlendő : az utolsó rekord • nem rendezett állomány, felvitel sorrendje számít • új rekord : mint előbb • törlés 1. lejjebb mozgatjuk az állományt (drága) 2. Logikai törlése a rekordnak (keresésnél nem vesszük figyelembe) deleted : Boolean fizikai törlés az állomány időnkénti újraszervezésével • rendezett állomány • beszúrás és törlés az állomány állandó átrendezésével jár • logikai törlés nem egyszerűsíti a helyzetet • rendezett állomány, direkt szervezés, törlés

nem lehetséges A rekord azonosítója és állománybeli helyzete közt egyértelmű megfeleltetés van : direkt pozícionálás lehetősége. A rekordok automatikusan állandó rendezettségben vannak, elősegítve a szekvenciális feldolgozásokat. • ‘érvényes : boolean’ mező használata • fizikai törlés nem lehetséges • új rekord felvitele csak új illeszkedő azonosítóval lehetséges • rendezett állomány, direkt szervezés, törlés lehetséges • ‘érvényes : boolean’ mező használata a lyukak figyelésére (nem használt kódok miatt) • létrehozás : várható mennyiségű törölt rekord felvitele • keresés : kulcstranszformáció segítségével tartományra illeszkedés vizsgálatával • felvitel : az új kód által megkívánt mértékben bővítjük az állományt törölt rekordokkal • törlés : logikai • módosítás : rekordazonosító kivételével lehetséges 15. tétel ^ Programozás II. Vizsgatételek A rendezett

kulcsállománnyal történő állománykarbantartás alapfogalmai. Az állománykarbantartási műveletek megvalósítása, ha kulcsállományunk is van. • Az index használata lényeges előrelépést jelent a keresési és karbantartási műveletek hatékonysága terén. Az index állomány a rendezés közvetett módját biztosítja A kulcstömb rekordokból álló tömb, amelynek 2 mezője van : ‘azonositó’ ; ‘sorszám’. A tömb azonosítók (kulcsok) szerint rendezett. A sorszám az azonos kulcsú rekord sorszáma a törzsállományon belül. A keresést a rendezett indextömbben végezzük el Ha a keresett kulcsot megtaláltuk, akkor az index alapján beolvassuk a kulcshoz tartozó rekordsorszámot és pozícionálunk a rekord mutatóval. 1. Állománykarbantarási műveletek • új rekord felvitele : az adatállomány végére és a kulcsrekordot rendezetten beszúrjuk az indextömbbe. • módosítás : kulcstömb alapján megkeressük a módosítandó rekordot, a

módosítandó mezőket egyenként végigolvassuk, módosítjuk. A kulcsmezőt és ‘deleted’ mezőt nem engedjük módosítani. • törlés : a kulcsrekordot kitöröljük az indextömbből. Mivel mindig az indextömbben keresünk, a törölt rekordot soha többé nem találjuk meg. -> időnkénti újraszervezése az állománynak • újraszervezés : munkaállomány létrehozása a nem törölt rekordok átmásolása a munkaállományba, lezárása az eredeti törzsállomány lezárása és törlése vagy átnevezése ‘bak’ kiterjesztésre munkaállomány átnevezése a törzsállomány nevére kulcsállomány készítése az újjászervezett állományhoz • Az indextömböt a memóriában tároljuk és azon folyamatosan változtatásokat eszközlünk. Ahhoz, hogy az indextömböt legközelebb is használhassuk, a programból való kilépés előtt lemezre kell másolnunk, majd a legközelebbi program futtatáskor ismét be kell tölteni a memóriába. Az indextömb

lemezre mentett változatát indexállománynak nevezzük Adatvédelmi megfontolások miatt az indexelt állománykarbantartás esetén is ◊ a törzsállomány rekordjának tartalmaznia kell a kulcsot ◊ a törölt rekordokat meg kell jelölni 2. Az adatállomány struktúrája : ◊ törzsrekord : típusos állományban ◊ deleted : (boolean ) nyilvántartása ◊ indextömb, indexállomány 16. tétel ^ Programozás II. Vizsgatételek Típusos állományok összefésülése (összefuttatása) • Rendezett sorozarok egyesítésére szolgáló eljárás, melynek lényege, hogy a tömböket a kisebb elemszámig váltakozva végigolvasva, a kisebb értéket az eredménytömbbe rakjuk. A rövidebb tömb végére érve -rendezett tömbökről lévén szó- a hosszabbik tömb elemeit sorban a gyüjtőbe töltve rendezett eredménytömböt kapunk. Pl: uses crt; const nmax=5; mmax=6; a:array[1.nmax] of integer=(22,24,26,28,30); b:array[1.mmax] of integer=(11,33,35,37,39,51); var

c:array[1.nmax+mmax] of integer; i,j,k,l:integer; ki:boolean; begin i:=1;j:=1;k:=1; while(i<=nmax) and (j<=mmax) do {amíg az egyiknek végére nem érünk} begin if a[i]<b[j] then begin c[k]:=a[i]; i:=i+1 end else begin c[k]:=b[j]; j:=j+1 end; k:=k+1 end; for l:=i to nmax do {ott fut tovább, ahol a ciklusváltozó értéke kisebb a sorozat hosszánál} begin c[k]:=a[l]; k:=k+1 end; for l:=j to mmax do {ott fut tovább, ahol a ciklusváltozó értéke kisebb a sorozat hosszánál} begin c[k]:=b[l]; k:=k+1 end; 17. tétel ^ Programozás II. Vizsgatételek Állományok rendezésének technikái. Rendezés összefuttatással • A memóriában való rendezést belső rendezésnek (internal sort), a lemezen történőt külső rendezésnek (external sort) szokás nevezni. • A legnépszerűbb külső rendezés az un. rendezés/összeválogatás (sort/merge) Ennek lényege, hogy a nagy állományt darabonként rendezzük a memóriában, majd a rendezett részeket

összeválogatjuk. Első lépésként az állományt szakaszokra osztjuk, hogy mekkora egy szakasz hossza azt elsősorban a rendelkezésre álló memória nagysága dönti el. A szakaszokat egymás után beolvassuk a memóriába, rendezzük és kiíírjuk a lemezre. Mivel következő lépésként a rendezett szakaszokat össze kell válogatnunk, a kiírás minimum két állományba kell, hogy történjen. Nagy állományok esetén azonban ez nehezen járható megoldás. • Két-utas rendezés/összeválogatás Két-utas megoldásról beszélünk, ha egyszerre mindig csak két rendezett szakaszt válogatunk össze. K-utas rendezésről beszélünk, ha egyszerre k darab szakaszt válogatunk össze. Előnye a Két-utas megoldással szemben, hogy kevesebb a menetek száma • Rendezett sorozatok összeválogatásának a lényege a következő: Minden rendezett sorozatból hozzáférhetővé tesszük a következő elemet. A készenlétben lévő elemekből kiválasztjuk a sorrendben

következőt (legkisebbet) -ilyenből lehet egy vagy több. Minden ciklusban a készenlétben levő legkisebb elemekből bizonyosakat feldolgozunk, (akár az összeset) és a feldolgozott elemek helyére léptetjük a következő (várakozó) elemeket. A ciklus addig megy, amíg el nem fogy az összes sorozat. Mivel a rendezett sorozatokból a legkisebbet dolgozzuk fel mindig, ezért az eredménysorozat is rendezett lesz. Az összeválogatás legkényesebb része a sorozatok végének figyelése. Erre egyik megoldás a következő: ha egy sorozatból elfogytak az elemek, akkor annak mutatóját maximumra állítjuk, ezzel kényszerítve az algoritmust a többi sorozat (rendezettségben előrébb álló) elemének a feldolgozására. 18. tétel ^ Programozás II. Vizsgatételek A típus nélküli állomány fogalma. Megnyitási, írási, olvasási és lezárási műveletek Állományvég vizsgálatának lehetőségei típusnélküli állomány esetén. Típusnélküli állomány:

FILE Elemeire nem a típus hanem a hossz a jellemző. A bevitel/kivitel alacsony szintű puffer nélküli. Általában akkor használjuk, ha ismeretlen az állomány, vagy gyors adatmozgatásra van szükség. A komponens hossza az állomány nyitásakor megadható (default = 128) Elérés szekvenciálisan, vagy a komponens sorszáma alapján direkten történhet. Az állomány írható és olvasható is. TÁROLÁS: A program a logikai és fizikai állomány közti kapcsolatot egy FILEREC típusú változó segítségével hozza létre, amely összesen 128 bájtnyi helyet foglal le. A program mindig egy logikai állományt kezel. A logikai állományt jelképező állományváltozóhoz az ASSIGN eljárással rendeljük hozzá a konkrét fizikai állományt. Az állományt használat előtt meg kell nyitni. Az állományt feldolgozás után a Close(F) utasítással zárjuk le. 1, megnyitási módok típus nélküli állomány esetén: • A REWRITE(Var F [: File; RecSize: Word])

eljárással egy új állományt hozunk létre. Ha ilyen nevű állomány már létezett a lemezen, akkor azt az eljárás törli. Nyitáskor az új állomány üres, mutatójának értéke 0. Az állomány írható/olvasható • A RESET(Var F [: File; RecSize: Word]) egy már létező állományt nyit meg. Futási hibát eredményez, ha nincs ilyen nevű állomány a lemezen. Az állomány mutatója nyitáskor 0 Az állomány írható/olvasható. 2, Írás és olvasás típus nélküli állomány esetén: • Típus nélküli állományból a BlockRead eljárással olvashatunk be egy komponenst BlockRead (Var F: File; Var Buf; Count : Word [;Var Result : Word]). F típusnélküli állományból beolvas Count rekordot és elhelyezi Buf változó memóriacímétől kezdődően. Csak nyitott állományra alkalmazható, a rekord méretétnyitáskor adtuk meg. Result tartalmazza visszatéréskor, hogy hány rekordot olvasott be az eljárás. Beolvasás után az állomány pozíciója

Result rekorddal előrébb áll. Result csak a nem csonka rekordok számát adja vissza, vagyis ha a rekordméret > 1, akkor az utolsó beolvasáskor a (Result+1)-edik rekordban is lehet az állományhoz tartozó adat. Ha Result hiányzik, és nem tudta a megadott számú rekordot beolvasni B/K hiba lép fel. A rekordméret 128 bájt, ha az F állomány megnyitásakor azt külön nem adtuk meg. Count* rekordméret 16 maximálisan 2 bájt lehet. A művelet eredményessége {$I-} esetén az IoResult függvénnyel lekérdezhető. Ügyeljünk arra, hogy Buf változó nagysága elegendő legyen a kért adatok tárolására, mert Buf után deklarált változókat könnyűszerrel felülírhatjuk! • Típus nélküli állományba BlockWrite eljárással írhatunk ki egy komponenst: BlockRead (Var F: File; Var Buf; Count : Word [;Var Result : Word]). F típusnélküli állományba kiír Count rekordot Buf változó kezdőcímétől. Csak nyitott állományra alkalmazható, a rekord

méretétnyitáskor adtuk meg. Result tartalmazza visszatéréskor, hogy hány rekordot írt ki az eljárás. Kiírás után az állomány pozíciója Result rekorddal előrébb áll. Ha Result hiányzik, és nem tudta a megadott számú rekordot kiírni (pl betelt a lemez) B/K hiba lép fel. A rekordméret 128 bájt, ha az F állomány megnyitásakor azt külön 16 nem adtuk meg. Count* rekordméret maximálisan 2 bájt lehet. A művelet eredményessége {$I-} esetén az IoResult függvénnyel lekérdezhető. 3, Állományvég vizsgálatának lehetőségei: • Eof(Var F) : Boolean A függvény értéke True, ha az aktuális pozíció az F állomány utolsó komponense mögé került (pl. az utolsó komponens beolvasása után), vagy üres az állomány, egyébként False. {$I-} esetén az IoResult függvénnyel lekérdezhető a művelet eredményessége. 19. tétel ^ Programozás II. Vizsgatételek Parancssor paraméterek átadása DOS alól indított .EXE programnak és a

keretrendszer alól indított programnak. A ParamStr() és ParamCount() függvények • Parancssor paraméter átadás fogalma : A programnév után szóközzel, vagy más elválasztó karakterrel szeparáltan begépelt argumentum(ok), mely a programnak az indítással egyidőben kerül átadásra és a program viselkedését meghatározza. Egy programnak akárhány paraméter átadható. • A Turbo Pascal keretrendszerben a parancssor paraméter a Run menűpont Parameters almenűjében adható meg. • A parancssor paraméterek kezelése a PASCAL-ban a ParamStr() és ParamCount() függvényekkel történik, melyek a System egységben találhatók. • A ParamCount() : Word függvény visszaadja a parancssorban átadásra került paraméterek számát. A megadott paraméterek lekérdezése a ParamStr(Index:Word ) : String függvénnyel a sorszám megadásával lehetséges. A 0 paraméter mindig a futó program állományspecifikációja 20. tétel ^ Programozás II.

Vizsgatételek A standard input/output átirányítása DOS alól indított .EXE programban • A szabványos fizikai eszközöket (CON,PRN,) bármilyen logikai eszközzel (Input, Output, Lst) össze lehet kötni. Alapértelmezésben az Input logikai eszközt például a CON fizikai eszközhöz rendelték, de az bármikor átrendelhető egy másik fizikai eszközhöz, vagy állományhoz. Az átirányítás program tesztelési, adatkonverziós, listázási és más esetekben hasznos lehet. Pl.: Begin Assign(Input, ‘Adatok.txt’); Reset(Input); Assign(Dolgozok, ‘Dolgozok.Dat’); Rewrite(Dolgozok); ReadLn(Dolgozo.Torzsszam); end. • DOS alatt indított program input/outputjának átirányítása az operációs rendszer átirányító jeleinek alkalmazásával (<;>) lehetséges. Pl.: a ‘DIR > dirlist.txt’ parancs a könyvtár listázási parancs kimenetét a ‘dirlisttxt’-be irányítja. Ha az állomány mégnem létezett, akkor létre is hozza, ha létezett,

akkor pedig felülírja. A >> operátor pedig a cél-állományba történő hozzáírást valósít meg a ‘SORT < dirlist.txt > sortlisttxt’ parancs pedig arra ad utasítást a SORT parancsnak, hogy az inputot a ‘dirlist.txt’ állományból vegye 21. tétel ^ Programozás II. Vizsgatételek Hozzáférés környezet (Enviroment) változókhoz Pascal programokból. Az EnvCount és EnvStr függvények. • A környezeti változókhoz való hozzáférést biztosító függvények a DOS egységben találhatók meg. • Az EnvCount : Integer függvény a DOS környezeti változók számát adja vissza. • Az EnvStr(Index:Integer) : String függvény az index-edik környezeti változót és annak értékét adja vissza. • Pl.: Program Enviroment ; Uses Crt, Dos ; Var I,J : Integer ; Neve, allspec : String; f : text ; Begin allspec := d:piskolai empenvirom.txt ; ClrScr ; Assign(f,allspec) ; Rewrite(f) ; I := Envcount; For J := 1 to I do Writeln(F,EnvStr(J));

close(f) ; end. A futtatás eredménye: CONFIG=PASCAL COMSPEC=C:DOSCOMMAND.COM PROMPT=$P$G TEMP=C:DOSTEMP PATH=D:BPBIN;C:WINDOWS;C:;C:NC;C:DOS;C:UTIL;C:UTILSCAN;C:UZADPROGR AM • Szintén a környezeti változók lekérdezésének lehetőségét biztosítja a GetEnv(EnvVar:String) : String függvény. Az EnvVar változóban megadott nevű DOS környezeti változó értékét adja vissza, ha az létezik, egyébként a függvény értéke üres karakterlánc lesz. 22. tétel ^ Programozás II. Vizsgatételek Könyvtárkezelési eljárások a Pascal-ban. Könyvtárak létrehozása, törlése, könyvtárváltás, az aktuális könyvtár lekérdezése. A könyvtárkezelés programozására a Pascal a System egységben a következő eljárásokat bocsájtja rendelkezésre: • ChDir(S : String) Az aktuális katalógust az S paraméterben megadottra változtatja. S teljes útvonalleírás is lehet, tartalmazhat lemezegységnevet is. Az eljárás abban tér el az operációs rendszer CD

parancsától, hogy lemezegység megadása esetén át is vált az illető egységre. A DOS az itt megadottat tekinti majd aktuálisnak a program lefutása után, ha azt még a program befejezése előtt nem állítjuk vissza. A művelet eredményessége {$I-} esetén az IoResult függvénnyel lekérdezhető. • MkDir(S : String) Létrehozza az S paramterben megadott katalógust. S teljes útvonalleírás is lehet, tartalmazhat lemezegységnevet is. Az eljárás megfelel a DOS MD parancsának A művelet eredményessége {$I-} esetén az IoResult függvénnyel lekérdezhető. • RmDir(S : String) Megszünteti az S paraméterben megadott alkatalógust. S teljes útvonalleírás is lehet, tartalmazhat lemezegységnevet is. Az eljárás megfelel a DOS RD parancsának Ha a kitörlendő katalógus nem létezik, éppen aktuális, vagy nem üres B/K hiba lép fel. A művelet eredményessége {$I-} esetén az IoResult függvénnyel lekérdezhető. • GetDir(D : Byte; var S : String) A D

paraméterben meghatározott lemezegységre vonatkozó aktuális katalógus teljes útvonalát (D:útvonal) adja vissza S-ben D=0 az aktuális, 1 az A:, 2 a B:, stb. lemezegységet jelenti B/K hiba ellenőrzés nem történik, ha a D által megadott lemezegység érvénytelen, vagy üres, akkor az érvénytelen lemezegység főkatalógusát adja vissza, mintha minden rendben lenne. 23. tétel ^ Programozás II. Vizsgatételek A DOS egység állománykeresési eljárásai (FindFirst, FindNext) a DosError változó • Az állománykeresésre a DOS egység a FindFirst, FindNext eljárásokat, valamint a SearchRec keresőrekord típust bocsájtja rendelkezésre. • SearchRec = Record Fill : Array[1.2] of Byte; Attr : Byte; Time : LongInt; Size : LongInt; Name : String[12]; end; • A FindFirst eljárás arra való, hogy a megadott katalógus első, adott tulajdonságú állományát megkeressük és annak bejegyzéseit beolvassuk. Az eljárás hívása FindFirst(útvonal:string;

attribútum:word; Var Keresőrekord: SearchRec) Az eljárás a keresőrekordban elhelyezi az első megtalált állomány adatait. A FILL mezőt a programozó nem használhatja. • A következő állomány keresése a FindNext(Keresőrekord:SearchRec) eljárás hívásával történik. • A kereső eljárások visszaadják az összes -a megadottól eltérő attribútumú- állományt is, ezért azok leválasztásáról külön gondoskodni kell. • A DOS egység rutinjainak zöme a DosError változóban ad vissza információt az elvégzett műveletről. A visszaadott kód értéke sikeres végrehajtás esetén 0, egyébként pedig a hiba okára utaló értékeket vesz fel. 24. tétel ^ Programozás II. Vizsgatételek Pascal programból DOS parancs, vagy másik program indítása • A Pascal programból való programhívásra a DOS egység Exec(Path,CmdLine:String) eljárását lehet használni. A heap maximális felső határát akkorára kell lecsökkenteni, hogy a

futtatandó külső program beférjen a memóriába, lásd $M direktíva. Hívása előtt és utána a SwapVectors eljárással a veremtartalmat el kell menteni, majd visszatölteni. Az eljárás eredményességét a DosError változó tartalmazza hívás után. Ha értéke 0, a hívott program visszatérési kódját a DosExitCode függvénnyel lehet lekérdezni. A Commandcom futtatásakor az első paraméter ‘/C’ kell legyen! 25. tétel ^ Programozás II. Vizsgatételek Állomány attribútumainak leérdezése és beállítása Pascal programból • Állományok attribútumainak kezelésére a DOS egység GetFAttr(Var F;Var Attr:word) és a SetFAttr(Var F; Attr:word) eljárásait lehet használni. Használatukkor az állománynak nem szabad nyitva lennie. F bármilyen típusú állományváltozó lehet 26. tétel ^ Programozás II. Vizsgatételek Az IBM XT/At típusú számítógépek címzési rendszere. Szegmens és offszet cím A memória felosztása EXE

állományoknál . Kód, adat és verem szegmensek • A memóriát byte-onként címezzük, és a címzéshez regisztereket használunk. 2 byte = 16 bit 16 regiszterrel összesen 2 (=65536) byte, vagyis 64 kbyte címezhető meg. 32 bites (4 byte) címzési 32 módot használva a megcímezhető memória mérete 4096 kbyte (2 ) A használt fogalmak a következők: • Abszolút cím : A memória valamely byte -jának a memória elejétől számított fizikai címe • Relatív cím : A memória valamely pontjától szmított cím. • Paragrafus : A memória egy 16 bites szelete A paragrafus mindig 16-tal osztható címen kezdődik. • Szegmens : Egy vagy több paragrafusból álló folytonos memóriaterület. A szegmens mindig paragrafushatáron kezdődik, és nagysága nem haladhatja meg a 64 kb-ot. Egy szegmens kezdőcímét kétféleképpen adhatjuk meg: paragrafusokban, vagy abszolút módon. Mivel paragrafusokban általában egy szegmens kezdetét szokás megadni, ezért ezt a

címet szegmenscímnek is nevezik. 1. A DOS operációs rendszer alatt futó programok kétkomponensű címzési módszert használnak Egy fizikai címet egy szegmenscím és egy offszetcím határoz meg. Megadása : Szegmens : Offszet • Szegmenscím: egy szegmens kezdőcíme paragrafusban • Offszetcím (eltolás): a szegmensen belüli relatív cím • Mindkét cím egy-egy regiszter, azazx 4-4 hexadecimális jegy. Legkisebb értéke $0000, legnagyobb $FFFF lehet. • Egy abszolút címet több szegmens : offszet cím is meghatározhat. • Ha a szegmenscímet megszorozzuk 16-tal és hozzáadjuk az offszetcímet, akkor megkapjuk a fizikai címet. A szorzást a hardwer végzi • Egy cím normált, ha az eltolás értéke 0 és 15 közé esik. Normált cím esetén a címzés egyértelmű. 2. A memória felosztása EXE állományoknál HeapEnd HeapPtr Szabad memória HeapOrg Heap OvrHeapEnd Overlay puffer OvrHeapOrg SSeg:Ptr SSeg:0000 Verem Szabad verem Globális

változók DSeg:0000 Típusos állandók System egység kódszegmens 1. egység kódszegmens CSeg:0000 exe n. egység kódszegmens Főprogram kódszegmens PrefixSeg 27. tétel PSP ^ Programozás II. Vizsgatételek A mutató fogalma. Típusos és típus nélküli mutató Változó címének előállítása mutatóként • Egy dinamikus változót a program futása közben hozunk létre, illetve szüntetünk meg. A létrehozott változóra mutatóval hivatkozunk, amely mutató egy 4 bájtos memóriacímet tartalmaz, a mutatott változó fizikai címét. programunk bármely részén deklarálhatunk mutató típusú változót, mely értékadás után egy címet fog tartalmazni. Ha P egy mutató típusú változó, akkor a mutatott változó P^ A heap foglalt és szabad területeit a heap-kezelő tartja nyilván és felügyeli. A heap-kezelő a System egység része. Új dinamikus változót a heap-kezelő megfelelő eljárásával lehet létrehozni A heapban elhelyezkedő

összes dinamikus változó a heap mutató (HeapPtr) által mutatott cím alatt van, vagyis HeapPtr a heap első szabad byte-jára mutat. A HeapPtr : Pointer típusú változót a System egység deklarálja. A heap-ben létrehozott változókat meg is lehet szüntetni, ezért a heapben lyukak keletkezhetnek Ha van megfelelő méretű lyuk, akkor az új változó abban kap helyet • Kétféle mutató létezik : • Típusos : a mutatott változónak jól meghatározott típusa van • Típus nélküli : A mutatott memóriaterületre nem jellemző a típus Var P1 : ^String[16] ; {típusos mutató} P2 : Pointer ; {típus nélküli mutató} • Mutatókkal nem csak dinamikus változókra lehet mutatni, hanem bármely memória területre, például egy már létező statikus változóra. A mutatókat értékadással át lehet irányítani egyik memóriacímről a másikra. Mutató típusú változókat sem kiírni, sem pedig beolvasni nem lehet A mutató típusú változóval minden olyan

művelet elvégezhető, ami egy statikusan deklarált hasonló típusú változóval. A mutatónak értéket kell adni mielőtt hivatkozunk rá ! Egy típusos mutatónak kétféleképpen adhatunk értéket: • Mutató értékadással : vagy azonos típusú mutatót, vagy típusnélküli mutatót adunk értékül • Dinamikus változó létrehozásával (New eljárás) • Címek képezhetők a @ operátorral, az Addr, valamint a Ptr függvényekkel: • @X operátor : Addr(X) : Pointer ; Az eredmény mindkét esetben Pointer típusú: az X változó vagy rutin címe. Var P : Pointer; W : Word ; P := @W ; P := Addr(W) ; • Ptr(Szegmens: offszet) : Pointer. A visszaadott érték a megadott szegmens:offszet címre mutat. Var Kep : Pointer ; Kep := Ptr($B800, 0) ; 28. tétel ^ Programozás II. Vizsgatételek Heap helyfoglalási és felszabadítási eljárások (GetMem. FreeMem, New, Dispose, mark, Release) A heap manager fogalma, működése. 1. Dinamikus változó

létrehozása: • Egy dinamikus változót a New eljárással hozhatunk létre : New(P) P egy típusos mutató-változó, típusa ^Típus. Az eljárás lefoglal egy területet a heap-ból, a lefoglalt terület nagysága byte -ban : SizeOf(Típus) P az új változóra fog mutatni. • • • • • • • • A New eljárásnak átadott aktuális paraméter típusos mutató kell, hogy legyen. A lefoglalt terület nagysága a mutató típusától függ. Hivatkozás az új változóra: P^ Ha nincs elég hely a heap-ben, futási hiba lép fel. A foglalást a heap kezelő végzi. Ha a heap tetején volt csak hely -nem volt lyuk- a HeapPtr feljebb mozog A visszaadott mutató normalizált, azaz az offszet része csak 0 vagy 8 lehet. • GetMem(Var P:Pointer;Size:Word) Lefoglal a heap-ben Size méretű területet és kezdőcímét elhelyezi P-ben. A P aktuális típusától függő memóriaterületre vagy dinamikus változóra P^-val lehet hivatkozni. Az átadott mutató általában

típus nélküli és a programozónak kell gondoskodnia arról, hogy a lefoglalt méretű heap területet használja. Maximálisan egy szegmensnyi (64 kB) hely foglalható le egyszerre az eljárással. P^ mindig 8-cal osztható, bájthatáron kezdődik • Mark(Var P:Pointer) Az eljárás megjegyzi a heap mutató értékét, vagyis a HepPtr aktuális értékét átmásolja P-be. A heap-mutató később a Release eljárással visszaállítható 2. Dinamikus változó felszabadítása: • Dispose(P) Az eljárás megszünteti a P által mutatott dinamikus változót. Ha P típusa ^Típus, akkor a felszabadított terület nagysága SizeOf(Típus). • Amennyiben Size nem egyezik az előzőleg lefoglalt terület méretével, a heap megsérülhet. A felszabadításután minden további hivatkozás P^-ra hibát eredményezhet. Futási hibát okoz, ha híváskor P nem a heap-be mutat. Nem ajánlatos a Dispose és FreeMem eljárásokat a Mark és Release eljárásokkal együtt használni! •

Release(Var P: Pointer) A megadott memóriacím feletti dinamikus tárat felszabadítja: P mutató értékét átmásolja a heap mutatóba (HeapPtr) A memóriacímet előzőleg a Mark eljárással szokás megjegyezni. Az eljárás törli a szabad listát, azaz a FreeList változó értékét Nil-re állítja Nem ajánlatos a Dispose és FreeMem eljárásokat a Mark és Release eljárásokkal együtt használni! • FreeMem(Var P:Pointer;Size:Word) Felszabadítja a heap-ből a P által mutatott Size méretű területet. • Amennyiben Size nem egyezik az előzőleg lefoglalt terület méretével, a heap megsérülhet. A felszabadításután minden további hivatkozás P^-ra hibát eredményezhet. Futási hibát okoz, ha híváskor P nem a heap-be mutat. Nem ajánlatos a Dispose és FreeMem eljárásokat a Mark és Release eljárásokkal együtt használni! 29. tétel ^