Kurs starten

**** ?SYNTAX ERROR ****

BASIC-Fehlermeldungen verstehen

Der C64 meldet Fehler in zwei knappen Wörtern und schweigt dann. Diese Seite übersetzt jede Meldung: was sie bedeutet, warum sie auftritt und wie du sie loswirst.

Jedes Beispiel hier löst die genannte Meldung wirklich aus. Du kannst es abtippen, um den Fehler einmal bewusst zu sehen, statt ihn nur zu lesen.

Schnell nachschlagen

MeldungBedeutet
?SYNTAX ERRORBASIC hat die Zeile nicht verstanden.
?TYPE MISMATCH ERRORText und Zahl wurden vermischt.
?DIVISION BY ZERO ERROREs wurde durch null geteilt.
?ILLEGAL QUANTITY ERROREin Wert liegt ausserhalb des erlaubten Bereichs.
?OUT OF DATA ERRORREAD wollte lesen, aber es sind keine DATA-Werte mehr übrig.
?NEXT WITHOUT FOR ERROREin NEXT steht da, ohne dass eine passende Schleife offen ist.
?RETURN WITHOUT GOSUB ERROREin RETURN wurde erreicht, ohne dass vorher ein GOSUB gesprungen ist.
?UNDEF’D STATEMENT ERRORDas Sprungziel gibt es nicht.
?UNDEF’D FUNCTION ERROREine mit FN aufgerufene Funktion wurde nie definiert.
?BAD SUBSCRIPT ERRORDer Zugriff auf ein Feld liegt ausserhalb seiner Grösse.
?CAN’T CONTINUE ERRORCONT konnte das Programm nicht fortsetzen.
?TOO MANY STEPS ERRORDas Programm lief sehr lange, ohne fertig zu werden.

Die Grundregel

BASIC prüft eine Zeile erst, wenn sie an die Reihe kommt. Ein Tippfehler in Zeile 200 fällt also erst auf, wenn das Programm dort ankommt. Deshalb gilt: Die genannte Zeile ist fast immer der richtige Ort zum Suchen, und eine Zeile lässt sich jederzeit reparieren, indem du sie mit derselben Nummer neu eintippst.

Tauchen in den Erklärungen unbekannte Begriffe auf, hilft das Glossar weiter.

?SYNTAX ERROR

BASIC hat die Zeile nicht verstanden.

Häufige Ursachen:

  • Ein Befehl ist falsch geschrieben, etwa PRNT statt PRINT.
  • Ein Anführungszeichen oder eine Klammer fehlt.
  • Ein Komma oder Strichpunkt steht an der falschen Stelle.
  • Ein Befehl wurde benutzt, den dieser Nachbau nicht kennt.

Tippe die gemeldete Zeile noch einmal komplett neu ein. Bei längeren Zeilen hilft es, sie in zwei kürzere aufzuteilen, dann ist schneller klar, welcher Teil klemmt.

Loest genau diesen Fehler aus 10 PRNT "HALLO"

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?SYNTAX ERROR.

?TYPE MISMATCH ERROR

Text und Zahl wurden vermischt.

Häufige Ursachen:

  • Eine Zahl wurde einer Textvariablen zugewiesen oder umgekehrt.
  • In einem Vergleich stehen Text und Zahl gegenüber, etwa IF A$=5.
  • Mit Text wurde gerechnet: A$-1 ergibt keinen Sinn.

Achte auf das Dollarzeichen: A speichert Zahlen, A$ speichert Text. Umwandeln kannst du mit VAL() (Text zu Zahl) und STR$() (Zahl zu Text).

Loest genau diesen Fehler aus 10 A$="HALLO" 20 PRINT A$-1

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?TYPE MISMATCH ERROR.

?DIVISION BY ZERO ERROR

Es wurde durch null geteilt.

Häufige Ursachen:

  • Ein Teiler ist null, oft weil eine Variable noch gar keinen Wert hat.
  • Eine Formel ergibt unter bestimmten Eingaben null im Nenner.

Prüfe den Teiler vorher ab: IF T=0 THEN 100 und behandle den Fall getrennt. Nicht gesetzte Variablen sind in BASIC immer null.

