Procedúry

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. Príklady hlavičiek procedúr s parametrami:

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á:

  Existujú dva spôsoby náhrady formálnych parametrov skutočnými:

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

 

návrat