Strukturen klonen, wie?

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von prinzkeksdose.

    Strukturen klonen, wie?

    Hallo,

    kann mir mal jemand schnell helfen? Ich will eine Liste mit einer Struktur, die ich selber definiert hab durchrattern(um ein Baumdiagramm zu erstellen), praktisch gesagt so:

    VB.NET-Quellcode

    1. For i = 0 To Liste.Count -1
    2. Dim current As Struktur = Liste(i)
    3. Dim backup As Struktur = current
    4. Liste.RemoveAt(0)' Um sicherzustellen, dass nur Items durchgerattert werden, die schon vorher da waren
    5. For i = 0 To 100
    6. Dim backup2 As Struktur = backup
    7. 'Struktur bearbeiten
    8. Liste.Add(backup2)
    9. Next
    10. Next


    Leider Gottes nimmt der aber bei backup2 immer das selbe Item, da es nur eine Referenz ist.
    Kurz gefasst: Wie kann ich eine Struktur klonen?
    Pack die Zeile

    VB.NET-Quellcode

    1. Dim backup2 As Struktur = backup

    vor die For-Schleife
    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!
    Wie wäre es mit

    VB.NET-Quellcode

    1. Dim backup2 As New Struktur(backup)

    Da musst Du der Struktur natürlich einen entsprechenden New-Operator verpassen.
    Oder Du machst aus der Struktur eine Klasse.
    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!
    Hey, vllt hilft dir das ja

    VB.NET-Quellcode

    1. Structure XY
    2. Implements ICloneable
    3. Function MemberwisedClone() As Object Implements System.ICloneable.Clone
    4. Return MemberwiseClone()
    5. End Function
    6. Public Function Clone() As XY
    7. Return CType(MemberwisedClone(), XY)
    8. End Function
    9. End Structure



    zu sagen wäre da, dass die funktion nur eine flache kopie der instanz erzeugt. Google mal nach deep clone... hab dafür aber auch noch nichts passendes

    PS: verwende doch eine statt struktur eine Klasse. hat meist nur vorteile
    wiso bringt er keinen unterschied?

    einfach "Dim backup2 As Struktur = backup.clone" und fertig. bei mir funktionierts..

    und wenn garnichts funst muss du dir eine eigene ganz eigene clone-funktion schreiben, die jeden einzelnen wert von einer instanz in die andere überträgt..
    Also ich weiß nicht ob ich was übersehen hab, aber ich suche schon seit Stunden den Fehler und hab beides schon Probiert. Code:

    VB.NET-Quellcode

    1. For i = 0 To Liste.Count - 1
    2. Dim current As Struktur = Liste(0)
    3. For e = 1 To Anzahl
    4. Dim backup As New Struktur
    5. backup = current.Clone()
    6. Dim position As Integer = calcposition(Anzahl, current.Position, e)
    7. If Not current.Pfad.Contains(position) Then
    8. backup.Position = position
    9. backup.Pfad = backup.Pfad
    10. backup.Pfad.Add(position)
    11. backup.Struktur = Strukturen(e - 1) * backup.Struktur
    12. Liste.Add(backup)
    13. End If
    14. Next
    15. Liste.RemoveAt(0)
    16. Next
    als erstes fällt mir auf, dass i garnicht verwendet wird?! ist das richtig?

    ich verstehe, ist zwar etwas komisch gelöst aber so ist es einfacher:
    statt liste(0) kannst du ja liste(i) schreiben und das removeat unten fällt weg.

    was ich nicht verstehe ist, was das ganze da machen soll...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „FreakJNS“ ()

    Ja, da es nur um die Anzahl geht. Also es werden hintendran immer wieder neue Items hinzugefügt und vorne das jeweilige Item gelöscht, es soll so sein, dass alle Items bearbeitet werden und gleichzeitg neue hinzugefügt werden.

    Edit: Könnte ich machen, ich will aber die alten Items hinterher weghaben...

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von „prinzkeksdose“ ()

    warum löst du das dann nicht mit einer weiteren liste die später mittels addrange an die andere dran gehängt wird?
    um das ganze übersichtlich zu machen könntest du die ganze bearbeiten in der strukturklasse auslagern oder?

    also ich glaube da kann ich dir nicht weiterhelfen. ich kann mir garnicht vorstellen was da passiert^^
    dein problem ist weiterhin, dass das clonen nicht geht - also eine referenz erzeugt wird?
    Ich habs, es lag, wie ich es mir schon dachte an der Clone Methode. Der Artikel behandelt das Deep Clonen mit Serialisieren und Deserialisieren, bei den anderen bleibt trotzdem die Referenz da. Aber Danke nochmal für eure Hilfe!
    Code:

    VB.NET-Quellcode

    1. <Serializable()> _
    2. Structure Liste
    3. Function Clone()
    4. Dim m As New IO.MemoryStream
    5. Dim b As New BinaryFormatter
    6. b.Serialize(m, Me)
    7. m.Position = 0
    8. Return b.Deserialize(m)
    9. End Function
    10. '---Weiteres der Struktur
    11. End Structure