Hej. Jag är inte påläst på hur det verkligen fungerar, men en gissning är att en array består av pekare till de riktiga värdena/objekten. ByVal gör då bara en "kopia av pekaren" som ändå pekar på samma värde. Nja, det du gör med ByVal är att du kopierar pekaren till din array och med ByRef skickar du med pekaren direkt. Skillnaden blir att ett argument som skickats ByRef kan peka på nåt helt annat när underproceduren returnerar. Jasså, det är så det ligger till. Tack för svaren förresten! du vill göra en så kallad djup kopiering ? (deep copy). Tyvärr tror jag inte det finns nån inbyggd "deep copy" metod, men det är ju inte svårt att göra själv... Hur fungerar det isåfall? <b>Är det bara att loopa igenom arrayen och kopiera "variabel för variabel"?</b>Array-problem
Finns det någon här som förstår hur detta kan komma sej och vad jag kan göra åt det?
Sub test1()
Dim ar(1), ar2 As Int32
MessageBox.Show(ar(0) & "/" & ar(1) & "/" & ar2)
test2(ar, ar2)
MessageBox.Show(ar(0) & "/" & ar(1) & "/" & ar2)
End Sub
Sub test2(ByVal value1() As Int32, ByVal value2 As Int32)
value1(0) = 10
value1(1) = 20
value2 = 30
End Sub
Kör man test1 returneras 0/0/0 i den första rutan och 10/20/0 i den andra.
Genom att köra test2 har alltså värderna i den ursprungliga arrayen ändrats, men inte i den ursprungliga integern. Ska inte ByVal förhindra detta?
Sv: Bugg i VB 2005 EE?
/JohanSv: Bugg i VB 2005 EE?
T.ex:
Private Sub Button5_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button5.Click
Dim foo() As Integer = {1, 2, 3}
Dim bar() As Integer = {1, 2, 3}
MessageBox.Show("foo: " & foo(0) & "/" & foo(1) & "/" & foo(2))
Test1(foo)
MessageBox.Show("foo: " & foo(0) & "/" & foo(1) & "/" & foo(2))
MessageBox.Show("bar: " & bar(0) & "/" & bar(1) & "/" & bar(2))
Test2(bar)
MessageBox.Show("bar: " & bar(0) & "/" & bar(1) & "/" & bar(2))
End Sub
Private Sub Test1(ByVal anArr As Integer())
Dim anewarr(UBound(anArr)) As Integer
For i As Integer = LBound(anArr) To UBound(anArr)
anewarr(i) = anArr(i) + 1
Next
anArr = anewarr
End Sub
Private Sub Test2(ByRef anArr As Integer())
Dim anewarr(UBound(anArr)) As Integer
For i As Integer = LBound(anArr) To UBound(anArr)
anewarr(i) = anArr(i) + 1
Next
anArr = anewarr
End Sub
foo skickades ByVal och tilldelningen anArr = anewarr i Test1 saknar således konsekvens eftersom anArr i det fallet var en kopierad pekare. I Test2 däremot så ändras verkligen bar att peka på den nya arrayen eftersom den skickades ByRef.
ByRef används ofta för att hålla "extra" resultat av en funktion -- t.ex. funktionen Math.DivRem som returnerar både kvot (via funktionens returvärde) och rest (via en ByRef-parameter).
Sv:Bugg i VB 2005 EE?
Men finns det något sätt man kan kopiera en array till en annan och sedan ändra värderna på den andra utan att de ändras i den första?Sv: Bugg i VB 2005 EE?
Sv:Bugg i VB 2005 EE?
Är det bara att loopa igenom arrayen och kopiera "variabel för variabel"?Sv: Bugg i VB 2005 EE?
Ja
/Johan