Procedury a funkce

Procedury a funkce tvoří posloupnosti instrukcí, které potřebujeme v programu provádět na různých souborech dat nebo na různých místech programu. Procedura nebo funkce může být po deklaraci použita kdekoli v následujícím textu bloku programu. Rozdíl mezi procedurou a funkcí je v tom, že funkce vrací hodnotu a může se použít přímo ve výrazech. Procedura se vyvolá příkazem volání procedury ke splnění jedné nebo více operací.

Procedury a funkce umožňují vnořovat přídavné bloky do hlavního programového bloku. Každá deklarace procedury nebo funkce má hlavičku, po které následuje blok příkazů. Procedura se aktivuje příkazem volání procedury, funkce se aktivuje vyhodnocením výrazu, který obsahuje její volání. Za identifikátorem procedury nebo funkce může následovat seznam parametrů, uzavřený v kulatých závorkách. Každý parametr v seznamu má své místo, kterému odpovídá příslušný typ.

Zdrojový text programu je ukončen tělem hlavního programu. Tělo hlavního programu se musí uvést vždy jako poslední. Mezi část deklarace proměnných a tělo hlavního programu lze vložit libovolné množství deklarací procedur a funkcí v jakémkoli pořadí. Musí se však dodržovat zásada, že cokoli použijeme, musí být deklarováno, jinak dojde k chybě během překladu.

Tělo deklarace procedury nebo funkce končí středníkem místo tečky u hlavního programu. Procedura nebo funkce může mít své vlastní interní datové typy, proměnné i své vlastní procedury a funkce. Veškeré prvky deklarované uvnitř procedury nebo funkce mají lokální charakter, tzn. lze je využít pouze uvnitř procedury nebo funkce, ve které jsou deklarovány. Deklarace, které jsou uvedeny v hlavním programu, mají globální charakter.

 

Deklarace procedury

procedure <jméno procedury> (formální parametry);                {hlavička procedury}

label <deklarace návěští>;
const <deklarace konstant>;
type <definice typů>;                                               {deklarační část}
var <deklarace proměnných>;
procedure; function;
<deklarace procedur a funckí>;

begin
<tělo procedury>;                                                {příkazová část}
end;

Deklarační část procedury se řídí stejnými pravidly jako hlavní program. Deklarace procedury přiřadí identifikátor k bloku kódu programu. Při vyvolání procedury se provedou příkazy, které jsou uvedeny v těle procedury. Pokud se v těle procedury vyskytne identifikátor vyvolané procedury, provádí se procedura rekurzivně.

Deklarace funkcí

Deklarace funkcí mají podobnou strukturu jako deklarace procedury, s tím rozdílem, že začínají hlavičkou funkce a končí datovým typem, který funkce vrací:

function <jméno funkce> (formální parametry):datový typ;

Funkce se aktivuje uvedením identifikátoru funkce při vyhodnocení výrazu, funkce se objeví jako operand výrazu. Když se výraz vyhodnotí, funkce se provede a hodnota operandu se stane hodnotou, kterou funkce vrací. V těle funkce jsou podobně jako u procedury definovány příkazy, které se mají provést po aktivaci funkce. Tělo funkce musí obsahovat příkaz přiřazení, který přiřazuje identifikátoru funkce hodnotu. Výsledkem funkce je pak poslední přiřazená hodnota. Pokud v těle funkce příkaz přiřazení neexistuje, funkce vrací nedefinovanou hodnotu.

Parametry procedur a funkcí

V hlavičce deklarace procedury nebo funkce můžeme definovat seznam formálních parametrů. Každý parametr deklarovaný v seznamu je lokální v deklarované proceduře nebo funkci. Uvnitř bloku procedury nebo funkce je možné se na něj odvolávat jeho identifikátorem. Typy parametrů:

Formální - ty se objevují v deklaraci procedury nebo funkce, jsou dvojího druhu:

Skutečné - jsou to parametry, které se uvádějí při volání procedury nebo funkce. Musí odpovídat svým datovým typem parametrům, definovaným v podprogramu a jejich počet musí být stejný s počtem, který jsme v podprogramu definovali.

Hodnotové parametry se v deklaraci uvádějí svým identifikátorem, následovaným definicí typu. Parametry, které mají stejný charakter a typ, se mohou uvádět v seznamu, oddělené čárkou. Pokud jsou v deklaraci procedury nebo funkce parametry různých typů a charakterů, jednotlivé typy se musí oddělit středníkem. Formální hodnotové parametry působí jako lokální proměnná v proceduře nebo funkci, s tím rozdílem, že dostávají počáteční hodnotu při aktivaci procedury nebo funkce. Změna formálního hodnotového parametru v těle procedury nebo funkce neovlivní hodnotu skutečného parametru při aktivaci procedury nebo funkce. Skutečný parametr, který odpovídá hodnotovému parametru v příkazu procedury nebo volání funkce, musí být výraz a jeho hodnota nesmí být typu soubor ani strukturovaný typ, který obsahuje typ soubor. Skutečný parametr musí být kompatibilní s formálním parametrem.

Proměnný parametr se používá tam, kde se musí předat hodnota z procedury nebo funkce zpět volající proceduře nebo funkci. Odpovídající skutečný parametr v příkazu procedury nebo volání funkce musí být odkazem na proměnnou. Formální proměnný parametr reprezentuje v průběhu aktivace procedury nebo funkce skutečnou proměnnou. Jakákoli změna hodnoty proměnného formálního parametru se promítne na skutečný parametr volající procedury. Typ skutečného parametru musí být identický s typem formálního proměnného parametru. Jako proměnné parametry lze předávat typ soubor.

procedure vstup(X,Y:integer); {procedura s formálními hodnotovými parametry}

procedure vstup(var X,Y:integer); {procedura s formálními proměnnými parametry}

 

Příklad volání funkce

Volání funkce se objeví na pravé straně přiřazovacího příkazu. Její volání se může umísti přímo v příkazu výstpu dat.

Deklarace: function test (X,Y:word; T:boolean):word;

Volání: a:=test (10,15,true);

Proměnná "a" musí být typu word (nebo proměnná s tímto typem kompatibilní).

Standardní funkce: SQR, SQRT, ABS...

 

Příklad volání procedury

Při volání procedury uvedeme její identifikátor a parametry. Do příkazu výstupu dat se procedura nedává.

Deklarace procedury s hodnotovými parametry:

procedure test (X,Y:word; T:boolean); {formální parametry}

Volání: test (10,15,true); {skutečné parametry}

test (A,B,C); {skutečné parametry}

Proměnné A,B musí být typu word (nebo s tímto typem kompatibilní) a C typu boolean.

Procedura neovlivní hodnoty A,B a C

 

Deklarace procedury s proměnnými parametry:

procedure test (var X,Y:word; T:boolean); {formální parametry}

Volání: test (A,B,C); {skutečné parametry}

Proměnné A,B musí být typu word (nebo s tímto typem kompatibilní) a C typu boolean.

Procedura ovlivní hodnoty A,B a C.

Při volání procedury s proměnnými parametry musí být skutečným parametrem proměnná.

 

Standardní procedury: WRITE, WRITELN, READ, READLN, CLRSCR...