Loest genau diesen Fehler aus 10 A=10 20 PRINT A/B

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?DIVISION BY ZERO ERROR.

?ILLEGAL QUANTITY ERROR

Ein Wert liegt ausserhalb des erlaubten Bereichs.

Häufige Ursachen:

  • Bei POKE ist der Wert grösser als 255 oder negativ.
  • Eine Speicheradresse liegt ausserhalb von 0 bis 65535.
  • Eine Funktion bekommt einen unzulässigen Wert, etwa SQR(-1) oder LOG(0).

Eine Speicherstelle fasst genau ein Byte, also 0 bis 255. Grössere Werte muss man auf mehrere Stellen aufteilen. Bei Wurzeln und Logarithmen das Vorzeichen prüfen.

Loest genau diesen Fehler aus 10 POKE 53280,300

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?ILLEGAL QUANTITY ERROR.

?OUT OF DATA ERROR

READ wollte lesen, aber es sind keine DATA-Werte mehr übrig.

Häufige Ursachen:

  • Die Schleife liest öfter, als Werte vorhanden sind.
  • Eine DATA-Zeile wurde gelöscht oder vergessen.
  • Pro Durchlauf werden mehr Werte gelesen als gedacht.

Zähle die Werte in den DATA-Zeilen und vergleiche sie mit der Anzahl der READ-Vorgänge. Mit RESTORE lässt sich der Lesezeiger an den Anfang zurücksetzen.

Loest genau diesen Fehler aus 10 FOR I=1 TO 5 20 READ A 30 NEXT 40 DATA 1,2,3

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?OUT OF DATA ERROR.

?NEXT WITHOUT FOR ERROR

Ein NEXT steht da, ohne dass eine passende Schleife offen ist.

Häufige Ursachen:

  • Die FOR-Zeile fehlt oder wurde gelöscht.
  • Ein Sprung hat die FOR-Zeile übersprungen.
  • Bei verschachtelten Schleifen stimmt die Reihenfolge der NEXT nicht.
  • Das NEXT nennt eine Variable, zu der es keine offene Schleife gibt.

Verschachtelte Schleifen müssen von innen nach aussen geschlossen werden. Schreib die Variable mit dazu, also NEXT I, das macht Fehler sofort sichtbar.

Loest genau diesen Fehler aus 10 PRINT "START" 20 NEXT I

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?NEXT WITHOUT FOR ERROR.

?RETURN WITHOUT GOSUB ERROR

Ein RETURN wurde erreicht, ohne dass vorher ein GOSUB gesprungen ist.

Häufige Ursachen:

  • Das Hauptprogramm läuft in das Unterprogramm hinein, weil davor das END fehlt.
  • Ein Unterprogramm wurde mit GOTO statt mit GOSUB angesprungen.

Setze vor den ersten Unterprogramm-Zeilen ein END. Das ist mit Abstand die häufigste Ursache.

Loest genau diesen Fehler aus 10 PRINT "START" 20 GOSUB 100 100 PRINT "SUB" 110 RETURN 120 RETURN

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?RETURN WITHOUT GOSUB ERROR.

?UNDEF’D STATEMENT ERROR

Das Sprungziel gibt es nicht.

Häufige Ursachen:

  • Ein GOTO oder GOSUB zeigt auf eine Zeilennummer, die nicht existiert.
  • Die Zielzeile wurde gelöscht oder umnummeriert.
  • Zahlendreher in der Zeilennummer.

Mit LIST nachsehen, welche Zeilennummern es wirklich gibt. Genau deshalb nummeriert man in Zehnerschritten: Dann bleibt Platz zum Einfügen, ohne Sprünge anpassen zu müssen.

Loest genau diesen Fehler aus 10 PRINT "HALLO" 20 GOTO 500

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?UNDEF’D STATEMENT ERROR.

?UNDEF’D FUNCTION ERROR

Eine mit FN aufgerufene Funktion wurde nie definiert.

Häufige Ursachen:

  • Der DEF FN-Befehl fehlt oder wurde noch nicht ausgeführt.
  • Der Funktionsname ist unterschiedlich geschrieben.

Die Definition mit DEF FN muss vor dem ersten Aufruf durchlaufen worden sein, üblicherweise gleich am Programmanfang.

