Seite 1 von 1

Objekt resp. Objekt-Array kopieren (ohne Referenz)

Verfasst: Mo, 21. Jul 2008 14:32
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

Verfasst: Mo, 21. Jul 2008 16:24
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 ;-)

Verfasst: Mo, 21. Jul 2008 17:16
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

Verfasst: Di, 22. Jul 2008 7:38
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

Verfasst: Di, 22. Jul 2008 14:02
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