14. Parametre: procedúra, ktorá dostane údaje

Na čo to je

Procedúra Line z kapitoly 3 vedela nakresliť čiaru len jednej dĺžky. S parametrom jej pri každom volaní povieš, akú dlhú. Jedna procedúra tak zvládne veľa podobných úloh.

Ako sa to píše

Deklarácia:

Action!
PROC Meno(TYP parameter, parameter, TYP parameter)

Volanie:

Action!
Meno(hodnota, hodnota, hodnota)

Celý program

Súbor examples/params.act:

Action!
; Procedures with parameters

PROC Stars(BYTE count)
  BYTE i

  FOR i=1 TO count
  DO
    Put('*)
  OD
  PutE()
RETURN

PROC Box(BYTE width, height, CHAR c)
  BYTE x, y

  FOR y=1 TO height
  DO
    FOR x=1 TO width
    DO
      Put(c)
    OD
    PutE()
  OD
RETURN

PROC Change(BYTE value)
  value=99                   ; changes only the copy
RETURN

PROC Main()
  BYTE n

  Stars(5)
  Stars(12)

  n=3
  Stars(n*2)
  PutE()

  Box(8, 3, '#)
  PutE()

  Change(n)
  Print("n is still ")
  PrintBE(n)
RETURN

Preklad a spustenie

action26 params.act --sim

Čo uvidíš

*****
************
******

########
########
########

n is still 3

Ako to funguje

Procedúra dostane kópiu

Change(n) odovzdá procedúre hodnotu premennej n, nie premennú samotnú. Parameter value je vlastná premenná procedúry, do ktorej sa trojka skopíruje. Keď ju procedúra prepíše na 99, n v Main sa nezmení.

Ak má procedúra zmeniť premennú volajúceho, treba jej odovzdať adresu premennej – to je téma kapitoly 20. Častejšie stačí, aby rutina výsledok vrátila; to vie funkcia z nasledujúcej kapitoly.

Časté chyby

Čo sa staloČo povie prekladač alebo program
viac argumentov ako parametroverror ACT007: invalid argument list: 'Stars' takes 1 argument(s), got 2
menej argumentov ako parametrovprekladač mlčí; chýbajúce parametre dostanú 0
argument sa do typu parametra nezmestí (Stars(300))warning ACT215; odovzdá sa 44
argumenty v zlom poradíprekladač mlčí – všetky sú čísla

Menej argumentov Action! dovoľuje a niektoré staršie programy to využívajú. Ak chceš, aby ťa prekladač na to upozornil, pridaj voľbu --wextra:

action26 params.act --wextra

Potom pri Stars() vypíše warning ACT213: 'Stars' takes 1 argument(s), got 0.

Vyskúšaj si

  1. Pridaj procedúre Stars druhý parameter – znak, ktorý sa má vypisovať.
  2. Napíš procedúru Triangle(BYTE size), ktorá vypíše trojuholník z hviezdičiek s daným počtom riadkov. Môže volať Stars.
  3. Zavolaj Box(3, 8, 'O) a potom Box('O, 3, 8). Prečo druhé volanie vypíše niečo celkom iné?

Zhrnutie

Späť: 13. Slučka s počítadlom · Ďalej: 15. Funkcie