Wieso geht das und was passiert da?

22/05/2014 - 00:34 von Wolfgang Enzinger | Report spam
Hallo,

folgender Code gibt mir leichte Ràtsel auf:

*********************************************
Sub Main()
Const XYZ As Long = 1000
Const ABC As String = "foo"
Call TestLong(XYZ)
Call TestString(ABC)
End Sub
*********************************************
Private Sub TestLong(ByRef l As Long)
l = -1
End Sub
*********************************************
Private Sub TestString(ByRef s As String)
s = "bar"
End Sub
*********************************************

Man beachte, dass die Parameter an die Unterprozeduren TestLong und TestString
"ByRef" übergeben werden. Sub Main übergibt also jeweils die *Adresse* einer
*Konstanten*, an diese Adresse wird dann in der Unterprozedur ein neuer Wert
geschrieben. In der Unterprozedur nimmt die (scheinbare) Variable tatsàchlich
den neuen Wert an, zumindest kann man das in der IDE so beobachten. Nach
Rückkehr zu Sub Main hat die Konstante aber wieder den alten Wert, was ja auch
so sein soll, denn dafür ist die Konstante schliesslich konstant. *g*

Frage: wohin wird der neue Wert denn nun tatsàchlich geschrieben?
Offensichtlich an die Adresse der Konstanten, aber irgendwie auch nicht ... ?!
Ist das ein Feature, das man - gewollt oder nicht - so stehenlassen kann, oder
kann das unerwünschte Nebenwirkungen haben?

Viele Grüsse,
Wolfgang
http://www.enzinger.net
 

Lesen sie die antworten

#1 Ulrich Korndoerfer
22/05/2014 - 04:32 | Warnen spam
Hallo Wolfgang,

Wolfgang Enzinger schrieb:
Hallo,

folgender Code gibt mir leichte Ràtsel auf:

*********************************************
Sub Main()
Const XYZ As Long = 1000
Const ABC As String = "foo"
Call TestLong(XYZ)
Call TestString(ABC)
End Sub
*********************************************
Private Sub TestLong(ByRef l As Long)
l = -1
End Sub
*********************************************
Private Sub TestString(ByRef s As String)
s = "bar"
End Sub
*********************************************

Man beachte, dass die Parameter an die Unterprozeduren TestLong und TestString
"ByRef" übergeben werden. Sub Main übergibt also jeweils die *Adresse* einer
*Konstanten*, an diese Adresse wird dann in der Unterprozedur ein neuer Wert
geschrieben. In der Unterprozedur nimmt die (scheinbare) Variable tatsàchlich
den neuen Wert an, zumindest kann man das in der IDE so beobachten. Nach
Rückkehr zu Sub Main hat die Konstante aber wieder den alten Wert, was ja auch
so sein soll, denn dafür ist die Konstante schliesslich konstant. *g*

Frage: wohin wird der neue Wert denn nun tatsàchlich geschrieben?
Offensichtlich an die Adresse der Konstanten, aber irgendwie auch nicht ... ?!
Ist das ein Feature, das man - gewollt oder nicht - so stehenlassen kann, oder
kann das unerwünschte Nebenwirkungen haben?




VB erlaubt es, *Ausdrücke* "ByRef" an Methoden zu übergeben. "Call
TestLong(41)" wàre zB ok. Da wegen "ByRef" von der Methode in ihrem
Rumpf eine Adresse erwartet wird, erzeugt VB vor dem Aufruf der Methode
eine temporàre, lokale Variable, weist dieser den Wert des Ausdrucks zu,
übergibt die Adresse der temporàren Variablen an die Methode und wirft
die temporàre Variable nach der Rückkehr aus der Methode wieder weg.

Ulrich Korndoerfer

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

Ähnliche fragen