Referenz - BYREF (Rückgaben)
Syntax: [DECLARE] FUNCTION Name (...) BYREF AS Typ
Typ: Klausel
Kategorie: Deklaration
BYREF definiert, dass die Rückgabe der Funktion nicht als reiner Wert (by value) sondern als Referenz (by reference) erfolgen soll. Eine solche Funktion übergibt die Adresse des Rückgabewerts, statt eine Kopie davon zu erstellen und diese zu übergeben. Dadurch kann der Rückgabewert direkt über die Funktion geändert werden.
Wird BYREF nicht angegeben, übergibt die Funktion standardmäßig nur den Wert.
Funktionen, die BYREF zurückgeben, dürfen keine lokalen Variablen der Funktion zurückgeben, da diese nach dem Verlassen der Funktion gelöscht werden. Der Versuch, diese dann zu manipulieren, kann zu Abstürzen des Programms führen. Um dies zu verhindern, wird der Compiler bei dem Versuch eine Fehlermeldung ausgeben.
Soll der Wert der Rückgabe über die Funktion geändert werden, sollte '=>' verwendet werden. Siehe dazu den Referenzeintrag Zuweisung. Alternativ kann die Funktion in eine zusätzliche Klammer gesetzt werden (vgl. Beispiel 2). Dies ist nötig, damit der Compiler den Aufruf richtig lesen kann und ihn nicht für einen Vergleich hält.
Auch globale und Member-Operatoren können mit dieser Syntax BYREF zurückgeben, sofern sie wie eine Funktion aufgerufen werden.
Beispiel 1:
Function f ByRef As Const ZString
Return "abcd"
End Function
Print f
Sleep
Hinweis: Wenn Beispiel 1 in UTF mit BOM gespeichert wird, interpretiert der Compiler den String-Literal als WSTRING, was in diesem Fall eine Compiler-Warnung und eine falsche Rückgabe hervorruft.
Beispiel 2:
Dim Shared As String s
Function f1 ByRef As String
Return s
End Function
Function f2(ByRef _s As String) ByRef As String
Return _s
End Function
s = "abcd"
Print s
f1 &= "efgh"
Print s
(f2(s)) &= "ijkl"
Print s
Sleep
Beispiel 3:
Function power2(ByRef _I As Integer) ByRef As Integer
_I *= _I
Return _I
End Function
Dim As Integer I = 2
power2( power2( power2( I ) ) )
Print I
Sleep
Unterschiede zu QB: neu in FreeBASIC
Unterschiede zu früheren Versionen von FreeBASIC: existiert seit FreeBASIC 0.90
Siehe auch:
BYVAL (Rückgaben), FUNCTION, BYREF, FUNCTIONs, Parameterübergabe
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|