Alprogramok
A Pascal nyelv megkülönbözteti az eljárásokat
és a függvényeket (ellentétben pl. a C-vel, ahol
az eljárás egy olyan függvény, melynek nincs
visszatérési értéke /void/).
Eljárás definiálása:
Függvény definiálása:
Az eljárás vagy függvény törzsét
közvetlenül a fej után kell írnunk egy begin…end
blokkba.
Két kivétel van, eljárást és függvényt
a törzs megadása nélkül két esetben definiálhatunk:
- Ha unitot írunk, mivel itt szétválik az interface
és az implementáció (egy fájlban, de két
külön részben). Az interface-ben csak a eljárás/függvény
definíciókat kell felsorolnunk.
- Mivel egy fájl fordítása során a fordító
csak a feldolgozás alatt lévő sor előtti definiciókat
látja, így szükséges lehet, hogy egy eljárást/függvényt
előrébb definiáljunk, mint ahol a törzsét
megvalósítjuk. Erre az előrehivatkozásra ad
lehetőséget a forward kulcsszó (lsd. példa
{3}).
A továbbiak illusztrálásához tekintsük
az alábbi példaprogramot (a kapcsos zárójelpárban
lévő számok megjegyzések a program szövegében):
procedure Csere (var a,b:integer); forward; {3}
function Legkisebb (var elemek {2}; elemszam:integer);
type
tomb = array [1..30000] of integer;
var
a : integer;
t : ^tomb;
begin
t:=addr(elemek); {4}
for a:=1 to elemszam-1 do
begin
c:=a;
for b:=a+1 to elemszam do if t[b]<t[c] then c:=b;
Csere(tomb(elemek)[a] {5},tomb(elemek)[c] {5});
end;
Legkisebb:=integer(elemek); {1}
end;
procedure Csere (var a,b:integer {2});
var c : integer;
begin
c:=a;
a:=b;
b:=c;
end;
A fenti program egy tetszőleges elemszámú és
indextartományú integer tömböt rendez beszúrásos
rendezéssel, majd visszaadja legkisebb elemét.
- {1} Függvény visszatérési értékét
függvénynév:=érték formában adhatjuk
meg.
- {2} Paraméterátadás történhet érték
és cím szerint. Cím szerinti paraméterátadásnál
az aktuális paraméternek csak a címe adódik
át (ez egy pointer). Ilyenkor nem kötelező megadnunk
a paraméter típusát, de akkor csak a paraméter
címére hivatkozhatunk, mivel típusa esetleges. A fenti
példában az elemek tömb kerül így átadásra,
mivel nyitott tömböket (open arrays) Turbo Pascalban csak a 7.0-ás
verziótól adhatunk át. Ezek után az így
átadott tömb elemeit kétféleképpen érhetjük
el: tipizált pointer ráállításával
{4} vagy típus rádefiniálásával {5}.
(Ez nem típuskényszerítés, mivel az elemek tömb nem
rendelkezik értékkel. Egy var a:word; b:integer; … b:=integer(a)-100;
sor lenne típuskényszerítés, ahol a-nak van
értéke, míg a b:=integer(addr(a)^); sor típus
rádefiniálás, mivel addr(a) pointer értéke
egy fizikai cím (a címe). Ezt akkor különösen
fontos megkülönböztetnünk, ha pl. a és b nem
ugyanannyi helyet foglal a memóriában.) A fenti példákban
természetesen semmi nem garantálja, hogy az elemek egy integer-ekből
álló tömb.
Alprogramokban definiálhatunk konstansokat, típusokat,
deklarálhatunk változókat. érdekesség,
hogy Pascalban lehetőség van alprogrammok egymásba
ágyazására, bár ez egy elég ritkán
alkalmazott technika.
Az alprogramok lokális változóikat és paramétereiket
a veremben (stack szegmens) helyezik el (szemben a globális változókkal,
melyek az adatszegmensre kerülnek), így ez meghatározza
az általuk igényelhető memória összméretét
(erre rekurzív programok írásánál nem
árt figyelni).