3. Rutiny: PROC a RETURN

Na čo to je

Program sa delí na menšie pomenované kusy – procedúry. Kus, ktorý sa opakuje, napíšeš raz a potom ho len voláš menom.

Ako sa to píše

Action!
PROC Meno()
  príkazy
RETURN
ČasťVýznam
PROCzačiatok procedúry
Menomeno, ktoré si zvolíš: začína písmenom, potom písmená, číslice a _
()zátvorky sú povinné, aj keď sú prázdne
RETURNkoniec procedúry: program sa vráti tam, odkiaľ ju zavolal

Procedúra sa volá tak, že napíšeš jej meno so zátvorkami: Meno().

Komentár začína bodkočiarkou a siaha do konca riadka. Môže stáť na vlastnom riadku aj za príkazom.

Celý program

Súbor examples/proc.act:

Action!
; Three routines. The program starts in the last one.

PROC Line()
  PrintE("--------------------")
RETURN

PROC Greet()
  PrintE("Good morning!")       ; a comment may follow a statement
RETURN

PROC Main()
  Line()
  Greet()
  Greet()
  Line()
RETURN

Preklad a spustenie

action26 proc.act --sim

Čo uvidíš

--------------------
Good morning!
Good morning!
--------------------

Ako to funguje

Program má tri procedúry: Line, Greet a Main.

Program začína v poslednej procedúre. To je pravidlo Action! – nezáleží na mene, ale na poradí. Tu je posledná Main, takže program začne v nej.

Main postupne zavolá Line(), dvakrát Greet() a znova Line(). Pri každom volaní program odskočí do volanej procedúry, vykoná jej príkazy a po RETURN pokračuje za volaním.

Keď RETURN vykoná posledná procedúra (tá, v ktorej program začal), program končí.

Procedúra musí byť napísaná skôr, než ju niekto zavolá. Prekladač číta súbor zhora nadol a meno, ktoré ešte nevidel, nepozná. Preto sú pomocné procedúry hore a Main dole.

Časté chyby

Čo sa staloČo povie prekladač
procedúra je napísaná až pod miestom, kde sa voláerror ACT008: undeclared name 'Greet'
chýbajú zátvorky pri PROC Mainerror ACT007: invalid argument list: expected '(' after the routine name
chýbajú zátvorky pri volaní (Greet namiesto Greet())error ACT010: illegal assignment: expected '=', '==' or '(' after 'Greet'
dve procedúry majú rovnaké menoerror ACT006: 'Greet' is already declared

Chýbajúci RETURN prekladač nehlási. Procedúra bez RETURN neskončí a program pokračuje príkazmi nasledujúcej procedúry, čo skoro nikdy nechceš. Keby v tomto programe chýbal RETURN za Greet, program by z Greet „prepadol“ do Main, tá by znova zavolala Greet – a Good morning! by sa vypisovalo donekonečna. Na konci každej procedúry preto píš RETURN.

Vyskúšaj si

  1. Pridaj procedúru Bye, ktorá vypíše Good night!, a zavolaj ju z Main pred poslednou čiarou.
  2. Presuň procedúru Main na začiatok súboru. Čo povie prekladač a prečo?
  3. Zavolaj Line() aj z procedúry Greet. Koľko čiar program vypíše?

Zhrnutie

Späť: 2. Prvý program · Ďalej: 4. Výpis