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
Objekt resp. Objekt-Array kopieren (ohne Referenz)
Moderator: Moderatoren
- brandelh
- Foren-Moderator
- Beiträge: 15710
- Registriert: Mo, 23. Jan 2006 20:54
- Wohnort: Germersheim
- Hat sich bedankt: 73 Mal
- Danksagung erhalten: 38 Mal
- Kontaktdaten:
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
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
Hubert
-
- Rekursionen-Architekt
- Beiträge: 315
- Registriert: Mo, 16. Okt 2006 13:04
- Wohnort: Region Stuttgart
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
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