Zeilennummer
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.
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:- Print Technik Help Plus Modul: Kommando #U (UNDEF'D STATEMENT)
- 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: - 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:- DELETE (BASIC 3.5 und folgende Varianten)
- DELETE (Simons Basic Extension)
- D! (Tuned Simons' Basic)
- Help Plus Modul: Kommando #D (DELETE)
- Hypra-Ass-Assembler Bildschirmeditor: Kommando /D
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:
- RENUMBER (BASIC 3.5) (und höher)
- RENUMBER (Simons' Basic)
- RENUMBER (SBX) (Simons Basic Extension)
- RENUMBER (TSB) (Tuned Simons' Basic)
- RENUMBER (Final Cartridge 3)
- RENUMBER (Structured BASIC)
- RENUMBER (Becker Basic 64)
- RENUMBER (Paradoxon-Basic)
- Print-Technik Help Plus Modul: Kommando #R
- Diverse eigenständige Tools[2]
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:
- CGOTO (Simons' Basic)
- COLLISION (BASIC 7.0 und folgende Varianten)
- RESTORE (BASIC 3.5 und folgende Varianten)
- RESUME (TSB) (Tuned Simons' Basic)
- TRAP (BASIC 3.5 und folgende Varianten)
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]
- ↑ 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 .
- ↑ Thema: Renumber als Assembler-Code auf Forum64.de inkl. vielen technischen Details und ausführlicher Diskussion