Zeilennummer

Aus C64-Wiki
(Weitergeleitet von Zeilenumnummerierung)
Zur Navigation springenZur Suche springen
Ein C64-BASIC-Programm als Listing mit Zeilennummern und den BASIC-Sprungbefehlen GOTO, GOSUB und RETURN.

Zeilennummern dienen in BASIC-Quelltexten dem Interpreter oder Compiler als Ziele für Sprunganweisungen. Für den Programmierer dienen sie im Bildschirmeditor des C64 als Mittel, um die Reihenfolge der Programmzeilen festzulegen, und dem Computer mitzuteilen, dass es sich um eine zu speichernde Programmzeile handelt, und nicht um eine Anweisung, die im Direktmodus unmittelbar ausgeführt werden soll.
Weiterhin hilft die Zeilennummer dem Programmierer auch eine Programmstelle als Fehlerquelle zu identifizieren. Fehlermeldungen weisen üblicherweise die verursachende Zeile mit der Zeilennummer aus oder diese steht als in einer Variable (z.B. EL) für eine Fehlerbehandlungsfunktion im Programm selbst zur Verfügung.


Verwendung[Bearbeiten | Quelltext bearbeiten]

BASIC[Bearbeiten | Quelltext bearbeiten]

Das im C64 und VC20 eingebaute CBM-BASIC V2 unterstützt Zeilennummern von 0 bis 63999 [1]. Der Versuch Zeilennummern außerhalb dieses Bereichs einzugeben, wird mit der Fehlermeldung ?SYNTAX ERROR beantwortet oder führt bei bestimmten Werten (350720 bis 353720) im Falle von BASIC V2 sogar zu einem Absturz.

Das Programm und die Ausgabe des BASIC-Beispielprogramms "Zeilennummer als Labels bzw. Marken". Die Ausgabe wurde mit schwarzer Schriftfarbe hervorgehoben!

Beispiel: Zeilennummer als Labels bzw. Marken:

10 X = 1: GOTO 30
20 GOSUB 100: X = X + 2
30 ON X GOSUB 100, 200, 100, 200, 100
40 X = X - 1: IF X<1 THEN X = 1
50 PRINT X
60 ON X GOTO 20, 40, 20, 40, 20, 40
90 END
100 X = X + 1: PRINT X: RETURN
200 X = X - 0.5 : PRINT X: RETURN



Andere Programmiersprachen[Bearbeiten | Quelltext bearbeiten]

Andere Programmiersprachen verwenden Zeilennummern als Eingabehilfe für den Programmierer, aber nicht für die Sprache selbst. Beispiele dafür wären: Der Hypra-Ass-Assembler oder Comal. Sprungziele werden in diesen Sprachen durch Labels, Marken oder durch benannte Prozeduren und Funktionen gekennzeichnet bzw. ergeben sich automatisch durch strukturelle Konstruktionen (Schleifen, bedingte Ausführung zusammen mit der Bildung von Befehlsblöcken).

Modernere Sprachen gehen davon aus, dass ein Texteditor zum Bearbeiten der Quelltexte verwendet wird und nicht ein Bildschirmeditor wie beim CBM-BASIC. Dort können die Zeilennummern deshalb ganz entfallen. Beispiele sind: Viele Assembler, C, Forth, Pascal, und Promal. Auch moderne BASIC-Dialekte für aktuelle Rechner sind von Zeilennummern auf benannte Unterprogramme und Funktionen umgestiegen.

Programmierhilfen[Bearbeiten | Quelltext bearbeiten]

