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
GOSUB číslo riadka
…
RETURN
| Slovo | Význam |
|---|---|
GOSUB n | zapamätaj si, kde si, a pokračuj riadkom n |
RETURN | vráť sa tam, odkiaľ ťa posledný GOSUB poslal – k príkazu hneď za ním |
POP | zabudni 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:
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 1000Ako to funguje
- Riadky 30 až 60 sú hlavný program. Je krátky a číta sa ako zoznam úloh.
- Riadky 1000 až 1040 sú podprogram, ktorý vypíše text z
T$a podčiarkne ho pomlčkami. Volá sa dvakrát, zakaždým s iným textom. - Ako podprogram dostane údaje: cez obyčajné premenné. Hlavný program pred volaním uloží text do
T$(alebo číslo doN) a podprogram si ho odtiaľ vezme. BASIC nemá „parametre“; všetky premenné sú spoločné pre celý program. - Riadok 70,
END, je tu nutný. Bez neho by program po riadku 60 pokračoval ďalej na riadok 1000, vbehol do podprogramu a jehoRETURNby sa nemal kam vrátiť.
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í:
1050 IF LIVES=0 THEN POP:GOTO 5000Je to zriedkavý príkaz; v dobových programoch ho občas stretneš.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
chýba END pred podprogramami | program do podprogramu „dobehne“ a skončí s ERROR- 16 AT LINE 1040 |
RETURN bez GOSUB | ERROR- 16 |
GOSUB na riadok, ktorý nie je | error B26012: line 1000 does not exist |
do podprogramu sa skočí cez GOTO | RETURN sa nemá kam vrátiť: ERROR- 16 |
| podprogram zmení premennú, ktorú používa volajúci | výpočet vyjde zle, bez hlásenia |
Vyskúšaj si
- Napíš podprogram, ktorý vypíše riadok z
Nhviezdičiek, a zavolaj ho pre 5, 10 a 15. - Pridaj do
gosub.abaspodprogram, ktorýT$vypíše v rámčeku z pomlčiek nad aj pod textom. - Zmaž riadok 70 a pozri, na ktorom riadku a s akou chybou program skončí.
Zhrnutie
GOSUB nzavolá podprogram na riadkun,RETURNsa vráti zaGOSUB.- Údaje sa podprogramu odovzdávajú v premenných; všetky premenné sú spoločné.
- Pred podprogramami musí byť
END(aleboGOTO), aby do nich program nevbehol. - Chyba 16 znamená
RETURN, ktorý sa nemá kam vrátiť.
Späť: 10. Slučka s počítadlom · Ďalej: 12. Výber z možností