[[oktatas:programozás:pascal|< Pascal]] ====== Pascal haladó ====== ===== Pascal struktúra ===== program {a program neve} uses {a használni kívánt könyvtárak, vesszővel elválasztva} const {globális állandók meghatározása} var {globális változók meghatározása} function {függvények, ha vannak} { helyi változók } begin ... end; procedure { eljárások meghatározása, ha vannak} { helyi változók } begin ... end; begin { itt indul a főprogram } ... end. { a főprogram vége } ===== Mutatók ===== A Pascal nyelvben a ^ karakter biztosítja a mutatók használatát. Ha mutatóként deklarálok egy változót, akkor használat előtt helyet kell számára foglalni a memóriában. Mutató típusú változó létrehozásához a típus elé kell tennünk a ^ karaktert. A helyfoglalás a New() utasítással lehetséges. A Dispose() utasítással a memóriafoglalás megszüntethető. var a : ^Integer; begin New(a) ; a^ := 3; WriteLn(a^); Dispose(a); end. A fenti programban egy a mutató típusú változó deklarálunk, majd helyet foglalunk, hármat helyezünk el benne, kiíratjuk, majd töröljük a memóriából. Létrehozhatunk saját mutatótípust: type TMutato = ^integer; var a : TMutato; begin New(a) ; a^ := 3; WriteLn(a^); Dispose(a); end. A mutatókkal így dinamikus memóriahasználat valósítható meg. Az addr() függvény segítségével lekérdezhető egy változó címe: addr(valtozonev) Az ilyen cím eltárolható egy mutató típusú változóban. Tulajdonképpen rámutathatók egy másik változóra. program p01; var a : ^integer; b : integer; begin b := 3; a := addr(b); WriteLn(a^); end. A fenti programban az "a" egy mutató típusú változó. A "b" egy szimpla változó. A programban b-be teszek hármat, majd az a változóban eltárolom a b címét. Végül a változó által mutatott helyről kiírom az értéket, amely tulajdonképpen b értéke. Lentebb látni fogjuk, hogy addr() függvény elérhető a "@" operátorral is. A mutatók számára nil érték adható meg, ami azt mondja, ne mutasson sehova a mutató típusú változó: ... var ap : ^integer; begin ap = nil; Szelekcióval vizsgálhatom a nil értéket: if(ap <> nill )then { igazat kapunk ha ap nem null, vagyis mutat valahova } if(ap = nill)then { igazat kapunk, ha ap nem mutat sehova, vagyis null } ===== Különleges operátorok ===== A @ operátor visszaadja egy változó címét a memóriában. Úgy is mondhatnánk a mutatóját. var a : Integer; b : ^Integer; begin a := 3; b := @a; WriteLn(b[0]); a := 5; WriteLn(b[0]); end. A "b" változót mutató típusúnak adom meg a "^" operátorral, a megadhatom, hogy a "b" változó az "a" változóra mutasson. Ezek után ha az "a" változó értéke változik, a "b" mutató típusú változón keresztül is a megváltozott értéket tudom lekérdezni. De csinálhatjuk fordítva is: var a : Integer; b : ^Integer; begin a := 3; b := @a; WriteLn(a); b^ := 5; WriteLn(a); end. ===== Az is operátor ===== Az "is" operátorral megvizsgálhatjuk, hogy egy objektum melyik osztályból származik. {$mode objfpc} type TDolgozo = class nev : String; kor : byte; end; var Joska : TDolgozo; begin Joska := TDolgozo.Create; Joska.nev :='Nagy József'; Joska.kor := 28; if Joska is TDolgozo then WriteLn('Egyezik') else WriteLn('Nem egyezik'); end. ===== Unitok használata ===== Ahogy nő a programunk mérete, szeretnénk azokat külön állományokba elhelyezni. Egy eljárás vagy egy függvénygyűjteményt egy unit állományba teszünk. Ilyenkor a "program" kulcsszó helyett a fájl elején a "unit" kulcsszót használjuk. Fontos, hogy a fájl neve meg kell egyezzen a unit nevével. unit Calculator; interface function sum(a, b: Double):Double; function sub(a, b: Double):Double; implementation function sum(a, b: Double):Double; begin sum := a + b; end; function sub(a, b: Double):Double; begin sub := a - b; end; end. program Program01; uses Calculator, crt; begin WriteLn(sum(3, 5):0:0); WriteLn(sub(3, 5):0:0); end.