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