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:
PROC Meno(TYP parameter, parameter, TYP parameter)Volanie:
Meno(hodnota, hodnota, hodnota)- Parametre sa deklarujú v zátvorkách rovnako ako premenné: typ a meno. Viac parametrov toho istého typu stačí oddeliť čiarkou –
BYTE width, height. - Pri volaní dáš do zátvoriek argumenty: čísla, premenné alebo celé výrazy. Prvý argument ide do prvého parametra, druhý do druhého a tak ďalej.
- Vnútri procedúry sa parameter používa ako obyčajná premenná.
- Procedúra môže mať najviac 8 parametrov.
Celý program
Súbor examples/params.act:
; 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)
RETURNPreklad a spustenie
action26 params.act --simČo uvidíš
*****
************
******
########
########
########
n is still 3Ako to funguje
Stars(5)zavolá procedúru a do parametracountuloží 5. Slučka potom vypíše päť hviezdičiek.Stars(n*2)ukazuje, že argument môže byť výraz. Najprv sa vypočíta (3 × 2 = 6) a výsledok sa odovzdá.Box(8, 3, '#)má tri argumenty pre tri parametre: šírku, výšku a znak.- Premenná
ivStarsax,yvBoxsú deklarované vnútri procedúry. Patria len jej – viac v kapitole 16.
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 parametrov | error ACT007: invalid argument list: 'Stars' takes 1 argument(s), got 2 |
| menej argumentov ako parametrov | prekladač 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 --wextraPotom pri Stars() vypíše warning ACT213: 'Stars' takes 1 argument(s), got 0.
Vyskúšaj si
- Pridaj procedúre
Starsdruhý parameter – znak, ktorý sa má vypisovať. - Napíš procedúru
Triangle(BYTE size), ktorá vypíše trojuholník z hviezdičiek s daným počtom riadkov. Môže volaťStars. - Zavolaj
Box(3, 8, 'O)a potomBox('O, 3, 8). Prečo druhé volanie vypíše niečo celkom iné?
Zhrnutie
- Parametre sa deklarujú v zátvorkách za menom procedúry, s typom.
- Pri volaní sa argumenty priraďujú parametrom podľa poradia.
- Argument môže byť číslo, premenná aj výraz.
- Procedúra pracuje s kópiou – premennú volajúceho nezmení.
- Počet argumentov prekladač kontroluje len nahor;
--wextraupozorní aj na chýbajúce.
Späť: 13. Slučka s počítadlom · Ďalej: 15. Funkcie