DEF

Table Of Contents
hide

Der BASIC-Befehl DEF dient dazu, eigene Funktionen innerhalb von BASIC-Programmen zu definieren, die später mit (FN) aufgerufen werden kann. Die zu definierende Funktion kann aus einem beliebigen BASIC-Ausdruck bestehen, sofern dieser ein numerisches Ergebnis liefert. Der Ausdruck darf neben dem Parameter (das ist lediglich ein Platzhalter), Zahlenwerten, Variablen und den mathematischen und logischen Operatoren auch mathematische, sowie auch Zeichenketten-Funktionen oder Ausleseanweisungen enthalten. Zulässige Funktionen, deren Ergebnis direkt verwendet werden können, sind z.B. ABS(), AND, ATN(), ASC(), COS(), EXP(), FN<Funktionsname>(), FRE(), INT(), LEN() LOG(), NOT, PEEK(), POS(), OR, RND(), SGN(), SIN(), SQR(), STATUS bzw. ST, TAN(), TIME bzw. TI oder VAL().

In der DEF-Zeile wird die Funktion einmal komplett als Prototyp vorgegeben, wobei der Parameter als numerische Eingangsgröße in den Ausdruck einfließen kann (aber nicht muss). Der Parametername kollidiert dabei aber nicht mit einer bereits gleichnamigen, eventuell existierenden Variablen. Später kann die Funktion mit dem BASIC-Befehl FN <Funktionsname>(<Ausdruck>) aufgerufen werden.
Der Funktionsname muss (analog zu den Variablennamen) mindestens aus einem Zeichen bestehen, davon ist das erste Zeichen stets ein Buchstabe (A-Z) und die nachfolgenden Zeichen dürfen entweder aus Buchstaben (A-Z) oder aus Ziffern (0-9) bestehen. Es kann auch eine Funktion überschrieben werden, wenn diese den gleichen Funktionsnamen besitzt wie eine schon definierte! Ist der Funktionsname länger als zwei Zeichen, werden die restlichen Zeichen ignoriert. D.h. FN TEST0 wird durch die Definition von FN TEST1 überschrieben, da der eigentliche Funktionsname in beiden Fällen FN TE ist. Hier sollte ebenso die Verwendung von BASIC-Schlüsselwörtern vermieden werden, was üblicherweise zur Fehlermeldung ?SYNTAX ERROR führt.

Wenn der BASIC-Befehl nicht im Programmmodus ausgeführt wird, so erscheint die BASIC-Fehlermeldung ?ILLEGAL DIRECT ERROR. Wird die falsche Typenbezeichnung beim Parameter benutzt, so tritt entweder die BASIC-Fehlermeldung ?SYNTAX ERROR (bei Integer- bzw. Ganzzahl Variablenbezeichner) oder ?TYPE MISMATCH ERROR (bei dem Versuch Variablenbezeichner von Zeichenketten anzugeben) auf.
Andere Fehler in der Definition des Funktionsausdrucks treten erst auf, wenn die Funktion erstmalig aufgerufen wird: Liefert der Ausdruck kein numerisches Ergebnis, bricht das Programm mit ?TYPE MISMATCH ERROR ab oder ?ILLEGAL QUANTITY ERROR beendet den Programmlauf, wenn ein Eingabeparameter einer Funktionen keinen gültigen Wert aufweist).

Beispiele

Zum Start eine einfache Definition einer Funktion, die den übergebenen Parameterwert verdreifacht:

10 DEF FN FTEST1(X) = X*3
20 INPUT "Geben Sie ein Zahl ein:"; A
30 PRINT FN FTEST1(A): PRINT
40 IF A<>64 THEN 20

Im folgenden Fall muss zwar ein Parameter übergeben werden, dieser wird aber nicht berücksichtigt, da ausschließlich die Variablen A und B für die Berechnung herangezogen werden:

10 A=10: B=11
20 DEF FN C(X) = 3+(A*B)/2
30 D = FN C(0): PRINT D

Mit folgendem Beispiel wird die sonst fehlende logische Funktion Exklusiv-Oder “XR” definiert. Das Problem dabei ist, dass nur Funktionen mit genau einem Parameter (hier werden zwei gebraucht) angelegt werden können. Der 2. Parameter wird über die Variable B beigesteuert. Das Beispiel stellt die Logikmatrix dar (-1 für “wahr” und 0 für “falsch”):

10 DEF FN XR(A) = (A OR B) AND NOT(A AND B)
20 PRINT "X","Y","X XOR Y"
30 FOR X= -1 TO 0
40 FOR Y= -1 TO 0
50 B=Y: R=FN XR(X)
60 PRINT X,Y,R
70 NEXT Y
80 NEXT X

In diesem Beispiel wird in Zeile 10 die Berechnung des 10er Logarithmus definiert und in Zeile 30 wird die neue Logarithmusfunktion LO10 aufgerufen:

10 DEF FN LO10(X) = LOG(X)/LOG(10)
20 Y = 10
30 Y = Y * 10 : PRINT FN LO10(Y); " ";
40 IF Y<1E38 THEN 20

Dieses Beispiel zeigt, was u.a. möglich ist. Es sind hier mehrere Funktionen und Ausleseanweisungen zusammengefasst und Funktionen geschachtelt.

10 A$="12.12.1964 SAMSTAGABEND"
20 DEF FN F1(X) = ( LEN(A$)/VAL(A$) ) * PEEK(53280)
30 PRINT FN F1(0)
40 DEF FN F2(X) = INT( ABS( FN F1(X)* 1E+8) / ASC(A$) )
50 PRINT FN F2(1)

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert