CGOTO
CGOTO | |
Syntax: | CGOTO <ausdruck> |
Parameter | |
ausdruck: numerischer Ausdruck | |
Einordnung | |
Typ: | Anweisung |
Kontext: | Strukturkontrolle |
Aufgabe: | Berechnetes GOTO |
Abkürzung: | keine |
Token: | $64 $25 (100 37) |
Verwandte Befehle | |
EXEC - CALL - ON |
Dieser Artikel beschreibt das Simons'-Basic-Schlüsselwort CGOTO.
Typ: Anweisung Syntax: CGOTO <ausdruck>
CGOTO ist ein Befehl, der lange Sprungtabellen hinter dem BASIC-Befehl ON ersetzt. Statt die Sprungziele wie bei ON vorzugeben und dann durch Angabe der Platznummer des gewünschten Ziels aufzurufen, kann hinter CGOTO ohne größerem Tippaufwand sofort die gewünschte Zeilennummer des Ziels durch eine Berechnung ermittelt werden.
Die Verwendung von CGOTO setzt voraus, dass beim Programmieren die Zeilen so angeordnet sind, dass für den Algorithmus <ausdruck> hinter CGOTO diese Zeilen auch erreichbar bleiben. Existiert die berechnete Zeile nicht, kommt es zum Fehler ?UNDEF'D STATEMENT ERROR. Der Ausdruck muss einen Wert im Bereich von 0 bis 65535 ergeben (auch wenn die maximal existierende Zeilennummer 63999 sein kann), was andernfalls mit einem Fehler ?ILLEGAL QUANTITY ERROR geahndet wird. Fehlt einer der Parameter gänzlich, kommt es zum ?SYNTAX ERROR, ist der Wert nicht numerisch, folgt ein ?TYPE MISMATCH ERROR.
Alles, was nach dem Ausdruck im Rest der Zeile vorkommt und von der Ausdrucksauswertung nicht als dem Ausdruck zugehörig angesehen wird, ignoriert der Befehl (wirkt wie ein Kommentar ohne explizites REM).
Leider gibt es kein entsprechendes CGOSUB. Da Simons' Basic ohnehin darauf ausgerichtet ist, ohne Zeilennummern auszukommen (siehe EXEC und PROC), stellt sich der Nutzen von CGOTO als eher zweifelhaft dar.
Beachten: Nach einem RENUMBER muss der Algorithmus hinter CGOTO angepasst werden, sonst funktioniert das Programm nicht mehr (wenn er sich anpassen lässt!)
Beispiele[Bearbeiten | Quelltext bearbeiten]
Beispiel 1:
... 50 i4=1: GOSUB 1500: IF ri=0 THEN 50 60 IF ri=1 THEN GOSUB 1300: i7=i7+1: i8=1: i4=2: IF i7>mn THEN i7=1 70 IF ri=2 THEN GOSUB 1300: i7=i7-1: i8=1: i4=2: IF i7=0 THEN i7=mn 80 IF ri=3 THEN i8=i8+1: IF i8>ho THEN i8=1 90 IF ri=4 THEN i8=i8-1: IF i8=0 THEN i8=ho 100 IF ri=5 THEN i6=br: GOSUB 1300: GOSUB 1700: GOSUB 2000: zl=1: br=i6: GOTO 30 110 ON i4 GOSUB 1610, 1600: GOTO 50 999 END ...
Dies ist eine Menü-Navigationskontrolle. In Zeile 50 werden die Pfeiltasten abgefragt, die Routine liefert in RI die angesteuerte Richtung zurück. In Zeilen 60 bis 90 wird darauf reagiert. Die Variable I4 steuert dabei das Öffnen eines der beiden Menükästen in den Zeilen 1600 und 1610 (Zeile 110 nach ON). Zeile 100 ist die Reaktion auf die <RETURN>-Taste. Im Folgenden eine CGOTO-Version davon: )
... 110 CGOTO (i4-1)*10+1600 ... 1620 GOTO 50
Diese Änderung hätte die gleiche Wirkung, ist aber kürzer. Eine echte CGOTO-Version hätte in I4 bereits die Zeilennummernschrittweite vorgesehen und wäre dadurch noch kürzer (CGOTO 1600+I4).)
Beispiel 2:
Im folgenden Menü-Beispiel wird für CGOTO ein Ausdruck benutzt, der nur noch vom Zeilenabstand "SW" abhängt, indem (in Zeile 500) die aktuelle Zeilennummer "LN" der CGOTO-Zeile aus den Zeropage-Adressen 57/58 eingelesen wird. Dies hat einen Vorteil beim Umnummerieren per RENUMBER, denn man muss jetzt nur die Variable SW der RENUMBER-Schrittweite anpassen.
100 DEF FN DK(X)=PEEK(X)+256*PEEK(X+1) 110 : 400 PROC MENUE 410 PRINT CHR$(147) 420 PRINT "1-AUSWAHL 1" 430 PRINT "2-AUSWAHL 2" 440 PRINT "3-AUSWAHL 3" 450 PRINT "4-AUSWAHL 4" 460 PRINT "X-BEENDEN":PRINT 480 PRINT"AUSWAHL: ";: FETCH "1234X",1,A$ 490 I=VAL(A$): PRINT: PRINT 500 SW=10: LN=FN DK(57): CGOTO LN+SW*(I+1) 510 PRINT "FERTIG":END 520 PRINT "1.": CALL WARTE 530 PRINT "2.": CALL WARTE 540 PRINT "3.": CALL WARTE 550 PRINT "4.": CALL WARTE 560 PRINT "5.": CALL WARTE 570 : 1000 PROC WARTE 1010 POKE 198,0: WAIT 198,255 1020 CALL MENUE
In TSB kann man sich die Zeilen 100-110 sparen und in Zeile 500 die (in Version 2.20605 neue) Funktion D!PEEK anwenden:
500 SW=10: LN= D!PEEK(57): CGOTO LN+SW*(I+1)
$ | % | @ | ANGL | ARC | AT | AUTO | BCKGNDS | BFLASH | BLOCK | CALL | CENTRE | CGOTO | CHAR | CHECK | CIRCLE | CMOB | COLD | COLOUR | COPY | CSET | DELAY | DESIGN | DETECT | DIR | DISABLE | DISAPA | DISK | DISPLAY | DIV | DOWN | DRAW | DUMP | DUP | ELSE | END LOOP | END PROC | ENVELOPE | ERRLN | ERRN | EXEC | EXIT | EXOR | FCHR | FCOL | FETCH | FILL | FIND | FLASH | FRAC | GLOBAL | GRAPHICS | HI COL | HIRES | HRDCPY | INKEY | INSERT | INST | INV | JOY | KEY | LEFT | LIN | LINE | LOCAL | LOOP | LOW COL | MEM | MERGE | MMOB | MOB OFF | MOB SET | MOD | MOVE | MULTI | MUSIC | NO ERROR | NRM | OFF | OLD | ON ERROR | ON KEY | OPTION | OUT | PAGE | PAINT | PAUSE | PENX | PENY | PLACE | PLAY | PLOT | POT | PROC | RCOMP | REC | RENUMBER | REPEAT | RESET | RESUME | RETRACE | RIGHT | RLOCMOB | ROT | SCRLD | SCRSV | SECURE | SOUND | TEST | TEXT | TRACE | UNTIL | UP | USE | VOL | WAVE