Objekt resp. Objekt-Array kopieren (ohne Referenz)

Klassen, Objekte, Methoden, Instanzen

Moderator: Moderatoren

Antworten
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Objekt resp. Objekt-Array kopieren (ohne Referenz)

Beitrag von rschi »

Hallo

Ein einfaches Array kann ich ja mit AClone() kopieren, damit die zwei Arrays keine Referenz haben.

Wie mache ich das mit einem Array, welches Objekte enthält?
Das Array sieht z.B. so aus:
aArray := { oObjekt1, oObjekt2 }

Wenn ich dieses nun klone:
aClone := AClone( aArray )

und anschliessend einen Wert einer Instanzvariable überschreibe, ändert dieser in beiden Arrays.
aArray[1]:nInt := 99
aClone[1]:nInt --> 99

aArray[1]:nInt := 100
aClone[1]:nInt --> 100


Dasselbe musste ich auch bei einem Objekt feststellen. Wenn ich ein Objekt erstelle und dieses auf eine zweite Variable kopieren/clonen möchte, haben diese beiden eine Referenz. :-(


Geht mein Vorhaben gar nicht?
Kann mir jemand weiter helfen?

Gruss
Robin
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15695
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Beitrag von brandelh »

Hi,

das Problem ist wohl das Gleiche ... Referenzen.

cVar := yVar -> ergibt zwei getrennte Speichervariablen mit aktuell gleichem Inhalt.

aNeu := aAlt -> ergibt zwei getrennte Speichervariablen, welche aber auf die gleiche Speicherstelle (hier Array) referenzieren (wie schon beschrieben).

aCopy kann nur normale Variablen auflösen aber keine eingebundenen Arrays. Eingebundene Arrays, löst aClone() auf, somit haben wir nun vom Standpunkt des Arrays zwei verschiedene. Aber dennoch verweisen die Objekte auf die gleichen Speicherbereiche - ähnliches würde für Windows/Filehandles gelten, wenn man sie hinterlegt hätte.

Ich vermute, dass nur eine neue Instanz und händisches Umkopieren 2 getrennte Objekte (mit eventuell immer noch gleichen Windows/Filehandles ?) anlegen kann. aClone() ist damit sicher überfordert.

Aber vielleicht hat ja jemand eine für die Lösung bessere Antwort ;-)
Gruß
Hubert
Günter Beyes
Rekursionen-Architekt
Rekursionen-Architekt
Beiträge: 315
Registriert: Mo, 16. Okt 2006 13:04
Wohnort: Region Stuttgart

Beitrag von Günter Beyes »

Robin, Hubert,

Bin2Var( Var2Bin( oObj ) ) -> geklontes Objekt.

Bei Objekten wie XBPs, , die Handles enthalten, allerdings nicht unproblematisch.

Viele Grüße
Günter
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Beitrag von rschi »

Besten Dank, Günter

Auf diese Idee bin ich gestern ebenfalls noch gekommen.

Bevor ich aber nochmals poste, wollte ich es zuerst ausprobieren, ob es wirklich funktioniert und dazu komme ich erst jetzt. :-)

Erste Versuche versprechen Gutes...

Gruss
Robin
rschi
Cut&Paste-Entwickler
Cut&Paste-Entwickler
Beiträge: 38
Registriert: Mo, 25. Sep 2006 13:41

Beitrag von rschi »

Ob diese Variante in meinem speziellen Fall wirklich funktioniert, kann ich leider noch nicht abschliessend sagen.

Was ich aber feststellen musste ist, dass diese Methode für die Ausführung um ein Vielfaches länger braucht.

Ich muss in einer FOR-Schleife z.B. für 1200 Objekte dieses Klonen ausführen. Mit AClone() benötige ich lediglich 0.06 Sekunden, mit dem BIN2VAR(VAR2BIN()) über 140 Sekunden, also fast Faktor 2500. :-(

Hat jemand einen Tipp, wie man das beschleunigen kann oder gibt es vielleicht doch noch eine andere Möglichkeit?

Besten Dank für jeden Hinweis.

Gruss
Robin
Antworten