11. Podprogramy: GOSUB, RETURN, POP

Na čo to je

Keď program potrebuje tú istú vec na viacerých miestach – podčiarknuť nadpis, počkať na kláves, nakresliť panáčika –, nemusí ju písať zakaždým znova. Napíše ju raz ako podprogram a z rôznych miest ju volá.

Ako sa to píše

Atari BASIC
GOSUB číslo riadka
…
RETURN
SlovoVýznam
GOSUB nzapamätaj si, kde si, a pokračuj riadkom n
RETURNvráť sa tam, odkiaľ ťa posledný GOSUB poslal – k príkazu hneď za ním
POPzabudni posledný GOSUB bez návratu

GOSUB je GOTO s pamäťou. Rozdiel je práve v tom návrate: podprogram nemusí vedieť, kto ho zavolal.

Celý program

Súbor examples/gosub.abas:

Atari BASIC
10 REM GOSUB: a piece of program with a way back
20 DIM T$(30)
30 T$="First":GOSUB 1000
40 T$="Second title":GOSUB 1000
50 N=3:GOSUB 2000
60 N=10:GOSUB 2000
70 END
1000 REM Print T$ underlined
1010 PRINT T$
1020 FOR I=1 TO LEN(T$):PRINT "-";:NEXT I
1030 PRINT
1040 RETURN
2000 REM Print the square and the cube of N
2010 PRINT N;" squared is ";N*N;", cubed ";N*N*N
2020 RETURN

Preklad a spustenie

Basic26 gosub.abas --sim

Čo uvidíš

First
-----
Second title
------------
3 squared is 9, cubed 27
10 squared is 100, cubed 1000

Ako to funguje

Zvykom je dávať podprogramy na vysoké čísla riadkov (1000, 2000 …) a každý začať komentárom, čo robí a ktoré premenné číta.

Podprogram môže volať ďalší podprogram. Návraty sa pamätajú v poradí – každý RETURN sa vráti k tomu GOSUB, ktorý bol posledný.

Pozor na spoločné premenné

Podprogram na riadku 1000 používa počítadlo I. Keby hlavný program volal GOSUB 1000 z vnútra vlastnej slučky FOR I=…, podprogram by mu počítadlo prepísal. Pomôcť si musíš sám: podprogramy nech používajú iné mená premenných než hlavný program.

POP

Niekedy sa z podprogramu nechceš vrátiť – napríklad hráč v ňom prehral a program má skočiť rovno na koniec hry. Obyčajný GOTO z podprogramu by nechal zapamätaný návrat „visieť“. POP ho zahodí:

Atari BASIC
1050 IF LIVES=0 THEN POP:GOTO 5000

Je to zriedkavý príkaz; v dobových programoch ho občas stretneš.

Časté chyby

Čo sa staloČo sa stane
chýba END pred podprogramamiprogram do podprogramu „dobehne“ a skončí s ERROR- 16 AT LINE 1040
RETURN bez GOSUBERROR- 16
GOSUB na riadok, ktorý nie jeerror B26012: line 1000 does not exist
do podprogramu sa skočí cez GOTORETURN sa nemá kam vrátiť: ERROR- 16
podprogram zmení premennú, ktorú používa volajúcivýpočet vyjde zle, bez hlásenia

Vyskúšaj si

  1. Napíš podprogram, ktorý vypíše riadok z N hviezdičiek, a zavolaj ho pre 5, 10 a 15.
  2. Pridaj do gosub.abas podprogram, ktorý T$ vypíše v rámčeku z pomlčiek nad aj pod textom.
  3. Zmaž riadok 70 a pozri, na ktorom riadku a s akou chybou program skončí.

Zhrnutie

Späť: 10. Slučka s počítadlom · Ďalej: 12. Výber z možností