Referenz - BYVAL (Klausel)
Syntax: [DECLARE] { SUB | FUNCTION } Name (BYVAL parameter AS Typ, ...) [AS Typ]
Typ: Klausel
Kategorie: Deklaration
BYVAL legt in einer Parameterliste fest, dass ein Parameter 'by value', also als Wert statt als direkte Referenz übergeben werden soll. Die Klausel kann bei der Deklaration bzw. Definition einer Prozedur angegeben werden; siehe dazu der Referenzeintrag Parameterübergabe. Zur Syntax siehe auch DECLARE, SUB und FUNCTION.
Bei einer BYVAL übergebenen Variable wird beim Prozeduraufruf eine Kopie der Variablen erstellt und nur diese an die Prozedur weitergegeben. Wird innerhalb der Prozedur der Wert geändert, hat das keine rückwirkenden Auswirkungen auf die ursprünglich übergebene Variable. Im Gegensatz dazu übergibt BYREF die Variable als Referenz; eine Änderung der übergebenen Variablen innerhalb der Prozedur bleibt dann auch nach Ende der Prozedur erhalten.
In der aktuellen Version von FreeBASIC werden Zahlendatentypen (z. B. INTEGER, SINGLE) standardmäßig BYVAL übergeben; die Verwendung des Schlüsselwortes ist in diesem Fall überflüssig.
STRINGs und UDTs werden BYREF übergeben. BYVAL hat bei Strings eine andere Bedeutung: statt einer Kopie des Strings wird ein ZSTRING PTR auf den Stringinhalt übergeben. Der String sollte innerhalb der Prozedur nicht verändert werden, da die Adresse des Strings nicht aktualisiert wird. Das Verhalten von BYVAL bei String-Variablen kann sich in zukünftigen Versionen ändern; deshalb sollte man die Verwendung vermeiden und lieber ZSTRING einsetzen.
Arrays werden immer BYREF übergeben; eine Verwendung des Schlüsselwortes BYVAL führt bei Arrays zu einer Fehlermeldung.
Beachten Sie aber auch die Unterschiede unter den Dialektformen und zu früheren Compiler-Versionen!
Beispiel:
DECLARE SUB MySub (BYVAL a AS INTEGER, BYREF b AS INTEGER)
DIM AS INTEGER a = 1, b = 1
PRINT "Vor Subaufruf:"
PRINT "a = "; a
PRINT "b = "; b
PRINT
MySub a, b
PRINT "Nach Subaufruf:"
PRINT "a = "; a
PRINT "b = "; b
SLEEP
SUB MySub (BYVAL a AS INTEGER, BYREF b AS INTEGER)
a += 1
b += 1
PRINT "In der Sub:"
PRINT "a = "; a
PRINT "b = "; b
PRINT
END SUB
Ausgabe:
Vor Subaufruf:
a = 1
b = 1
In der Sub:
a = 2
b = 2
Nach Subaufruf:
a = 1
b = 2
Beispiel mit ZStrings:
Declare Sub MySub (ByVal a As ZString Ptr)
Dim As ZString Ptr a = @"normal"
Print "Vor Subaufruf:"
Print "a = "; *a
Print
MySub a
Print "Nach Subaufruf:"
Print "a = "; *a
Sleep
Sub MySub (ByVal a As ZString Ptr)
a = @"veraendert"
Print "In der Sub:"
Print "a = "; *a
Print
End Sub
Ausgabe:
Vor Subaufruf:
a = normal
In der Sub:
a = veraendert
Nach Subaufruf:
a = normal
Hinweis:
Seit FreeBASIC v0.90 kann BYVAL auch bei der Rückgabe per RETURN und FUNCTION verwendet werden.
Unterschiede zu QB:
In QB werden Variablen standardmäßig BYREF übergeben.
Unterschiede zu früheren Versionen von FreeBASIC:
- Seit FreeBASIC v0.90 wird BYVAL auch zusammen mit RETURN und 'FUNCTION = ' verwendet.
- Bis einschließlich FreeBASIC v0.16 wurden Variablen standardmäßig BYREF übergeben.
Unterschiede unter den FB-Dialektformen:
In der Dialektform -lang qb, -lang deprecated und -lang fblite werden Variablen standardmäßig BYREF übergeben.
Siehe auch:
BYVAL (Schlüsselwort), BYREF, Parameterübergabe, BYVAL (Rückgaben)
Zusätzliche Informationen und Funktionen | ||||
---|---|---|---|---|
|