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

Turbo Basic XL
PROC meno
  príkazy
ENDPROC

EXEC meno
SlovoVýznam
PROC menozačiatok procedúry; musí byť prvým príkazom na riadku
ENDPROCkoniec procedúry: vráť sa za EXEC, ktorý ju zavolal
EXEC menozavolaj procedúru (ako GOSUB)

Návestia:

ZápisVýznam
# menonávestie: pomenované miesto v programe; musí byť prvým príkazom na riadku
GO# menoskoč na návestie (ako GOTO)
TRAP #menopri chybe skoč na návestie
RESTORE #menočítaj DATA od návestia
ON X EXEC a,b,cpodľa hodnoty zavolaj jednu z procedúr
ON X GO# a,b,cpodľ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:

Turbo Basic XL
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 ENDPROC

Preklad a spustenie

Basic26 proc.tbas --sim

Čo uvidíš

First
-----
Second title
------------
3 squared is 9, cubed 27
Done

Ako to funguje

Druhý program: ponuka

Súbor examples/menu.tbas spája všetko z tejto kapitoly so slučkou DO:

Turbo Basic XL
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,fox
Basic26 menu.tbas --sim --sim-input menu.in

Sú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

Časté chyby

Čo sa staloČo sa stane
EXEC alebo GO# na meno, ktoré nie jeerror B26028: there is no PROC or #NOPE in this program
PROC nie je prvý na riadkuerror B26017: PROC has to be the first statement on its line
chýba END pred procedúramiprogram do procedúry vbehne a skončí chybou na jej ENDPROC
dve procedúry alebo návestia s rovnakým menomplatí prvé; prekladač upozorní (B26046)
GO# 30 s číslomerror B26017: GO# needs a name – na číslo riadka je GOTO
procedúra zmení premennú volajúcehoako pri GOSUB: premenné sú spoločné

Vyskúšaj si

  1. Pridaj do ponuky tretiu skupinu slov a posuň Quit na štvorku.
  2. Napíš procedúru WAIT_KEY, ktorá vypíše Press a key a počká na kláves (kapitola 22).
  3. Prepíš gosub.abas a on.abas tak, aby v nich neostalo žiadne GOSUB ani GOTO.

Zhrnutie

Späť: 29. Slučka bez konca · Ďalej: 31. Celé čísla a bity