RENUMBER (BASIC 3.5)

Aus C64-Wiki
Zur Navigation springenZur Suche springen
RENUMBER (BASIC 3.5)
Syntax: RENUMBER [[<Startzeile neu>], [<Schrittweite>] [,<Startzeile alt>]]
Parameter
<Startzeile neu>: Ganzzahl im Wertebereich von 0 bis 63999
<Schrittweite>: Ganzzahl im Wertebereich von 1 bis 63743
<Startzeile alt>: Ganzzahl im Wertebereich von 0 bis 63999
Einordnung
Typ: Befehl
Kontext: BASIC-Editor
Aufgabe: BASIC-Programm oder Teile davon neu nummerieren
Abkürzung: renU
Token: $f8 (248)
Verwandte Befehle

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl RENUMBER ab Commodore BASIC V3.5 oder höher


Der BASIC-Befehl RENUMBER nummeriert ein BASIC-Programm oder Teile davon neu und passt die Zeilenreferenzen der Sprungbefehle im gesamten BASIC-Programm an.

Der RENUMBER-Befehl kann nur im Direktmodus ausgeführt werden. In einem Programm führt dieser zu einem Abbruch mit der Meldung ?DIRECT MODE ONLY.

RENUMBER besitzt folgende, sämtlich optionale, Parameter:

  • <Startzeile neu>: Gibt die Zeilennummer an, mit der der neu nummerierte Programmabschnitt beginnt, vorgegeben ist 10. Überschneidet sich diese Nummer mit dem nicht neu zu nummerierenden Programmteil, wird die Fehlermeldung ?ILLEGAL QUANTITY ERROR ausgegeben, d.h. die Zeilennummer muss größer als die Zeilennummer jener Zeile sein, die unmittelbar vor <Startzeile alt> vorkommt. Werte über 63999 (höchste erlaubte Zeilennummer) erzeugen einen ?SYNTAX ERROR.
  • <Schrittweite>: Abstand der einzelnen Zeilennummern im durchnummerierten Abschnitt, vorgegeben ist 10. Erlaubt sind Werte von 1 bis 63743. Werte von 63744 (hex. F900) bis 65535 sind zwar erlaubt, erzeugen aber beim Vorhandensein mindestens einer BASIC-Zeile einen ?LINE NUMBER TOO LARGE ERROR. Werte kleiner 1 oder größer als 65535 verursachen einen ?ILLEGAL QUANTITY ERROR.
  • <Startzeile alt>: Zeilennummer, ab der mit der Nummerierung begonnen wird, vorgegeben ist 0. Erlaubt sind Werte von 0 bis 65535. Werte außerhalb dieses Bereichs erzeugen einen ?ILLEGAL QUANTITY ERROR. Die angegebene Zeile muss nicht existieren, es wird ab der ersten Zeile, deren Wert größer oder gleich dem Parameter ist, mit der Nummerierung begonnen.

Ein RENUMBER ohne Parameter entspricht einem RENUMBER 10,10,0. RENUMBER arbeitet in mehreren Phasen:

  1. Es wird vorab überprüft, ob die neue Nummerierung auf den gültigen Zeilennummernbereich umgelegt werden kann. Die Zeilennummern dürfen dabei einen Wert von 0 bis 63742[1] annehmen. Ein Überschreiten der oberen Grenze wird mit dem Fehler ?LINE NUMBER TOO LARGE ERROR geahndet.
  2. Der Speicherplatzverbrauch, der sich durch die Anpassungen der Zeilennummern ergibt und den den BASIC-Text vergrößern kann, liefert bei Überschreitung des verfügbaren Platzes den Fehler ?OUT OF MEMORY ERROR.
  3. Die eigentliche Anpassung der Zeilennummern erfolgt nun analog zum simulierten Durchlauf davor. Dabei passt RENUMBER die Zeilennummer bei Befehlen mit Zeilenreferenzen (GOTO, GOSUB, THEN, ON..GOTO/GOSUB, ELSE, RESTORE, RESUME, RUN, TRAP, in BASIC 7.0 COLLISION) an die neue Nummerierung an. Dabei wird keine syntaktische Kontrolle vorgenommen, sondern einfach nach einer Ganzzahlkonstante zu Beginn des entsprechenden Parameters des Befehls gesucht. Wird eine Zahl gefunden, wird überprüft, ob diese im Bereich von 0 bis 63999 liegt, sonst wird ein ?SYNTAX ERROR ausgegeben. Ist die Zahl im erlaubten Bereich, wird die BASIC-Zeile mit der entsprechenden Nummer gesucht. Schlägt die Suche fehl, erfolgt bei BASIC 7.0 ein Abbruch mit ?UNRESOLVED REFERENCE ERROR, hingegen wird bei BASIC 3.5 schlicht die Zeilennummer 65535 eingesetzt. Wenn die Zeile gefunden, trägt RENUMBER ihre neue Nummer als Zeilenreferenz ein. Dabei werden Zeichen, die keine Ziffern sind, im Anschluss einer Zahl ignoriert (siehe Beispiele).
    Vorsicht: Von den zuvor genannten Befehlen könnten bei den folgenden für die Zeilennummer arithmetische Ausdrücke vorliegen, die RENUMBER falsch (wenn der Ausdruck mit einer Zahlenkonstante beginnt, siehe nächstes Beispiel) oder gar nicht anpassen kann:
Manche Befehle mit Zeilennummern werden überhaupt nicht beachtet. Neben DELETE und RENUMBER selbst, die ohnehin im Programm nicht verwendbar sind und deren Behandlung keinen Sinn ergibt, bleibt noch LIST, dessen Gebrauch in einem Programm aber auch eher exotisch ist.

Nahezu alle Fehlermeldungen erfolgen ohne Angabe einer Zeilennummer, außer bei ?UNRESOLVED REFERENCE ERROR, wo die betroffene Zeile angegeben wird.

Der folgende Code

10 TR=100
20 TRAP 100+TR
30 TRAP TR+100
100 PRINT "XYZ"
200 RESUME NEXT

ergibt nach einem RENUMBER-Aufruf:

10 TR=100
20 TRAP 40+TR
30 TRAP TR+100
40 PRINT "XYZ"
50 RESUME NEXT

Nach dem RENUMBER zeigen beide TRAP-Befehle auf die falsche Zeile. Als Konsequenz sollten berechnete Sprungziele generell vermieden werden.

Beispiele[Bearbeiten | Quelltext bearbeiten]

RENUMBER 1000,10,100

Das Programm wird ab Zeile 100 neu nummeriert, die erste Zeile erhält die Nummer 1000, die nächste 1010 usw.

RENUMBER ,,10

Die Zeilen ab 10 werden mit den Vorgabewerten (Startzeile 10, Schrittweite 10) umnummeriert, wobei etwaige Zeilen 0-9 unberührt bleiben (abgesehen von eventuellen Zeilenreferenzen zu anderen Zeilen >= 10).

Weblinks[Bearbeiten | Quelltext bearbeiten]

Anmerkungen[Bearbeiten | Quelltext bearbeiten]

  1. Die maximale Zeilennummer von 63742 ergibt sich aus der Abfrage des höherwertigen Bytes auf kleiner $F9 ($5B94). Der damit maximal zulässige Wert $F8FF/63743 wird dabei auf die letzte Pseudozeile eines BASIC-Programms (bestehend aus drei Nullen), dessen Link-Zeiger auf 0 abgefragt wird, umgelegt. Bei einer minimalen Schrittweite von 1 kann damit die letzte reale Zeile somit 63742 annehmen.