TMap - Problem (?)
Übersicht

chlandBetreff: TMap - Problem (?) |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Hallo!
Ich beschäftige mich seit ein paar Stunden ein wenig mit BlitzMax und wollte gleich ins kalte Wasser springen und eine Kleinigkeit programmieren. Und weil es so schön ist bin ich natürlich auch gleich mächtig auf den Hintern gefallen ![]() Für meine kleine Spielerei wollte ich einen Type definieren der Daten hält und einen zweiten als Manager. Das Ganze sieht so aus: Code: [AUSKLAPPEN] ' Ein kleiner Container
Type TDummyInfo Field inhalt:Int End Type ' Und eine "Klasse" um damit was zu tun Type cDummyHandler Field tmDummies:TMap Method New() Self.tmDummies = CreateMap() End Method Method Delete() ClearMap(Self.tmDummies) End Method Method AddDummy(name:String,d:TDummyInfo) MapInsert(Self.tmDummies, name, d) End Method Method Output(name:String) Local dummy:TDummyInfo dummy = TDummyInfo(MapValueForKey(Self.tmDummies, name)) Print("Inhalt: " + dummy.inhalt) End Method End Type Im Grossen und Ganzen also nichts komplexes. Im Programm selber mache ich nun folgendes: Code: [AUSKLAPPEN] SuperStrict
Local oTest:cDummyHandler = New cDummyHandler Local d1:TDummyInfo = New TDummyInfo Local d2:TDummyInfo = New TDummyInfo d1.inhalt = 123 oTest.AddDummy("abc",d1) d2.inhalt = 345 oTest.AddDummy("cde",d2) oTest.Output("abc") oTest.Output("cde") Soweit, so gut. Ruft man das auf, gibt das Programm 123 und 345 aus. Nicht erwartet habe ich aber das, was passiert wenn ich das so ändere: Code: [AUSKLAPPEN] d1.inhalt = 123
oTest.AddDummy("abc",d1) d1.inhalt = 234 oTest.AddDummy("bcd",d1) d2.inhalt = 345 oTest.AddDummy("cde",d2) oTest.Output("abc") ' 234 ??? oTest.Output("bcd") ' 234 oTest.Output("cde") ' 345 Kann es sein, dass BM aus irgendeinem obskuren Grund hier fröhlich mit Pointern rumhantiert statt die Objekte zu clonen? Ich hätte eigentlich erwartet, dass tmDummies zwei von d1 unabhängige Objekte enthält was es scheinbar nicht tut. Ich hab schon hier und auch im englischen Forum gesucht aber leider nichts passendes gefunden. Geht sowas überhaupt mit BlitzMax, mache ich irgendwas falsch oder muss ich mir einen Workaround zusammenbasteln? Wäre super wenn jemand einen Tipp hätte. Danke! -Chris |
||
AvaGast |
![]() Antworten mit Zitat |
|
---|---|---|
Also, ähm ... die Sache ist ansich so offensichtlich, dass ich gar nicht weis, was ich dir jetzt schreiben soll. XD
In Deinem Beispiel speicherst Du drei Referenzen ( abc, bcd, cde ) zu zwei Objekten ( d1, d2 ), wobei Du das erste Objekt zweimal referenzierst. Daher ist die Ausgabe/Rückgabe absolut vernünftig und korrekt, da Du den Inhalt von Referenz d1 eben zweimal erhälst - auch wenn Du ihn überschreibst - und das ist volkommen richtig so! Wenn Du es anders haben willst, dann musst Du den zweiten Eintrag ändern: d1 = New TDummyInfo d1.inhalt = 234 oTest.AddDummy("bcd",d1) |
||
chland |
![]() Antworten mit Zitat ![]() |
|
---|---|---|
Du hast natürlich Recht. Ich hab das mit dem New() vollkommen verpeilt/vergessen. Ich hatte irgendwie im Kopf das das mit Collections in VB.Net ging.
Habs gerade nochmal kurz angetestet und mir schnell ein wenig code gebaut und es geht auch da nur mit einem "New" Zwischendurch. Danke ![]() |
||
Übersicht


Powered by phpBB © 2001 - 2006, phpBB Group