Im Umgang mit Zeilennummern entsteht schnell der Bedarf nach Hilfsmittel, die im Zeilennummernsystem zugrunde liegenden Schwächen besser beherrschen zu können. So manche BASIC-Dialekte und BASIC-Erweiterungen sehen entsprechende Funktionen vor:

  • Umnummerierung eines Programms, falls das Einfügen von Zeilen (an gewünschter Stelle) nicht mehr möglich ist oder kompaktere und kürzere Zeilennummern (zur Platzersparnis) angestrebt sind. Dabei muss die Erhaltung aller Zeilenreferenzen gewährleistet bleiben. Siehe Details.
  • Suchen nach undefinierten Zeilenreferenzen: Ein Plage des Programmierens sind jene Fehler, die erst zu einem viel späteren oder unter besonderen Bedingungen im Programmlauf auftreten, insbesondere Verzweigungen zu nicht existierenden Zeilen, was BASIC dann mit der Fehlermeldung ?UNDEF'D STATEMENT ERROR ahndet. Manche Erweiterungen bieten eine Suchfunktion, die überprüft, ob alle im Programmtext vorkommenden Zeilennummern auch tatsächlich eine existierende Zielzeile aufweisen.
    Beispiel:
  • Automatische Zeilennummernvorgabe bei der Eingabe: Im interaktiven Eingabemodus wird nach dem Abschluss einer Eingabe mit RETURN  wird mit einer bestimmten Schrittweite für die folgende Zeilennummer bereits die neue Zeile mit entsprechender Nummer vorgegeben. Damit kann, ohne extra die Zeilennummer einzutippen, der Fokus rein auf die Eingabe von Programmzeilen gelegt werden.
    Beispiele:
    • AUTO (BASIC 3.5 und folgende Varianten)
    • AUTO (Simons' Basic)
    • Help Plus Modul: Kommando #G (GENLINE)
  • Löschen von Zeilenbereichen: Damit auch mehrere Zeilen gezielt und schnell gelöscht werden können, gibt es ab BASIC 3.5 den Befehlt DELETE, der auch in ähnlicher Form in etlichen anderen Erweiterungen und Hilfsprogrammen vorhanden ist.
    Beispiele:


Umnummerierung

Das nachträgliche Durchnummerieren der Zeilen, entweder des gesamten Programms oder eines Teiles davon wird von manchen BASIC-Varianten und BASIC-Erweiterungen unterstützt. Beispiele:

Das Umnummerieren kann nur dann korrekt angewendet werden, wenn die Zeilennummern im Programm selbst als Konstanten vorliegen und nicht in irgendeiner Form arithmetisch berechnet werden. Grundsätzlich vermeiden die CBM-BASIC-Varianten dies, da es dort keine berechnenden GOTOs gibt. Allerdings gibt es beim neueren BASIC 3.5 (auch beim BASIC 4+ der CBM-II-Linie) z.B. den TRAP-Befehl, der ein berechneten Ausdruck ermöglicht, welcher dann nicht mehr ohne weiteres bei einer Umnummerierung erkannt und entsprechend berücksichtigt werden kann. Beispiele für problematische Befehle:

Eine Erweiterung kann auch fehlerhaft arbeiten und korrigierbare Zeilennummernangaben unberücksichtigt lassen:

  • RESET (Simons' Basic): Wird von RENUMBER nicht korrigiert. Der Fehler ist in RENUMBER (TSB) behoben.
  • ON_ERROR (Simons' Basic): Ein dort vorkommendes GOTO wird von RENUMBER nicht korrigiert. Der Fehler ist in RENUMBER (TSB) behoben.
  • ON KEY (Simons' Basic): Ein dort vorkommendes GOTO wird von RENUMBER nicht korrigiert. Der Fehler ist in RENUMBER (TSB) behoben.

Quellen und Fußnoten[Bearbeiten | Quelltext bearbeiten]

  1. Das Zeilennummermaximum von 63999 ergibt sich aus der Implementierung der Abfrage, in der - bevor die nächste Ziffer nach rechts gehend gelesen wird - der bisher ermittelte Wert, bevor er mit 10 multipliziert wird, nicht >= 6400 sein darf, wobei sogar nur das High-Byte überprüft wird; siehe BASIC-ROM $A96B/43371 Sprache:englisch.
  2. Thema: Renumber als Assembler-Code auf Forum64.de inkl. vielen technischen Details und ausführlicher Diskussion