Structure probleme!

  • VB.NET

Es gibt 6 Antworten in diesem Thema. Der letzte Beitrag () ist von fegl84.

    Structure probleme!

    Hallo liebe Community-Mitglieder,

    ich habe hier ein (sehr) spezielles Problem.

    Für mein Projekt habe ich mehrere Structure, u.a. einige Datentypen als List(of Structure) deklariert. Wenn ich diese Structur nochmal ins List(of Structure) speichere, wiederholt sich die Daten aus der Array, d.H. jede Array-Eintrag im Structur enthält identische Array-Einträge. Nicht-Array-Daten sind korrekt geblieben.

    Woran liegt es? Wie löse ich das Problem am bestens?

    Gerne gebe ich die Quellcode-Ausschnitte frei:

    Structure:

    VB.NET-Quellcode

    1. Private Structure mFace
    2. Dim datei As String
    3. Dim dreieck_ref As List(Of Dreieck_int)
    4. Dim koordinaten_ref As List(Of Punkt)
    5. Dim kanten_ref As List(Of Kanten_int)
    6. Dim kanten_rand As List(Of Kanten_int)
    7. Dim k_fehler As Boolean
    8. Dim p_fehler As Boolean
    9. Dim r_fehler As Boolean
    10. End Structure
    11. Private Structure Dreieck
    12. Dim p1 As Punkt
    13. Dim p2 As Punkt
    14. Dim p3 As Punkt
    15. End Structure
    16. Private Structure Dreieck_int
    17. Dim k1 As Integer
    18. Dim k2 As Integer
    19. Dim k3 As Integer
    20. End Structure
    21. Private Structure Punkt
    22. Dim x, y, z As Double
    23. End Structure
    24. Private Structure Kanten
    25. Dim P1, P2 As Punkt
    26. End Structure
    27. Private Structure Kanten_int
    28. Dim P1, P2 As Integer
    29. End Structure


    List(of) als Globale Variable:

    VB.NET-Quellcode

    1. Dim koor_ref As New List(Of Punkt)
    2. Dim k_ref As New List(Of Kanten_int)
    3. Dim dr_ref As New List(Of Dreieck_int)
    4. Dim k_rand As New List(Of Kanten_int)
    5. Dim k_fehler, p_fehler, r_fehler As Boolean



    VB.NET-Quellcode

    1. Private Sub analysiere_gesamtmodell()
    2. Button4.Enabled = False
    3. Dim i As Integer
    4. Dim Daten As New List(Of mFace)
    5. For i = 0 To list_files.Count - 1 Step 1
    6. Dim datei As mFace
    7. Dim dreiecke As New List(Of Dreieck_int)
    8. Dim koor As New List(Of Punkt)
    9. Dim ka As New List(Of Kanten_int)
    10. Dim rand_kanten As List(Of Kanten_int)
    11. Dim d_path As String
    12. ListView_fuellen(d_path)
    13. dreiecke = dr_ref
    14. koor = koor_ref
    15. ka = k_ref
    16. rand_kanten = k_rand
    17. datei.datei = list_files(i).ToString()
    18. datei.dreieck_ref = dreiecke
    19. datei.koordinaten_ref = koor
    20. datei.kanten_ref = ka
    21. datei.kanten_rand = rand_kanten
    22. datei.k_fehler = k_fehler
    23. datei.p_fehler = p_fehler
    24. datei.r_fehler = r_fehler
    25. Daten.Add(datei)
    26. Next
    27. End Sub



    Vielen Dank für eure Hilfe.

    Gruß
    Flo

    P.S. Bin kein Anfänger, sondern umsteiger.
    Es sieht so aus, als ob Du immer auf dieselbe Instanz von mFace zugreifst.
    Wenn Du aus der Hauptstruktur eine Klasse machst und eine Instanz mit New erstellst, sollte es problemlos gehen.
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. Private Structure Kanten_int
    2. Dim P1, P2 As Integer
    3. End Structure
    ==>

    VB.NET-Quellcode

    1. Private Class Kanten_int
    2. Dim P1, P2 As Integer
    3. End Class
    und

    VB.NET-Quellcode

    1. Dim kk As Kanten_int
    2. ' ==>
    3. Dim kk As New Kanten_int
    und fertich. :thumbsup:
    Falls Du diesen Code kopierst, achte auf die C&P-Bremse.
    Jede einzelne Zeile Deines Programms, die Du nicht explizit getestet hast, ist falsch :!:
    Ein guter .NET-Snippetkonverter (der ist verfügbar).
    Programmierfragen über PN / Konversation werden ignoriert!

    VB.NET-Quellcode

    1. dreiecke = dr_ref
    2. koor = koor_ref
    3. ka = k_ref
    4. rand_kanten = k_rand

    Toll. Es wird ein Object "neu" erzeugt und dann werden ALLE auf den Wert der globalen Variable gesetzt. Und da es sich um eine List(Of T) handelt, zeigen nachher dröflzig "Zeiger" auf ein und dasselbe Objekt. Dh ändere ich etwas in EINEM Objekt, betrifft das ALLE.

    Wenn es sich um "Default"-Werte handelt -> KOPIEREN und nicht einfach "=" setzen!

    zb: ListeA.AddRange(ListeB.ToArray)