Kopie von einem beliebigem Objekt machen?

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

das wurgel

Betreff: Kopie von einem beliebigem Objekt machen?

BeitragFr, Mai 21, 2010 19:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Ich glaube es vor kurzem schonmal hier gelesen zu haben, aber ich kann den Thread nicht mehr finden: Kann man eine Kopie von einem beliebigem BlitzMax Objekt machen, ohne für jede Instanzvariable extra bubbkopie.a=blubb.a; blubbkopie.b=blubb.b usw. zu schreiben?
1 ist ungefähr 3

coolo

BeitragFr, Mai 21, 2010 19:17
Antworten mit Zitat
Benutzer-Profile anzeigen
https://www.blitzforum.de/foru...hp?t=33951

Have fun
http://programming-with-design.at/ <-- Der Preis ist heiß!
That's no bug, that's my project!
"Eigenzitate sind nur was für Deppen" -Eigenzitat

das wurgel

BeitragFr, Mai 21, 2010 19:24
Antworten mit Zitat
Benutzer-Profile anzeigen
thanks Very Happy
1 ist ungefähr 3

maximilian

BeitragFr, Mai 21, 2010 21:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Im Zweifelsfalle wäre es sicher besser, einfach Kopiermethoden zu schreiben. Das wäre die sauberste Lösung. Wenn du keine komplexen Datenstrukturen kopieren willst, löst auch

BlitzMax: [AUSKLAPPEN]
Local new_obj:tType = New tType
MemCopy(Byte Ptr(new_obj), Byte Ptr(old_obj))


dein Problem.
Variety is the spice of life. One day ignore people, next day annoy them.

das wurgel

BeitragFr, Mai 21, 2010 21:46
Antworten mit Zitat
Benutzer-Profile anzeigen
Hm ja ich glaube das wäre praktischer. Kopiert das nur die elementaren Variablen und die Referenzen bleiben die Selben?

edit: Funktioniert das auch mit Vererbung? Also wenn ich jetzt eine Variable vom Basistypen habe mit nem Objekt von einem erweiterten, ist die Kopie dann auch vom erweiterten Typ?
 

Ava

Gast

BeitragFr, Mai 21, 2010 22:17
Antworten mit Zitat
Bei MemCopy habe ich die Erfahrung gemacht, dass der GC damit nicht gut umgehen kann und es im weiteren Verlauf zu Fehlern und Abstürzen kommen kann. Es ist schon eine ganze Weile her, dass ich damit zum Kopieren von Objekten herumexperimentiert habe, und ich weis nicht, ob dieses Problem noch aktuell ist, aber ich wollte es dennoch besser mal erwähnen. ^^

(ich vermute, das betrifft wohl vorallem Objektreferenzen, deren Pointer zwar kopiert, aber vom GC nicht gezählt werden, und daher dann plötzlich Objekte getrasht werden, die eigentlich noch in Verwendung sind *spekulier* Rolling Eyes)

das wurgel

BeitragFr, Mai 21, 2010 22:37
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay, ich wollte es gerade testen, da fällt mir auf, dass ich nicht weis, wie groß der Speicherbereich des Objekts ist. Wie krieg ich das raus?
1 ist ungefähr 3

mpmxyz

BeitragFr, Mai 21, 2010 22:50
Antworten mit Zitat
Benutzer-Profile anzeigen
Stichwort: "SizeOf"
Ich würde aber eher das clone-Modul nutzen, da die Pointer-Variante nicht zwangsläufig funktionieren muss.
(Es könnten die schon angesprochenen GC-Probleme auftreten.)
mfG
mpmxyz
Moin Moin!
Projekte: DBPC CodeCruncher Mandelbrot-Renderer

das wurgel

BeitragSa, Mai 22, 2010 0:45
Antworten mit Zitat
Benutzer-Profile anzeigen
Der GC scheint zu erkennen, dass da ein neuer Pointer enstanden ist:
Code: [AUSKLAPPEN]
Local bla:TTest1 = New TTest1
bla.test = New TTest2
Print "bla.test: "+ bla.test.variable

Local blubb:TTest1 = New TTest1
MemCopy(Byte Ptr(blubb), Byte Ptr(bla), SizeOf(bla))

Print "blubb.test: " + blubb.test.variable
Print "So und jetzt löscht der DC Bla"
bla=Null
GCCollect()

Print "blubb.test: " + blubb.test.variable

Type TTest1
   Field test:TTest2
End Type

Type TTest2
   Field variable$="Ich existiere noch."
End Type


Ich glaube ich werde erstmal die MemCopy Funktion nehmen und wenn Bugs auftreten nehme ich entweder ChaosClone oder ich überleg mir was anderes.

Danke für die Ratschläge

edit: Code verbessert, aber alles bleibt beim alten.
1 ist ungefähr 3
  • Zuletzt bearbeitet von das wurgel am Sa, Mai 22, 2010 0:51, insgesamt einmal bearbeitet

Xeres

Moderator

BeitragSa, Mai 22, 2010 0:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
bla=Null
GCcollect()
Werf den GC per hand an, um sicher zu gehen!
Win10 Prof.(x64)/Ubuntu 16.04|CPU 4x3Ghz (Intel i5-4590S)|RAM 8 GB|GeForce GTX 960
Wie man Fragen richtig stellt || "Es geht nicht" || Video-Tutorial: Sinus & Cosinus
T
HERE IS NO FAIR. THERE IS NO JUSTICE. THERE IS JUST ME. (Death, Discworld)

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group