Loest genau diesen Fehler aus 10 PRINT FN Q(3)

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?UNDEF’D FUNCTION ERROR.

?BAD SUBSCRIPT ERROR

Der Zugriff auf ein Feld liegt ausserhalb seiner Grösse.

Häufige Ursachen:

  • Der Index ist grösser als bei DIM angegeben.
  • Ein Feld wurde ohne DIM benutzt und hat deshalb nur die Plätze 0 bis 10.
  • Der Index ist negativ.

Die Obergrenze der Schleife mit der DIM-Angabe vergleichen. Denk daran: DIM A(5) legt sechs Plätze an, A(0) bis A(5).

Loest genau diesen Fehler aus 10 DIM A(5) 20 A(9)=1

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?BAD SUBSCRIPT ERROR.

?CAN’T CONTINUE ERROR

CONT konnte das Programm nicht fortsetzen.

Häufige Ursachen:

  • Es wurde nie ein Programm angehalten, also gibt es nichts fortzusetzen.
  • Das Programm wurde nach dem Anhalten verändert.
  • Es lief bereits bis zum Ende durch.

CONT funktioniert nur direkt nach einem STOP oder einem Abbruch, und nur solange das Programm unverändert bleibt. Sonst hilft nur ein neues RUN.

Loest genau diesen Fehler aus CONT

Zum Ausprobieren gedacht: Dieses Beispiel erzeugt die Meldung ?CAN’T CONTINUE ERROR.

?TOO MANY STEPS ERROR

Das Programm lief sehr lange, ohne fertig zu werden.

Diese Meldung gibt es auf dem echten C64 nicht. Sie stammt von diesem Browser-Nachbau, der ein endlos laufendes Programm irgendwann anhält, damit die Seite nicht hängen bleibt.

Häufige Ursachen:

  • Eine Endlosschleife ohne Abbruchbedingung.
  • Eine Schleife, deren Zähler das Ziel nie erreicht.
  • Eine sehr rechenintensive Schleife, die tatsächlich so lange braucht.

Prüfe die Abbruchbedingung deiner Schleife. War die lange Laufzeit Absicht, lässt sich das Programm jederzeit mit der Esc-Taste anhalten, statt auf diese Meldung zu warten.

Meldungen vom echten C64, die es hier nicht gibt

Der originale C64 kannte noch einige Meldungen mehr, vor allem rund um Speicher und Peripherie: ?OUT OF MEMORY ERROR, ?STRING TOO LONG ERROR, ?FORMULA TOO COMPLEX ERROR, ?FILE NOT FOUND ERROR und ?DEVICE NOT PRESENT ERROR. Sie betreffen Diskettenlaufwerk, Drucker und die 64 Kilobyte Arbeitsspeicher, die es in dieser Form im Browser nicht gibt.

Warum der C64 so sparsam mit Erklärungen war, hat historische Gründe: Sein BASIC stammte aus einer Zeit, in der jedes Byte im ROM zählte. Mehr dazu in der Geschichte von BASIC.

HAEUFIGE FRAGEN

Fragen zu Fehlermeldungen

Warum steht ein Fragezeichen vor der Fehlermeldung?

Das Fragezeichen ist die Kurzform von PRINT und markiert am C64 jede Meldung, die der Rechner selbst ausgibt. So sieht man auf einen Blick, dass die Zeile nicht vom eigenen Programm stammt.

Wie finde ich heraus, in welcher Zeile der Fehler steckt?

Beim Ausführen eines Programms nennt der C64 die Zeilennummer hinter der Meldung, zum Beispiel ?SYNTAX ERROR IN 20. Mit LIST kannst du dir diese Zeile dann ansehen.

Mein Programm bricht ab, ohne eine Meldung zu zeigen. Was nun?

Dann ist es wahrscheinlich regulär zu Ende gelaufen, etwa weil ein Sprung eine Zeile mit END erreicht hat. Prüfe mit LIST den Ablauf, oder baue zum Beobachten ein PRINT an verdächtigen Stellen ein.

Fehler machen gehört dazu

Im Lernkurs führt dich jede Lektion Schritt für Schritt, so bleiben die Fehler klein und erklärbar.

Zum Lernkurs →