Re: VariantBool, Bool, Int, False, And Not
- From: "Thorsten Albers" <albersRE@xxxxxxxxxxxxxxxxxxx>
- Date: Thu, 11 Jan 2007 18:52:53 -0800
Alexander Mueller <millerax@xxxxxxxxxxx> schrieb im Beitrag
<ut3IoVeNHHA.3952@xxxxxxxxxxxxxxxxxxxx>...
Testcase, reproduzierbar:
Option Explicit
'# Hier Rückgabewert einstellen #'
Const RETVAL As Long = 1& '' -1&
Function B1() As Boolean
Dim b As Boolean
CopyVariant b
B1 = b
End Function
'simuliert lesen des ADO-Wertes und Variant-Rückgabe
Sub CopyVariant(ByRef v As Variant)
v = CLng(RETVAL)
End Sub
Der eigentliche Lapsus von VB liegt meines Erachtens hier darin, daß für
"ByRef v As Variant" die Übergabe eines Boolean zugelassen wird. Eigentlich
müßte VB hier einen Fehler erzeugen, denn ein Boolean kann nicht als ein
Zeiger auf einen Variant übergeben werden.
Das ginge allenfalls über einen Interims-Variant, also:
Call CopyVariant(b)
* intern: cast b -> v
* intern: -> CopyVariant(Zeiger auf v)
v = CLng(RETVAL)
* intern: cast vTmp -> b
b wäre dann 0 oder -1
Daß das nicht passiert, zeigt folgendes:
Function B1() As Boolean
Dim b As Boolean, i As Integer
CopyVariant b
Call CopyMemory(i, b, 2)
MgBox "W = " & Hex$(i) & "h"
B1 = b
End Function
Sub CopyVariant(ByRef v As Variant)
v = 5
End Sub
In B1() wird jetzt "W = 5h" ausgegeben, korrekt wäre "W = FFFFh".
Obwohl VarType(v) in CopyVariant() 11 = Boolean ergibt, wird 5 in "v = 5"
nicht in einen bool'schen Wert gecastet, offensichtlich da "v" ja als
Variant gilt, dem 'alles' zugewiesen werden kann. Interessanterweise
funktioniert
v = "Test"
nicht, dabei wird ein Fehler erzeugt (Typen unverträglich).
Daraus läßt sich schließen:
- ByVal x As Variant kann jeden beliebigen Datentyp-Wert übernehmen; in der
Funktion ist x dann auch wirklich ein Variant
- ByRef x As Variant kann jeden beliebigen Datentyp-Zeiger übernehmen; in
der Funktion ist x dann eine Variable von dem Datentyp, dessen Zeiger
übergeben wurde; d.h. "ByRef As Variant" ist hier gleichbedeuten mit "ByRef
As Any".
Fazit:
Führe ein explizites, korrektes type casting durch à la
Sub CopyVariant(ByRef v As Variant)
v = CBool(RETVAL)
End Sub
oder deklariere mit einem anderen Datentyp als Variant.
Übrigens: Ist die 5 erst einmal in dem Boolean, läßt sie sich so ohne
weiteres offenbar nicht herausbekommen:
Function B1() As Boolean
Dim b As Boolean, c As Boolean, i As Integer
CopyVariant b
c = CBool(b)
Call CopyMemory(i, c, 2)
MgBox "W = " & Hex$(i) & "h"
B1 = b
End Function
Sub CopyVariant(ByRef v As Variant)
v = 5
End Sub
Ergibt immernoch "W = 5h", genauso wie
i As Integer
i = B1()
MsgBox "W = " & Hex$(i) & "h"
--
----------------------------------------------------------------------
THORSTEN ALBERS Universität Freiburg
albers@
uni-freiburg.de
----------------------------------------------------------------------
.
- Follow-Ups:
- Re: VariantBool, Bool, Int, False, And Not
- From: Schmidt
- Re: VariantBool, Bool, Int, False, And Not
- References:
- Re: VariantBool, Bool, Int, False, And Not
- From: Harald M. Genauck
- Re: VariantBool, Bool, Int, False, And Not
- Prev by Date: Re: Emulator für Betriebssystem?
- Next by Date: Re: Emulator für Betriebssystem?
- Previous by thread: Re: VariantBool, Bool, Int, False, And Not
- Next by thread: Re: VariantBool, Bool, Int, False, And Not
- Index(es):
Relevant Pages
|