RECORD

Aus C64-Wiki
Wechseln zu: Navigation, Suche
RECORD
Format: RECORD #<logische Dateinummer>,<Datensatznummer> [,<Position>]
Parameter
<logische Dateinummer> : numerischer Ausdruck (1 bis 255)
<Datensatznummer>: numerischer Ausdruck (1 bis 65535)
<Position>: numerischer Ausdruck (1 bis 254)
Einordnung
Typ: Anweisung
Kontext: Diskettenbefehl
Aufgabe: auf Datensatz einer Relativdatei positionieren
Abkürzung: rE
Verwandte Befehle
DOPEN

Anmerkung: Dieser Artikel beschreibt den BASIC-Befehl RECORD ab Commodore BASIC 4 (bestimmte Varianten) bzw. BASIC 7.0 oder höher.


Der Befehl RECORD wählt bei einer Relativdatei den mit Datensatznummer angegebenen Datensatz aus, der dann mittels PRINT# geschrieben oder mit INPUT# bzw. GET# ausgelesen werden kann. Die zum Parameter logische Dateinummer gehörende Datei muss zuvor mit OPEN oder DOPEN geöffnet worden sein. Der optionale Parameter Position legt die Startposition innerhalb des Datensatzes fest, ab der dann eine nachfolgende Lese- oder Schreiboperation wirkt. Der Fehlerkanal, abrufbar über die Systemvariablen DS$ und DS, gibt Aufschluss zum Verlauf des Befehls.

Zulässige Werte (stets als Ganzzahl aufgefasst) für Parameter

  • logische Dateinummer sind 1 bis 255,
  • Datensatznummer sind 1 bis 65535,
  • Position sind 1 bis 254.

Sind die Parameter außerhalb des zulässigen Wertebereichs, erscheint die Fehlermeldung ?ILLEGAL QUANTITY ERROR. Eine sonst abweichende Parametersyntax löst die Fehlermeldung ?SYNTAX ERROR aus.
Anders als bei den anderen Diskettenbefehlen ist die Parameterreihenfolge fest vorgegeben, wobei Variablenangaben oder allgemeine Ausdrücke keine Klammerung erforderlich machen.

Ist die logischen Dateinummern zuvor nicht geöffnet worden, kommt es zur Fehlermeldung ?FILE NOT FOUND ERROR. Handelt es sich nicht um eine Datei vom Typ REL, meldet der Fehlerkanal des Diskettenlaufwerks den Fehler "64, FILETYPE MISMATCH,00,00".

Ist der Datensatz noch nicht angelegt, dann liefert der Fehlerkanal die rein informative Meldung "50, RECORD NOT PRESENT,00,00", was keine Fehlersituation darstellt. Ein Schreiboperation bewirkt dann die Vergrößerung der Relativdatei auf mindestens diesen Datensatz (tatsächlich werden mitunter mehr Datensätze angelegt, entsprechend dem in einem Datenblock noch vorhandenen Platz).

Sollte der Wert des Parameters Position die Datensatzgröße überschreiten, meldet der Fehlerkanal "51, OVERFLOW IN RECORD,00,00", was aber nur einen informellen Charakter hat. Implizit wird dabei an die Position 1 zurückgesetzt.

Die tatsächlich verwendbare maximale Datensatznummer hängt von der vorhandenen Diskettenkapazität ab. Bei einer 1541 kann bereits ab einer Datensatzgröße von 3 die Diskettenkapazität ausgeschöpft werden (der Verbrauch in Blöcken alleine für die Daten umfasste 65535*3/254, also 774 Blöcke, obgleich auf diesem Laufwerk durch die interne Datenstruktur das Limit für eine Relativdatei bei 720 Blöcken liegt, was noch immer deutlich über der maximal verfügbaren Blockanzahl von 664 liegt).


BASIC 2.0 und 3.5 Entsprechung

Allgemeine Syntax:

