30. Procedúry a návestia: PROC, ENDPROC, EXEC, #MENO, GO#
Na čo to je
GOSUB 1000 nehovorí, čo sa na riadku 1000 deje. V Turbo-BASICu XL môže mať podprogram meno – volá sa EXEC UNDERLINE a hneď je jasné, čo robí. Rovnako môže mať meno aj cieľ skoku: namiesto GOTO 500 je GO# FINISH.
Ako sa to píše
PROC meno
príkazy
ENDPROC
EXEC meno| Slovo | Význam |
|---|---|
PROC meno | začiatok procedúry; musí byť prvým príkazom na riadku |
ENDPROC | koniec procedúry: vráť sa za EXEC, ktorý ju zavolal |
EXEC meno | zavolaj procedúru (ako GOSUB) |
Návestia:
| Zápis | Význam |
|---|---|
# meno | návestie: pomenované miesto v programe; musí byť prvým príkazom na riadku |
GO# meno | skoč na návestie (ako GOTO) |
TRAP #meno | pri chybe skoč na návestie |
RESTORE #meno | čítaj DATA od návestia |
ON X EXEC a,b,c | podľa hodnoty zavolaj jednu z procedúr |
ON X GO# a,b,c | podľa hodnoty skoč na jedno z návestí |
Mená procedúr a návestí sú samostatné – nepletú sa s premennými.
Celý program
Súbor examples/proc.tbas je program z kapitoly 11 prepísaný s menami:
10 REM PROC: subroutines with names
20 DIM T$(30)
30 T$="First":EXEC UNDERLINE
40 T$="Second title":EXEC UNDERLINE
50 N=3:EXEC POWERS
60 GO# FINISH
70 PRINT "Skipped"
80 # FINISH
90 PRINT "Done"
100 END
1000 PROC UNDERLINE
1010 PRINT T$
1020 FOR I=1 TO LEN(T$):PRINT "-";:NEXT I
1030 PRINT
1040 ENDPROC
2000 PROC POWERS
2010 PRINT N;" squared is ";N*N;", cubed ";N^3
2020 ENDPROCPreklad a spustenie
Basic26 proc.tbas --simČo uvidíš
First
-----
Second title
------------
3 squared is 9, cubed 27
DoneAko to funguje
- Riadky 30 až 50:
EXECzavolá procedúru menom. Údaje sa jej stále odovzdávajú v premenných (T$,N) – procedúry Turbo-BASICu XL nemajú parametre a všetky premenné sú spoločné, tak ako priGOSUB. - Riadok 60:
GO# FINISHpreskočí riadok 70. - Riadok 80: návestie. Medzi
#a menom môže byť medzera. - Riadok 100:
ENDje aj tu nutný, aby program nevbehol do procedúr pod ním. - Riadky 1000 až 1040: telo procedúry. Čísla riadkov sú tu už len kvôli BASICu – nikto sa na ne neodvoláva.
Druhý program: ponuka
Súbor examples/menu.tbas spája všetko z tejto kapitoly so slučkou DO:
10 REM A menu with ON ... EXEC, TRAP # and RESTORE #
20 DIM W$(10)
30 DO
40 TRAP #OOPS
50 INPUT "1 Colours 2 Animals 3 Quit: ",C
60 IF C=3 THEN EXIT
70 ON C EXEC COLOURS,ANIMALS
80 LOOP
90 PRINT "Bye"
100 END
200 # OOPS
210 PRINT "Error ";ERR;" at line ";ERL
220 GOTO 30
1000 PROC COLOURS
1010 RESTORE #CDATA
1020 EXEC THREE
1030 ENDPROC
2000 PROC ANIMALS
2010 RESTORE #ADATA
2020 EXEC THREE
2030 ENDPROC
3000 PROC THREE
3010 FOR I=1 TO 3:READ W$:PRINT W$;" ";:NEXT I
3020 PRINT
3030 ENDPROC
4000 # CDATA
4010 DATA red,green,blue
5000 # ADATA
5010 DATA cat,dog,foxBasic26 menu.tbas --sim --sim-input menu.inSúbor examples/menu.in odpovie 2, 1, x a 3:
1 Colours 2 Animals 3 Quit: 2
cat dog fox
1 Colours 2 Animals 3 Quit: 1
red green blue
1 Colours 2 Animals 3 Quit: x
Error 8 at line 50
1 Colours 2 Animals 3 Quit: 3
Bye- Riadok 70:
ON C EXECzavolá prvú alebo druhú procedúru zo zoznamu. - Riadok 40: pasca na návestie. Odpoveď
xnie je číslo, program skočí na# OOPS.ERRaERLsú číslo chyby a riadok – pohodlnejšie nežPEEK(195)(kapitola 38). - Riadky 1010 a 2010:
RESTORE #CDATAnastaví čítanie naDATAza návestím. ProcedúraTHREEpotom číta tri slová a nevie ani nemusí vedieť, ktoré. - Riadok 1020: procedúra môže volať inú procedúru.
Časté chyby
| Čo sa stalo | Čo sa stane |
|---|---|
EXEC alebo GO# na meno, ktoré nie je | error B26028: there is no PROC or #NOPE in this program |
PROC nie je prvý na riadku | error B26017: PROC has to be the first statement on its line |
chýba END pred procedúrami | program do procedúry vbehne a skončí chybou na jej ENDPROC |
| dve procedúry alebo návestia s rovnakým menom | platí prvé; prekladač upozorní (B26046) |
GO# 30 s číslom | error B26017: GO# needs a name – na číslo riadka je GOTO |
| procedúra zmení premennú volajúceho | ako pri GOSUB: premenné sú spoločné |
Vyskúšaj si
- Pridaj do ponuky tretiu skupinu slov a posuň
Quitna štvorku. - Napíš procedúru
WAIT_KEY, ktorá vypíšePress a keya počká na kláves (kapitola 22). - Prepíš
gosub.abasaon.abastak, aby v nich neostalo žiadneGOSUBaniGOTO.
Zhrnutie
PROC meno … ENDPROCje podprogram s menom,EXEC menoho zavolá.# menoje návestie,GO# menonaň skočí; mená berú ajTRAPaRESTORE.ON X EXEC …aON X GO# …vyberajú podľa čísla.- Parametre nie sú; údaje idú cez spoločné premenné.
Späť: 29. Slučka bez konca · Ďalej: 31. Celé čísla a bity