Re: VariantBool, Bool, Int, False, And Not

Tech Tip: Click here to run a free scan for Windows Errors and optimize PC performance



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
----------------------------------------------------------------------

.



Relevant Pages

  • Re: Boolean-Variable per default auf FALSE?
    ... kein Boolean, er kann einen beinhalten. ... Ja, genau das hat er auch, nämlich False oder True. ... Ein Variant kann alles mögliche, ... Select Case VarType ...
    (microsoft.public.de.vb)
  • Re: Empty array?
    ... > Private Sub collectUniqueSitesAs String, ... > Dim fAddValue As Boolean ... Function IsArrayBounded(ArrayIn As Variant) As Boolean ...
    (microsoft.public.vb.general.discussion)
  • Re: Detecting type of variable ?
    ... Debug program for Generic Boolean Operations. ... function HasBooleanValue(ParaVariable: variant): boolean; ... function GenericIsTrue(ParaVariable: variant): boolean; ... GeneralFalse: variant; ...
    (alt.comp.lang.borland-delphi)
  • Re: App does not shut down on exiting the db
    ... Dim tfBool as Boolean ... BTW, in regard to implicit references, I believe I recently resolved ... Public Function ConcMemos(varMemo1 As Variant, ... Public Function ConcMemos(ByVal varMemo1 As Variant, ...
    (microsoft.public.access.modulesdaovba)
  • Re: Boolean-Variable per default auf FALSE?
    ... Ein Variant vom Subtyp VT_BOOL aka vbBoolean, ... kein Boolean, er kann einen beinhalten. ... The True keyword has a value equal to -1. ... Operation mit And, Or und v.a. Not der Fall ist, bei Not ist es ...
    (microsoft.public.de.vb)