DOPEN #<logische Dateinummer>,<Dateiname>,L<Datensatzgröße> ON U<Gerätenummer>,D<Laufwerk>
RECORD #<logische Dateinummer>,<Datensatznummer>,<Position>

Entsprechung in BASIC V2 oder BASIC 3.5:

KN=3 : REM KANALNUMMER
OPEN <logische Dateinummer>,<Gerätenummer>,KN,"<Laufwerk>:"+<Dateiname>+"L,"+CHR$(<Datensatzgröße>)
OPEN 15,<Gerätenummer>,15
PRINT#15,"P"CHR$(KN)CHR$(<Datensatznummer>-INT(<Datensatznummer>/256)*256)CHR$(<Datensatznummer/256)CHR$(<Position>);
CLOSE 15

Unter der Annahme, dass die logische Dateinummer 15 (hier für das Öffnen des Fehlerkanals) und die Kanalnummer in Variable KN auf Gerät <Gerätenummer> unbelegt sind. Diese Parameter werden bei BASIC 7.0 intern verwaltet.

Eine Angabe der Position 0, die RECORD als Parameter gar nicht zulässt, ist gleichwertig mit der Startposition 1.

Falls keine spezielle Positionierung innerhalb des Datensatzes nötig ist, kann auch

PRINT#15,"P"CHR$(KN)CHR$(<Datensatznummer>-INT(<Datensatznummer>/256)*256)CHR$(<Datensatznummer/256);

verwendet werden. Das abschließende Semikolon ist besonders wichtig, da andernfalls das durch PRINT# automatisch angefügte CHR$(13)-Zeichen fälschlicherweise als Positionsangabe interpretiert wird.

Überschreitet die Datensatznummer nicht den Wert 32767, dann kann der obige PRINT#-Aufruf auch effizienter mit

PRINT#15,"P"CHR$(KN)CHR$(<Datensatznummer>AND255)CHR$(<Datensatznummer/256)CHR$(<Position>);

formuliert werden.
Theoretisch lassen sich hier auch Datensatznummern größer 32767 verwenden, welche aber dann in der vorzeichenbehafteten Darstellung einer 16-Bit-Ganzzahl vorliegen muss. D.h. 32768 entspricht dann -32768, 32769 entspricht -32767 usw. bis -1 als Entsprechung für 65535. Das erfordert aber eine aufwendigere Berechnung des niederwertigen Bytes der Datensatznummer:

PRINT#15,"P"CHR$(2)CHR$(255 AND <Datensatznummer> + 65536 * (<Datensatznummer> > 32767))CHR$(R/256);

Damit werden stets passende Ganzzahlwerte für den bitweise-AND-Operator erzeugt. Allerdings ist diese Variante auch aus Sicht der Ausführungsgeschwindigkeit verglichen mit obigen die langsamste.
Achtung: BASIC 3.5 betrachtet wegen eines Implementierungsfehlers den Wert -32768 als illegal, weshalb dieser Ansatz dort nicht verwendbar ist und diese Variante somit auch der Portabilität wegen nicht geeignet ist.

Beispiele[Bearbeiten]

110 SCRATCH "RELDAT=R"
110 DOPEN #1,"RELDAT",L32
120 PRINT DS$ : IF DS <> 0 THEN END
130 RECORD #1, 500
140 PRINT#1,CHR$(255);
150 DCLOSE #1

Zuerst wird eine eventuell vorhandene Relativdatei "RELDAT" gelöscht (eine etwaige gleichlautende Datei andern Typs wird aber nicht gelöscht, was durch den Typselektor im Dateinamen sichergestellt wird).
Sollte eine Datei anderen Typs bestehen, endet das Programm mit der Ausgabe "64, FILE TYPE ERROR,00,00".
Sonst wird eine Relativdatei mit Datensatzgröße 32 erstellt, wobei Datensätze 1 bis 500 angelegt werden. Dies wird durch das Schreiben des Zeichens CHR$(255) auf den 500. Datensatz hervorgerufen.