Procedúry s parametrami majú štruktúru:
procedure menoproc (f1:typ,f2:typ ... fn:typ);
deklaračná časť
begin
príkazová časť
end;
Procedúra
bez parametrov a procedúra s parametrami sa líši hlavičkou procedúry. V
hlavičke procedúry s parametrami musia byť medzi zátvorkami uvedené formálne
parametre. V tejto časti sa špecifikuje počet parametrov a typ parametrov.
procedure
proc1 (A,B:real;
C,D:integer);
procedure proc2 (X,Y,Z:real;U,V:boolean;C:char);
Procedúra,
ktorá je deklarovaná v definičnej časti hlavného programu má definičný a
nie výkonný charakter. Preto sa môžu v deklarácii nachádzať napr. príkazy
priradenia, ktoré majú na pravej strane priradené premenné, a ešte im
neboli priradené hodnoty. Realizovateľnosť sa kontroluje až
v čase realizácie príkazu procedúry.
Procedúra
s parametrami je volaná (aktivovaná) menom procedúry, za ktorým
nasledujú v zátvorkách uvedené tzv. skutočné parametre. Pri volaní
procedúry sa formálne parametre nahradzujú skutočnými, t.j. takými
hodnotami, s ktorými bude procedúra pracovať. Skutočným parametrom môže
byť konštanta, premenná alebo výraz. Náhrada parametrov spočíva v tom, že
pri volaní procedúry sa najskôr vypočíta hodnota skutočného parametra a
uloží sa do formálneho parametra. S formálnym parametrom sa potom pracuje vo
vnútri procedúry. Pri náhrade formálnych parametrov musia platiť tieto
pravidlá:
počet
skutočných a formálnych parametrov musí byť rovnaký,
komunikácia
medzi každým formálnym a skutočným parametrom je určená pozíciou
typy
skutočných parametrov musia zodpovedať typom formálnych parametrov
Existujú dva spôsoby náhrady formálnych parametrov skutočnými:
náhrada
hodnotou
náhrada
referenciou alebo tiež náhrada odkazom
Pri
náhrade formálneho parametra skutočnou hodnotou sa hodnota určená skutočným
parametrom využíva v procedúre iba "pasívne", t.j. len na výpočet
iných hodnôt. Hodnota zastane mimo procedúry nezmenená. Formálny
parameter, nahradzovaný hodnotou, predstavuje v tele procedúry lokálnu
premennú platnú iba v tele procedúry. Preto sa parametre nahradzované
hodnotou využívajú len ako vstupné hodnoty procedúry. Pomocou nich môžeme
hodnoty do procedúry "prinášať", ale nie "vynášať".
Na "vynášanie" hodnôt získaných po ukončení procedúry používame
parametre nahradzované odkazom. Tieto parametre sú v procedúre využívané
"aktívne". Môžeme im priradiť hodnoty, ktoré sú platné
nielen v samotnej procedúre, ale aj mimo nej. Parametre
nahradzované odkazom reprezentujú výstupné hodnoty procedúry. Nahradzovať
odkazom je možno aj vstupné parametre, ale treba si uvedomiť, že v prípade
zmeny hodnoty skutočného parametra sa táto zmena prenesie aj mimo procedúry.
Ak sa vstupné parametre prenášajú hodnotou, potom sa hodnota skutočného
parametra realizáciou procedúry nemení.
Pomocou odovzdávania parametrov hodnotou nemôžu žiadne hodnoty z procedúry "vystúpiť". Všetky zmeny, ktoré sa s formálnym parametrom udejú, sa v skutočnosti pri ich volaní prevádzajú v pomocnej lokálnej premennej, ktorá v okamihu dokončenia procedúry zanikne. Výhodou prenášania parametrov hodnotou je, že skutočným parametrom môže byť aj výraz.
V
prípade nahrádzania parametrov odkazom sa hodnota skutočného
parametra nebude odovzdávať hodnotou, ale odkazom na ňu, t.j., odkaz na
adresu (jej miesta v pamäti), kde sa skutočný parameter nachádza. Teda skutočným
parametrom môže byť len premenná. Pri tomto spôsobe prenášania parametrov
sa v hlavičke procedúry pred parametrami volanými odkazom uvádza kľúčové
slovo var.
Treba
si dobre uvedomiť: pri prenášaní parametrov odkazom uvádzame skutočný
parameter ako premennú. Túto premennú reprezentuje formálny
parameter v procedúre. Všetky zmeny, ktoré robíme s formálnym parametrom,
sa prevádzajú aj so skutočným parametrom. Ak zmeníme v procedúre hodnotu
formálneho parametra, zmení sa tým aj hodnota skutočného parametra.
To je ten podstatný rozdiel medzi parametrom prenášaným hodnotou, pri ktorom
bol formálny parameter pomocnou vnútornou premennou procedúry a jeho
zmeny sa na skutočnom parametri nemohli prejaviť. Ďalší podstatný rozdiel
je v tom, že skutočným parametrom prenášaný odkazom nemôže byť výraz.
Príklady
hlavičiek procedúr:
procedure( X, y, Z: i nteger;A, B: real);
(náhrada všetkých parametrov hodnotou)
procedure(A,B:integer; var C,D:integer;X:char);
(parametre C,D sú nahradzované odkazom)
Parametre nahradzované odkazom majú charakter výstupných premenných z procedúry.