Referenz - FUNCTION
Syntax:
[{PRIVATE | PUBLIC }] FUNCTION Funktionsname [Aufrufkonvention] [ALIAS "AliasName"] _
[OVERLOAD] ([Parameterliste]) [BYREF] AS Rückgabetyp [STATIC] [EXPORT]
' Anweisungen
{ RETURN | FUNCTION = | Funktionsname = } [BYVAL] wert
END FUNCTION
Typ: Prozedur
Kategorie: Programmablauf
Anmerkung zur Syntax: Unterstriche (_) am Zeilenende werden von FreeBASIC so interpretiert, als wäre die Zeile nicht unterbrochen; dies dient nur der besseren Übersichtlichkeit und hat letztendlich keine Auswirkungen auf die Programmausführung.
Eine FUNCTION ist eine Prozedur, die einen Wert an das Hauptprogramm zurück gibt. FUNCTIONs werden dazu verwendet, häufig auftretende Berechnungen zusammenzufassen. Siehe auch SUB zum Thema Prozeduren.
- Die Klausel 'PRIVATE' bewirkt, dass die Funktion nur aus dem Modul heraus aufgerufen werden kann, in dem sie sich befindet. Wird nichts angegeben, so wird die Funktion standardmäßig als PUBLIC deklariert. Siehe dazu die Referenzeinträge PRIVATE und PUBLIC.
- 'Funktionsname' ist der Bezeichner, unter dem die Funktion aufgerufen wird.
- 'Aufrufkonvention' ist ein Schlüsselwort, das angibt, in welcher Reihenfolge die Parameter übergeben werden sollen. Möglich sind: STDCALL, CDECL und PASCAL.
- 'ALIAS' gibt einer Funktion in einer Library einen neuen Namen, mit dem man auf sie verweisen kann.
- 'OVERLOAD' erlaubt, Prozeduren mit unterschiedlicher Parameterliste, aber gleichem Funktionsnamen zu deklarieren. Siehe dazu den Referenzeintrag OVERLOAD.
- 'Parameterliste' gibt die Parameter an, die an die Funktion übergeben werden. Die Parameterübergabe wird weiter unten erläutert.
- Mit 'BYREF' kann angegeben werden, das die Rückgabe by reference erfolgt.
- 'Rückgabetyp' ist der Datentyp des Rückgabewerts. Auch UDTs und POINTER sind erlaubt.
- Die Klausel 'STATIC' bewirkt, dass alle Variablen innerhalb der Funktion zwischengespeichert werden. Das bedeutet, dass die Werte von Variablen, die in der Funktion verwendet werden, nach einem Aufruf nicht verloren gehen, sondern beim nächsten Aufruf der Funktion wieder verfügbar sind. Siehe auch STATIC (Klausel).
- Die Klausel 'EXPORT' bewirkt, dass die Funktion zur PUBLIC-EXPORT-Tabelle hinzugefügt wird, sodass sie von externen Programmen aus mit DYLIBSYMBOL verlinkt werden kann. Siehe dazu den Referenzeintrag EXPORT.
Um eine Funktion aufzurufen, bevor sie im Quellcode definiert wurde, muss sie zuvor deklariert werden:
DECLARE FUNCTION Funktionsname [Aufrufkonvention] [OVERLOAD] [[LIB "DLLName"] _
ALIAS "AliasName"] [ ( Parameterliste ) ] AS Rückgabetyp
Siehe dazu den Referenzeintrag DECLARE.
Parameterübergabe
Der Wert der Funktion kann von übergebenen Parametern abhängig sein. Die Parameterliste besitzt die Form
[ {BYVAL | BYREF } ] [Parameter1] AS [CONST] Typ [= Wert] [, _
[ {BYVAL | BYREF } ] [Parameter2] AS [CONST] Typ [= Wert] ] [, ...]
- 'Parameter1', 'Parameter2', ... sind die Parameter (auch Argumente genannt). Es sind Variablen (bzw. ihre Werte), die in der Funktion verwendet werden können.
- Wird 'CONST' angegeben, kann der Wert innerhalb der Funktion zwar gelesen, aber nicht mehr beschrieben werden.
- 'Typ' ist der Datentyp des übergebenen Parameters. Auch UDTs und Pointer können verwendet werden.
- Durch '= Wert' wird ein Parameter als optional deklariert; er kann beim Aufruf der Prozedur ausgelassen werden. In diesem Fall wird an die Funktion für diesen Parameter 'Wert' übergeben. Das VisualBASIC-Äquivalent heißt OPTIONAL.
- BYVAL und BYREF regeln die Art der Parameterübergabe an die FUNCTION.
Der Datentyp muss bei den Parametern immer angegeben werden.
Siehe auch Parameterübergabe.
Rückgabewert
Der Rückgabewert der Funktion kann auf dreierlei Weise gesetzt werden:
- über ihren Bezeichner: Funktionsname = [BYVAL] Ausdruck
- über das Symbol "FUNCTION": FUNCTION = [BYVAL] Ausdruck
- über RETURN: RETURN [BYVAL] Ausdruck
Achtung: RETURN funktioniert wie FUNCTION = [BYVAL] Ausdruck : EXIT FUNCTION
Hinweis:
Die Angabe 'BYVAL' spielt nur bei Funktionen eine Rolle, die by reference mit BYREF arbeiten.
Der Rückgabewert einer Funktion kann beim Aufruf auch ignoriert werden. Dies kann dann sinnvoll sein, wenn die Funktion z.B. darüber informiert, ob ihr Code erfolgreich ausgeführt wurde. Um den Rückgabewert einer Funktion zu ignorieren, setzen Sie diese einfach wie eine SUB ein.
Beispiel 1:
DECLARE FUNCTION twice (x AS INTEGER) AS INTEGER
FUNCTION twice (x AS INTEGER) AS INTEGER
RETURN x * 2
PRINT "Diese Zeile wird nie ausgegeben"
END FUNCTION
PRINT twice (10) ' gibt 20 aus, das Doppelte von 10
SLEEP
Beispiel 2: Rückgabe eines ganzen UDTs:
TYPE udt
v1 AS INTEGER
v2 AS INTEGER
END TYPE
DECLARE FUNCTION bla(foo AS INTEGER, bar AS INTEGER) AS udt
DIM variable AS udt
variable = bla(1, 3)
PRINT "Variable: v1 ="; variable.v1; ", v2 ="; variable.v2
'Ausgabe: "Variable: v1 = 10, v2 = 30"
SLEEP
FUNCTION bla(foo AS INTEGER, bar AS INTEGER) AS udt
DIM variable AS udt
variable.v1 = foo*10
variable.v2 = bar*10
bla = variable
END FUNCTION
Beispiel 3: FUNCTION kann auch Teil eines UDTs sein.
Type MyUDT
x As Integer
y As Integer
z As Integer
Declare Function SumOfAll As Integer
End Type
Function MyUDT.SumOfAll As Integer
Return This.x + This.y + This.z
End Function
Dim variable As MyUDT
With variable
.x = 5
.y = 10
.z = -3
End With
Print variable.SumOfAll
Sleep
Ausgabe:
12
Unterschiede zu QB:
- Parameter können in FreeBASIC optional sein.
- Der Rückgabewert kann in FreeBASIC auch mit FUNCTION = Ausdruck oder RETURN Ausdruck festgelegt werden.
- Funktionen können in FreeBASIC überladen werden.
- Der Rückgabewert kann in FreeBASIC beim Aufruf der Funktion ignoriert werden.
- Der Rückgabewert kann in FreeBASIC auch by reference erfolgen.
Unterschiede zu früheren Versionen von FreeBASIC:
- Seit FreeBASIC v0.90 kann die Rückgabe per BYREF auch by reference erfolgen.
- Bis FreeBASIC v0.17 war es auch zulässig, das Schlüsselwort STATIC links vom Prozedur-Header zu platzieren; seit v0.17 allerdings ist die Form STATIC FUNCTION Name ungültig.
- Seit FreeBASIC v0.17 ist es zulässig, auf Prozedurebene (z.B. innerhalb einer FUNCTION) TYPEs, UNIONs und ENUMs zu erstellen. Außerdem können FUNCTIONs auch innerhalb eines UDTs erstellt werden.
- Seit FreeBASIC v0.16 ist es zulässig, Arrays undefinierter Größe auch innerhalb von FUNCTIONs zu definieren (z.B. DIM AS INTEGER foo()).
- Seit FreeBASIV v0.16 kann GOSUB und ON ... GOSUB nicht mehr auf Prozedurebene eingesetzt werden.
- Das Überladen einer FUNCTION ist seit FreeBASIC v0.14 möglich; siehe OVERLOAD.
- Seit FreeBASIC v0.14 können FUNCTIONs ganze UDTs zurückgeben.
- Seit FreeBASIC v0.14 kann FUNCTION innerhalb von ASM-Blocks eingesetzt werden, um den Rückgabewert zu bestimmen.
- Seit FreeBASIC v0.13 kann RETURN als Shortcut für FUNCTION = Ausdruck : EXIT FUNCTION eingesetzt werden.
- Variable Argumente sind seit FreeBASIC v0.13 möglich; siehe VA_ARG.
- Seit FreeBASIC v0.13 können optionale Parameter auch bei Strings eingesetzt werden.
- Seit FreeBASIC v0.13 kann der Rückgabewert auch über FUNCTION = Ausdruck gesetzt werden.
- Seit FreeBASIC v0.12 müssen in den DECLARE-Zeilen keine Parameter-Namen mehr genannt werden; es ist jedoch immer noch zulässig.
Unterschiede unter den FB-Dialektformen:
- In der Dialektform -lang fb werden Parameter standardmäßig BYVAL übergeben. In den Dialektformen -lang qb und -lang fblite ist die Standardübergabe BYREF. Siehe die zugehörigen Referenzeinträge für genauere Informationen.
- In den Dialektformen -lang qb und -lang fblite kann RETURN nur eingesetzt werden, wenn OPTION GOSUB ausgeschaltet ist. In der Dialektform -lang qb muss dies explizit durch OPTION NOGOSUB festgelegt werden.
Siehe auch:
SUB, PROPERTY, DECLARE, OVERLOAD, EXIT, END, BYVAL, BYREF, BYREF (Rückgaben), BYVAL (Rückgaben), SHARED, PRIVATE (Klausel), PUBLIC (Klausel), VA_ARG, Prozeduren, FUNCTIONs, Parameterübergabe
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|