Arrays richtig behandeln VB2010
-
Hallo ins Forum,
ist nicht ganz das richtige Forum hier ...
dennoch ein Frage zu MS VB 2010 Express.Sub test1 funzt wie erwartet > Sub test2 NICHT
was genau passiert da ?REM in VB Basic funzt das test2 nicht
Dim A(2) As BooleanSub test()
m: A(1) = Not A(1)
REM test1(A)
test2(A)
GoTo m
End SubSub test1(ByVal ar() As Boolean)
Static v(2) As Boolean
Debug.Print("REM 1 >> " & ar(1) & " / " & v(1))
v(1) = ar(1)
Debug.Print("REM 2 >> " & ar(1) & " / " & v(1))
End Sub
REM 1 >> True / False
REM 2 >> True / True
REM 1 >> False / True
REM 2 >> False / False
REM 1 >> True / False
REM 2 >> True / True
REM 1 >> False / True
REM 2 >> False / False
REM 1 >> True / False
REM 2 >> True / True
REM 1 >> False / True
REM 2 >> False / FalseSub test2(ByVal ar() As Boolean)
Static v(2) As Boolean
Debug.Print("REM 1 >> " & ar(1) & " / " & v(1))
v = ar
Debug.Print("REM 2 >> " & ar(1) & " / " & v(1))
End Sub
REM 1 >> True / False
REM 2 >> True / True
REM 1 >> False / False
REM 2 >> False / False
REM 1 >> True / True
REM 2 >> True / True
REM 1 >> False / False
REM 2 >> False / False
REM 1 >> True / True
REM 2 >> True / True
REM 1 >> False / False
REM 2 >> False / FalseViele Dank für's Lesen und Nachdenken
mfg kaben
-
Arrays sind in .NET (und damit auch in VisualBasic .NET) Reference-Types.
D.h. wenn duv = ar
schreibst, dann werden nicht die Werte im Array
ar
in das Arrayv
kopiert! Sondern es wird bloss geändert auf welches Array-Objekt die Variablev
zeigt (nämlich auf das selbe Array-Objekt worauf auchar
zeigt).v
zeigt also danach auf das selbe Array wiear
, und damit auf das selbe Array wieA
. Was dann auch das beobachtete Verhalten erklärt.Das
ByVal
beim Parameter bezicht sich also nicht auf den Array-Inhalt, sondern auf die Referenz.
DasByVal
bewirkt hier also nur dass du intest2
nicht ändern kannst auf welches ArrayA
zeigt.Das ist zugegebenermassen etwas verwirrend. Und auch etwas unpraktisch. Es ist allerdings vollkommen logisch, und wenn man es erstmal behirnt hat gewöhnt man sich auch irgendwann daran.
-
Was erwartest du, was passiert stattdessen?
Zuweisung von Arrays in VB ist keine tiefe Kopie. Es wird quasi nur Größeninformation zugewiesen, sowie ein Zeiger auf die Daten. Das heißt bei test1 weist du dem zweiten Wert in v tatsächlich einen neuen Wert zu, in test2 machst du v hingegen zu einer Referenz auf das Array A. OB du das nun erwartest oder nicht, können wir nicht wissen, aber das ist der wesentliche Unterschied.
edit: Zu langsam. Ich habe nie mit VB gearbeitet und musste erst nachschlagen, wie die Sprache funktioniert
-
Hallo hustbaer & SeppJ,
die Erklärungen habe ich verstanden und beantworten meine Frage.
Vielen Dank für die schnelle Antwort.mfg kaben