Eljárások és függvények. Modulok és külső egységek.
===== Paraméterek / Argumentumok =====
eljárás(formális_paraméter_lista)
függvény(formális_paraméter_lista) : visszatérési_típus
formális_paraméter_lista ---> paraméter_csoport_1; ... ; paraméter_csoport_n
//érték szerinti paraméterátadási mód
paraméter_csoport ---> azonosító_1, ... , azonosító_n : adattípus
//hivatkozás szerinti paraméterátadási mód
var paraméter_csoport ---> azonosító_1, ... , azonosító_n : adattípus
===== Láthatóság =====
Megkülönböztetünk **globális** és **lokális** láthatóságot.
{{:inf-prog-fszi:scope.gif?nolink|}}
* Az **A**, **B** és **C** **globális** változók látszanak mindenünnen
* Az **Alpha** eljárásban az **A** **globális** deklarációját a **lokális** deklaráció váltja fel
* A **Beta1** és a **Beta2** láthatják a **VCR**, **Betamax** és **cassette** változókat
* A **Beta1** nem látja a **FailureToo**, továbbá a **Beta2** nem látja a **Failure** deklarációját
* Az **Alpha**-n kívül egyik alprogram sem láthatja az **F** és a **G** deklarációit
* A **Beta** eljárás meghívhatja az **Alpha** és a **Beta** eljárásokat
* A **Beta2** függvény az összes alprogramot meghívhatja, beleértve saját magát is (a fő program nem alprogram).
Forrás: freepascal.org
===== Eljárások =====
procedure eljarasnev (parameterek);
{deklarációk}
begin
{eljárástörzs}
end;
===== Függvények =====
function fuggvenynev (parameterek) : fuggvény_típusa;
{deklarációk}
begin
{függvénytörzs}
fuggvenynev := utasitas; {függvény eredménye}
end;
Függvény meghívása kifejezésben
valtozo := fuggvenynev(parameterek);
===== Egységek / Unitok =====
Az egységek/unitok deklarálásának alapvető formátuma:
unit unit_nev;
interface
(* a unit publikusan hozzáférhető alprogramjai *)
implementation
(* az alprogramok megvalósítása, és, ha kell, akkor *)
(* csak a unit számára látható deklazációk *)
end.
Teljesebb formátuma az egységek/unitok deklarálásának:
unit unit_nev;
interface
implementation
initialization
(* az inicializáló kódokat *)
(* tartalmazó rész, amik *)
(* a unit betöltésekor *)
(* futnak le *)
finalization
(* a program futásának *)
(* befejezésekor lefutó *)
(* kódok *)
end.
Példa
A főprogram
program egysegek;
uses progkonyvtar;
var a:tomb;
begin
feltolt(a,n);
kiir(a,n);
readln;
end.
A programkönyvtár megvalósítva unitként.
unit progkonyvtar;
interface
const n=10;
type tomb=array[1..n]of integer;
procedure kiir(t:tomb; hossz:byte);
procedure feltolt(var t:tomb; hossz:byte);
implementation
procedure kiir(t:tomb; hossz:byte);
var i:integer;
begin
for i:=1 to hossz do
write(t[i]:3);
writeln;
end;
procedure feltolt(var t:tomb; hossz:byte);
var i:integer;
begin
randomize;
for i:=1 to hossz do
t[i]:=random(89)+10;
end;
begin
end.
===== Előre definiálás =====
Előre definiálni a ''forvard'' paranccsal tudunk.
procedure Később (paraméter lista); forward;
procedure Hamarabb (paraméter lista);
begin
...
Később (paraméter lista);
end;
...
procedure Később;
begin
...
Hamarabb (paraméter lista);
end;
===== A tomb_io.pas könyvtár =====
unit tomb_io;
interface
type tomb=array [1..20]of integer;
procedure beolvas(var t : tomb; var hossz: byte; nev: char );
procedure kiir(t : tomb; hossz: byte; nev: string );
function talal(t:tomb; hossz: byte; elem:integer):boolean;
implementation
procedure beolvas(var t : tomb; var hossz: byte; nev: char );
var i: integer;
begin
write('A(z) "', nev, '" tomb hossza: ');readln(hossz);
writeln('Kerem a(z) "', nev, '" tomb elemeit: ');
for i:=1 to hossz do
begin
write(nev, '[',i,'] = '); readln(t[i]);
end;
end;
procedure kiir(t : tomb; hossz: byte; nev: string );
var i: integer;
begin
write(nev+': ');
for i:=1 to hossz do
write(t[i]:3);
writeln;
end;
function talal(t: tomb; hossz: byte; elem:integer):boolean;
var i:integer;
begin
i:=1;
while (i<=hossz) and (t[i] <> elem) do
i:=i+1;
talal:=i<=hossz;
end;
begin
end.
===== A tomb_rend.pas könyvtár =====
unit tomb_rend;
interface
uses tomb_io;
procedure minimum_rendezes(var a:tomb; hossz:byte);
implementation
procedure minimum_rendezes(var a:tomb; hossz:byte);
var i,j, index, ertek : integer;
begin
for i:=1 to hossz-1 do
begin
index:=i;
ertek:=a[i];
for j:=i+1 to hossz do
if a[j]