Beim NDS Crowding Distance Sort wird das Struct schlicht mit = kopiert. Durch das late Binding wird quasi die Refernz kopiert. Führt wahrscheinlich zu dem Fehler den Felix beobachtet hat. Punkte die hinter den Constrains liegen werden dann mit in die SecPop genommen.
huebner on 2007-09-24:
Fehler tritt auf wenn Array mit dem = Operator kopiert werden. Dann wird per Ref. kopiert:
Dim Array_A(1) As Double
Dim Array_B(1) As Double
Array_A(0) = 5
Array_A(1) = 6
Array_B = Array_A ByRef
Array.Copy(Array_A, Array_B, 2) ByVal
Array_B(0) = 8
Array_A(1) = 9
liefert für Array_A: 8 und 9 und für Array_B: 8 und 9
froehlich on 2007-09-24:
und wenn ein Struct kopiert wird, dass Arrays enthält? was geschieht dann mit den Arrays?
huebner on 2007-09-24:
Beim kopieren von Structs tritt das gleiche Verhalten auf. Wird ein Struct mit:
Struct_B(0) = Struct_B(0) kopiert
Dann werden die einzelnen Variablen zwar ByVal kopiert, aber die Arrays
des gleichen Structs ByRef.
huebner on 2007-09-24:
Das ganze läst sich mit Array.copy oder .clone lösen.
Die .clone Method geht nur direct by Arrays. Nicht Arrays die Structs enthalten.
huebner on 2007-09-24:
Auch mit: Array.Copy(List_Childs, Memory, 1) ist der Sache nicht beizukommen, wenn das Array aus einem Struct besteht und Arrays enthält.
huebner on 2007-09-24:
Bei dem Fall dier im NDSorting stimmt die Sache noch weil hier über das Dritte Element Struct kopiert wird. Aber wahrscheinlich nur im ersten Durchgang. Die Referenzen verwurschteln sich sehr wahrscheinlich erst in den nächsten Runden.
Es müssen also für alle Structs des PES, welche Arrays enthalten eigene copy Funktionen geschrieben uns statt dem istgleich operator verwendet werden!
froehlich on 2007-10-04:
Added attachment:PES.vb.patch: Patch um Schleifen bei 1 beginnen zu lassen
Die jetzigen Copy-Funktionen arbeiten mit Schleifen, die bei 0 anfangen. Im PES fangen alle Arrays aber bei 1 an (siehe Bug 135). Deswegen schlage ich folgenden Patch vor.
Christoph, dein Feedback hierzu bitte!
huebner on 2007-10-11:
Klar kann mann machen, aber sollte es nicht das Ziel sein Stück für Stück auf Null basiert umzustellen? Das würde bedeuten wir Dimensionieren die Arrays mit:
ReDim TMP.penalty(NPenalty)
ReDim TMP.penalty(NPenalty - 1)
froehlich on 2007-10-12:
nicht kann... sondern muss! Im jetzigen Zustand treten bei mir Fehler auf!
Alternativ kann man natürlich auch die Redimensionierungen anpassen, so dass die Arrays bei 0 anfangen, aber das wäre ein weit größeres Stück Arbeit...
huebner on 2007-10-15:
Die Schleifen für das Dimit von NDSorting fangen jetzt erst bei 1 statt bei 0 an.
Revision 237.
Comments:
huebner on 2007-09-14:
huebner on 2007-09-24:
froehlich on 2007-09-24:
huebner on 2007-09-24:
huebner on 2007-09-24:
huebner on 2007-09-24:
huebner on 2007-09-24:
huebner on 2007-09-24:
huebner on 2007-09-24:
froehlich on 2007-10-04:
Added attachment:
PES.vb.patch
: Patch um Schleifen bei 1 beginnen zu lassenhuebner on 2007-10-11:
froehlich on 2007-10-12:
huebner on 2007-10-15:
froehlich on 2007-10-15: