FN

Aus C64-Wiki
Zur Navigation springenZur Suche springen
FN
Syntax: FN <Funktionsname>(<Ausdruck>)
Parameter
<Funktionsname>: Name der Funktion
<Ausdruck>: Wert, der der Funktion als Parameter übergegeben wird
Einordnung
Typ: numerische Funktion
Kontext: Programmstruktur
Aufgabe: Aufruf einer benutzerdefinierten Funktion
Abkürzung: keiner
Token: $a5 (165)
Verwandte Befehle
DEF

Anmerkung: Dieser Artikel beschreibt das BASIC-Schlüsselwort FN unter BASIC V2 des Commodore 64.


Das BASIC-Schlüsselwort FN wird auf zwei verschiedene Weisen benutzt:

  • Als Bestandteil des DEF-Befehls, um eine FN-Funktion festzulegen:
DEF FN <Funktionsname>(<Parameter>)=<Ausdruck>
Siehe dazu die Beschreibung im Artikel DEF.
  • Als Aufruf einer selbstdefinierten Funktion, die mit DEF im bisherigen Programmverlauf deklariert worden ist.
FN <Funktionsname>(<Ausdruck>)
Dies wird im Folgenden beschrieben.

FN übergibt das numerische Ergebnis von <Ausdruck> als Argument an die Funktion <Funktionsname>, die wiederum diesen numerischen Wert retour liefert. Nur die ersten beiden Zeichen des Namens sind signifikant. Folgende Buchstaben oder Ziffern werden ignoriert.
Falls die Definition in einem Programm bereits verarbeitet worden ist, kann die so bestimmte Funktion auch im Direktmodus aufgerufen werden, beispielsweise mit PRINT FN <Funktionsname>(<Ausdruck>), was bis zur nächsten Programmänderung oder bis zu einem CLR oder NEW möglich ist.

Es wird nur genau ein Funktionsparameter unterstützt. Falls mehrere Parameter notwendig sein sollten, kann dies nicht elegant über den Aufruf der Funktion direkt realisiert werden, sondern es müssen weitere "normale" Variablen verwendet werden, denen vor dem Aufruf umständlich extra Werte zugewiesen werden müssen.
Der Ausdruck des einzigen Funktionsparameters wird beim Aufruf ausgewertet, der Platzhaltervariable gemäß der DEF-Deklaration zugewiesen und der berechnete Funktionswert als Ergebnis zurück geliefert. Eine etwaige der Platzhaltervariable gleichlautende "normale" Variable bleibt hierbei unberührt.

Wurde im bisherigen Programmverlauf keine Funktion unter diesem Namen definiert, so erscheint die BASIC-Fehlermeldung ?UNDEF'D FUNCTION ERROR.
Fehlt das numerische Argument oder sind mehrere Argumente vorhanden bzw. ist das einzige Argument kein gültiger Ausdruck, so erscheint ?SYNTAX ERROR. Die gleiche Meldung erscheint bei der Verwendung von Variablennamen, die die Buchstabenfolge FN enthalten, wie z.B. EFNA = EFNA - 2.
Wird eine rekursiv definierte Funktion aufgerufen (die Funktion ruft sich selbst auf) oder am Stack ist aus anderen Gründen zu wenig Platz, folgt darauf ein Abbruch mit der Meldung ?OUT OF MEMORY ERROR als Folge des BASIC-Stapel-Überlaufs.

Sonstige Fehler in der Definition des Funktionsausdrucks: Liefert der Ausdruck kein numerisches Ergebnis oder wird die Funktion in einem nicht numerischen Kontext aufgerufen, bricht das Programm mit ?TYPE MISMATCH ERROR ab. Wenn ein Eingabeparameter in der Funktionsabarbeitung keinen gültigen Wert aufweist, beendet ?ILLEGAL QUANTITY ERROR den Programmlauf. Wird im Zuge der Auswertung der Umfang einer Fließkommazahl gesprengt, erfolgt ein Abbruch mit ?OVERFLOW ERROR.


Ein FN-Aufruf belegt insgesamt 16 Bytes auf dem BASIC-Stapel. Diese setzen sich zusammen aus:

  • Fließkommazahlenwert (in der Variablen-Notation) der Parametervariable (5 Bytes)
    (in der Reihenfolge Mantisse 4, 3, 2, 1, Exponent)
  • Position im BASIC-Text nach der Klammer (2 Bytes)
  • Zeiger auf den Wert der Parameter-Variable (2 Bytes)
  • Rücksprungadresse $B43A von JSR $AD8A - Confirm Result (2 Bytes)
  • Rücksprungadresse $AD8C von JSR $AD9E - Evaluate Expression in Text (2 Bytes)
  • 0-Byte von $ADAB (1 Byte)
  • Rücksprungadresse $ADB1 von JSR $AE83 Evaluate Single Term (2 Bytes)

Die Werte werden, wie am Stapel üblich, ausgehend von hohen in Richtung niedriger Adressen abgelegt.


Beispiele[Bearbeiten | Quelltext bearbeiten]

Direktnutzung bei vorheriger Definition, wenn zuvor die Ausführung mit DEF abgearbeitet wurde ...

PRINT FN TEST(3) 
PRINT FN LO10(A) 

Die Verwendung von FN im Programmcode:

10 A = FN DATEN1 (X) - FN JAHR2(Y)
20 H = H + 1: IF FN TE3 (H+1) = 6 THEN 20

Redefinition der selben Funktion(!), weil nur 2 Zeichen des Namens signifikant sind - die Definition der Funktion names "F1" in Zeile 20 gewinnt ...

10 DEF F10TIMES(X)=X*10
20 DEF F10DIV(X)=X/10
30 PRINT F10TIMES(1)

zeigt die falsche Ausgabe

 .1

Typische Umsetzung und Nachbau der häufig gebrauchten Funktion zur Adressermittlung, wie sie von diversen anderen BASIC-Interpretern mittels der Funktion DEEK() bereit gestellt wird:

10 DEF FN DEEK(A)=PEEK(A)+PEEK(A+1)*256
20 PRINT "BASIC-PROGRAMMLAENGE IN BYTES:" FN DEEK(45) - FN DEEK(43)