Forums Neueste Beiträge
 
Tags Keywords

ByRef

01/08/2011 - 18:08 von Heinz-Mario Frühbeis | Report spam
Hallo!

Folgendes:
' Eine Funktion mit ByRef-Parameter
Public Function DoSome(ByRef vTop As Long)
' ...
End Function

Der Aufruf:
ClassX.DoSome GetTop(50)

Private Function GetTop(Start As Long, defHeight As Long) ' <- IIRC hier ist
der Defaultwert = Variant
Dim i As Integer
GetTop = Start
For i = 1 To col.Count
GetTop = GetTop + defHeight
Next i
End Function

Beim Aufruf gibt es kein Gemecker bezgl. 'Long', da ja die Funktion
"eigentlich" einen Wert vom Typ Variant einreicht.
Ist das iO so?
Liegt das evt. daran, das in GetTop "nur" Long-Werte verarbeitet werden?
Und bedeutet dies, das VB das intern checked und für "Gut" (für 'Long')
befindet und das dies "nur" Performanceeinbusse bedeutet?
IIRC wird z. Bsp. ein Integer-Typ beim Verlangen nach einem Long-Wert nicht
verarbeitet.

Würde mich halt mal interessieren.

Mit Gruß
Heinz-Mario Frühbeis
 

Lesen sie die antworten

#1 Ulrich Korndoerfer
01/08/2011 - 22:16 | Warnen spam
Heinz-Mario Frühbeis schrieb:
Hallo!

Folgendes:
' Eine Funktion mit ByRef-Parameter
Public Function DoSome(ByRef vTop As Long)
' ...
End Function

Der Aufruf:
ClassX.DoSome GetTop(50)

Private Function GetTop(Start As Long, defHeight As Long) ' <- IIRC hier
ist der Defaultwert = Variant
Dim i As Integer
GetTop = Start
For i = 1 To col.Count
GetTop = GetTop + defHeight
Next i
End Function

Beim Aufruf gibt es kein Gemecker bezgl. 'Long', da ja die Funktion
"eigentlich" einen Wert vom Typ Variant einreicht.
Ist das iO so?
Legt das evt. daran, das in GetTop "nur" Long-Werte verarbeitet werden?
Und bedeutet dies, das VB das intern checked und für "Gut" (für 'Long')
befindet und das dies "nur" Performanceeinbusse bedeutet?
IIRC wird z. Bsp. ein Integer-Typ beim Verlangen nach einem Long-Wert
nicht verarbeitet.

Würde mich halt mal interessieren.




DoSome erwartet von der Signatur her (ByRef ...) etwas, was man ByRef
(also als Pointer) übergeben kann. Das muß deshalb eine Variable vom Typ
Long ein:

Dim MyLong As Long
MyLong = 5
DoSome MyLong

Hier wird an DoSome die Adresse, an der der Wert steht, übergeben (also
die Variablenadresse oder anders ausgedrückt ein Pointer auf die Variable).

VB6 erlaubt aber auch folgendes:

DoSome 1 + 4

In diesem Fall erzeugt VB6 eine verborgene, temporàre Variable vom Typ
Long, weist dieser das Ergebnis des Ausdrucks (1+4=5) zu und übergibt
eine Referenz (die Adresse) dieser verborgenen Variablen an DoSome.
Innerhalb von DoSome kann man sogar den Wert dieser verborgenen
Variablen àndern.

Nach der Rückkehr aus DoSome wird diese temporàre Variable sozusagen
"weggeworfen", VB6 interessiert sich nicht im geringsten für das, was
mit der verborgenen Variablen in DoSome angestellt wurde.

Im Falle

DoSome GetTop(50)

besteht der Ausdruck aus dem Rückgabewert von GetTop. Dieser
Rückgabewert wird an die verborgene Variable vom Typ Long übergeben. Da
der Rückgabewert von GetTop vom Typ Variant ist, wird bei der Zuweisung
an die verborgene Variable von VB noch eine Typumwandlung auf Long
durchgeführt. Prinzipiell geht das also in Ordnung. Allerdings bekommst
Du Ärger, wenn in der zurückgegebenen Variant irgendetwas, wie zB ein
String, steht, der nicht in einen Long-Wert verwandelt werden kann, zB.
"wrtlprmft" als Inhalt des Rückgabewertes von GetTop (prinzipiell
möglich, da es ja eine Variant ist). In dem Fall würde VB einen
Umwandlungsfehler werfen.

Generell solltest Du Variants als Variablentyp meiden, auf jeden Fall
dann, wenn ein anderer Typ ausreicht. Variants kosten immer Performance.

Um hier auch gleich mit einem hàufig vorzufindendem Mißverstàndnis
aufzuràumen: eine Variable vom Typ Variant hat als Inhalt nicht etwas
von beliebigem Typ! Eine Variable vom Typ Variant hat immer Inhalt eines
bestimmten Typs, zB ein Long, ein String, eine Variant (ja, Variable vom
Typ Variant können eine Referenz auf einen Wert vom Typ Variant
enthalten, der seinerseits wiederum einen Typ hat). Der Inhalt einer
Variablen vom Typ Variant hat zu jeder Zeit einen Typ (erlaubt sind alle
Typen, die VB so kennt).

ZB:

Dim V As Variant

V = CLng(1) 'der Inhalt von V hat den Typ Long
V = "1" 'Typ String

etc.

Und die Übergabe eines Parameters ByRef an eine Prozedur sollte man in
der Regel nur dann verwenden, wenn eine Variable als Parameter übergeben
wird und diese Variable innerhalb der Prozedur geàndert werden soll!

Ulrich Korndoerfer

VB tips, helpers, solutions -> http://www.prosource.de/Downloads/
MS Newsgruppen Alternativen -> http://www.prosource.de/ms-ng-umzug.html

Ähnliche fragen