TMap - Problem (?)

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

 

chland

Betreff: TMap - Problem (?)

BeitragMi, Nov 18, 2009 0:00
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Laughing

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
 

Ava

Gast

BeitragMi, Nov 18, 2009 0:13
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

BeitragMi, Nov 18, 2009 1:13
Antworten mit Zitat
Benutzer-Profile anzeigen
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 Laughing War also doch nur meine Schusseligkeit... hab in letzter Zeit einfach zuviel simple Web-Entwicklung gemacht und zuwenig OOP...

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group