[gelöst] Arrays als ByValue übergeben
Verfasst: Sa 26. Sep 2015, 17:23
Ich habe eine Feldsortierprozedur aus einer MS Office Datei übernommen, die dort fehlerfrei funktioniert.
Mit unten stehendem Code habe ich getestet und festgestellt, dass zwar eine Reihenfolge oder das sortierte Feld ausgegeben wird,
jedoch scheinbar auch das Originalfeld mitsortiert wird.
An dieser Stelle erwarte ich eigentlich, dass eine Kopie der Feldvariablen (K = byRef von sortfeld) übergeben wird.
Allerdings werden in der nachfolgenden Funktion
immer alle Variablen gleichzeitig verändert (also K;X(aus fc_Sortieren) und sortfeld (aus fc_sortieren_X).
Z erhält zwar korrekterweise die ID Reihenfolge (also Z(0) = 4...) jedoch ist K(0) = 15
Selbst, wenn ich statt X = sortfeld
einbaue, werden immer alle Variablen mitverändert. Auch eine Namensänderung der Variablen hilft nicht.
Ist das ein BUG?
Wie kann ich es erreichen, dass nur eine Kopie des Feldes an die untergeordnete Sortierfunktion übergeben wird?
Ein ByVal als Prozedurübergabewert muss leider ausfallen, da die Funktion (eigentlich) beides kann:
Felder sortieren und das Originalfeld unangetastet lassen.
Mit unten stehendem Code habe ich getestet und festgestellt, dass zwar eine Reihenfolge oder das sortierte Feld ausgegeben wird,
jedoch scheinbar auch das Originalfeld mitsortiert wird.
Code: Alles auswählen
Sub test
dim K (4) as integer
dim Z(4) as integer
K(0) = 10
K(1) = 9
K(2) = 8
K(3) = 7
K(4) = 15
Z = fc_Sortieren(K,0,1)
end sub
Function fc_Sortieren(ByRef sortfeld As Variant, pruefdimension%, Sortiervariante As Integer) As Variant
Dim X As Variant, Ergebnisfeld As Variant, X2 As Variant
...
Select Case Sortiervariante
Case 1: ' Das übergebene Feld wird nicht sortiert - Ausgabe einer Sortierreihenfolge
X = sortfeld
fc_Sortieren = fc_Sortieren_X(X, pruefdimension, Dimension, True)
....
Allerdings werden in der nachfolgenden Funktion
Code: Alles auswählen
Function fc_Sortieren_X(ByRef sortfeld As Variant, pruefdimension%, Dimension As Integer, IDfeldausgabe As Boolean) As Variant
...
Dim IDfeld() As Integer
<sortfeld und IDfeld werden bearbeitet>
...
<>
If IDfeldausgabe Then fc_Sortieren_X = IDfeld
Z erhält zwar korrekterweise die ID Reihenfolge (also Z(0) = 4...) jedoch ist K(0) = 15
Selbst, wenn ich statt X = sortfeld
Code: Alles auswählen
Function fc_Wert (byval XY as variant) as variant
fc_Wert = XY
end function
Ist das ein BUG?
Wie kann ich es erreichen, dass nur eine Kopie des Feldes an die untergeordnete Sortierfunktion übergeben wird?
Ein ByVal als Prozedurübergabewert muss leider ausfallen, da die Funktion (eigentlich) beides kann:
Felder sortieren und das Originalfeld unangetastet lassen.