CGOTO

Aus C64-Wiki
Zur Navigation springenZur Suche springen
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)