Procedure

Procedury dovolují vkládat do hlavního programového bloku další bloky, které neumožňují vracet hodnoty. Každá deklarace procedury má záhlaví, za nímž následuje blok. Procedura se volá příkazem Call a jménem procedury.

Příklad:

Call Test

V rámci procedury lze používat lokální proměnné dimenzované podobně jako v záhlaví makra. Tělo procedury se ukončuje klíčovým slovem EndProc. Uvnitř těla procedury ji lze předčasně ukončit příkazem Return .

V bloku procedury lze psát další  procedury a funkce.

Záhlaví procedury ji dává jméno a určuje případné formální parametry.

Příklad:

procedure Test ( A : Word;
                 B : Byte;
                 S : String[60])

Při volání procedury je jí možno předávat parametry.

Příklad:

Call Test (A, B, S)

Parametry předávané hodnotou

Formální parametr předávaný hodnotou má postavení lokální proměnné příslušné procedury, ovšem s tím rozdílem, že má od začátku bloku definovanou hodnotu. Tuto hodnotu získal při volání procedury zkopírováním hodnoty skutečného parametru. Změna hodnoty formálního parametru přeadávaného hodnotou se nijak neprojeví na hodnotě parametru skutečného. Typ skutečného parametru musí být typově kompatibilní vzhledem k přiřazení s typem formálního parametru. Parametr předávaný hodnotou nesmí být pole.

Parametry předávané odkazem

Tyto parametry se používají zejména v případech, kdy je nazbytné předat z procedury určitou hodnotu do místa volání skutečnému parametru. Odpovídající skutečný parametr musí být vždy proměnná. Formální parametr v tomto případě představuje v celém bloku procedury skutečnou proměnnou a jakékoli změny jeho hodnoty se okamžitě promítají do hodnoty této proměnné, předané jako skutečný parametr. Uvnitř procedury představuje tedy jakýkoli odkaz na formální dim parametr přístup k proměnné. Parametr předávaný odkazem může být pole.

Příklad:

dim Arr (10) : Word
procedure P1 (dim W : Word)
...
endproc
Call P1(Arr)

Parametr předávaný odkazem nesmí být položkou z věty interní databáze.

Příklad:

Call Test(Bnk[dbIdent]) { Špatně !! }

Parametr předávaný odkazem nemůže být jeden prvek pole, protože procedura bude tento formální parametr chápat jako první prvek pole.

Příklad:

dim Arr (10) : Word
procedure P1 (dim W : Word)
...
endproc
Call P1(Arr[3]) { Špatně !! }

Návěsti

V rámci procedur lze používat "lokálních návěstí". V uvedeném příkladu je návěst L1 použita v proceduře P1 i mimo ni. Zavolá-li se L1 uvnitř procedury, bude volána lokální návěst. Zavolá-li se L1 vně procedury nebo z jiné procedury, bude volána L1 globální. Návěst L1 uvnitř procedury P1 lze mimo procedury P1 volat: gosub P1.L1.

Příklad:

procedure P1 (dim W : Word)
  gosub L1
  return
  L1: -- lokální návěst --
  ...
  return
endproc
L1: -- globální návěst --
...
return

Poznámky

Příklad:

procedure Test;
  dim W : Word;
  ...
endproc
...
PrintUp(Test.W)
...

Procedury NEJSOU reentrantní. To znamená, že volání procedury ze sebe sama použije stejné parametry a lokální proměnné.

Narazí-li makro při svém chodu na deklaraci procedury, skočí až za její EndProc.

Podívejte se na: Příkazy