FRE

Aus C64-Wiki
Zur Navigation springenZur Suche springen
FRE
Syntax: FRE(<Hilfsargument>)
Parameter
<Hilfsargument>: beliebiger Ausdruck (bis BASIC V7 ohne Bedeutung)
Einordnung
Typ: numerische Funktion
Kontext: Speicherverwaltung
Aufgabe: Ermittlung des freien RAM-Speichers
Abkürzung: fR
Token: $b8 (184)
Verwandte Befehle
CLR, DIM, NEW

Anmerkung: Dieser Artikel beschreibt die Funktion FRE unter BASIC V2 des Commodore 64.


Die BASIC-Funktion FRE() gibt die Anzahl in Bytes zurück, wie viel freier RAM-Speicher für Programme und Variablen bei der aktuellen Speicherbelegung noch zur Verfügung steht.
Das Hilfsargument muss vorhanden sein und kann ein beliebiger, syntaktisch korrekter Ausdruck sein. Dessen Typ (beispielsweise auch String) und sein Wert sind dabei irrelevant.

Ist das Ergebnis des Funktionsaufrufs von FRE negativ, muss der Wert 65536 hinzu addiert werden, um die wirkliche Anzahl der frei verfügbaren Bytes zu erhalten (ein Fehler des BASIC-Interpreters, der das Ergebnis fälschlicherweise als vorzeichenbehaftete 16-Bit-Zahl weiter reicht).

Fehlt das Hilfsargument, kommt es zum Fehler ?SYNTAX ERROR.

Als Nebenwirkung stößt die Funktion FRE vor der Berechnung des freien Speichers die Garbage Collection an, um auch die vorübergehend belegten Speicherbereiche wieder freizugeben.


FRE unter BASIC 7.0

Unter BASIC 7.0 wird der Funktionsparameter nicht mehr ignoriert, sondern muss nun ein numerischer Ausdruck sein, dessen Wert folgende Bedeutung hat:

  • 0: Es wird der freie Programmspeicher zurückgegeben.
  • 1: Es wird der freie Variablenspeicher zurückgegeben sowie die Garbage Collection gestartet.

Andere Werte führen zu einem ?ILLEGAL QUANTITY ERROR.

Das Ergebnis von FRE ist unter BASIC 7.0 immer positiv.

Beispiele[Bearbeiten | Quelltext bearbeiten]

PRINT FRE(.)

Die degenerierte Fließkommazahl "." als Argument entspricht einer 0.

PRINT FRE(0)+65536

Mit Korrektur für den Fall, dass die Funktion einen negativen Wert liefert, allerdings nur solange der verbrauchte Speicherplatz rund 6141 nicht überschreitet.

PRINT FRE(.)-65536*(FRE(.)<0)

Gibt immer den richtigen, automatisch korrigierten Wert aus.

10 DEF FN F(X)=FRE(.)-65536*(FRE(.)<0)
20 PRINT FN F(0)

Falls die eine korrigierte Funktion öfters benötigt wird, kann diese wie hier als Funktion definiert sein. Aber: Diese ruft wegen des zweimaligen FRE()-Aufrufs auch 2 mal die Garbage-Collection auf, was dann auch die dadurch auftretende Verzögerung (wenn viele aktive Zeichenketten im Spiel sind) doppelt werden lässt.

PRINT FRE(A$)

Eine Zeichenketten-Variable als Argument, welches nicht beachtet wird. Ein Kuriosum, das aus Portabilitätsgründen aber nicht zu empfehlen ist. Von BASIC 3.5 oder der unter BASIC 4.0 auf PETs noch unterstützt, scheitert BASIC 7.0 oder die BASIC 4.0+ Version der CBM-II-Linie an einer solchen Konstruktion mit Fehlermeldung ?TYPE MISMATCH.