Problem: TMap Inhalt verschwindet ! :-(

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Ava

Gast

Betreff: Problem: TMap Inhalt verschwindet ! :-(

BeitragMi, Mai 06, 2009 23:26
Antworten mit Zitat
Ich bin gerade auf ein sonderbares Phänomen gestossen: Mein TMap Objekt verliert plötzliche Values für Keys. Sad

Zur Analyse habe ich mir den Bereich rausgenommen und durch einige Debuglogs ergänzt. Der Programmteil macht nicht viel: MapInsert ( map, key, value ) ... und dann den Inhalt von der TMap im Debuglog auflisten.

Das Ergebnis ist ne ziemlich lange Liste, von der ich euch mal einen Problembereich kopiere. Der Anfang klappt wunderbar ... und dann plötzlich verschwindet WISDOM. Confused (wenn ich WISDOM aus der Liste entferne, dann verschwindet WILLPOWER).

Code: [AUSKLAPPEN]
[..]

DebugLog:ADD: CLASS_BASE = Abenteurer
DebugLog:   GER:  CLASS_BASE   Abenteurer
DebugLog:   GER:  DEXTERITY      Geschick
DebugLog:   GER:  PERCEPTION   Wahrnehmung
DebugLog:   GER:  STRENGTH      Stärke
DebugLog:   GER:  TOUGHNESS   Zähigkeit
DebugLog:   GER:  WILLPOWER   Willenskraft
DebugLog:   GER:  WISDOM      Weisheit

---

DebugLog:ADD: 01221660 = Abenteuer
DebugLog:   GER:  CLASS_BASE   Abenteurer
DebugLog:   GER:  DEXTERITY      Geschick
DebugLog:   GER:  PERCEPTION   Wahrnehmung
DebugLog:   GER:  STRENGTH      Stärke
DebugLog:   GER:  TOUGHNESS   Zähigkeit
DebugLog:   GER:  WILLPOWER   Willenskraft
DebugLog:   GER:  WISDOM      Weisheit
DebugLog:   GER:  01221660      Abenteuer

---

DebugLog:ADD: 01221690 = Krieger
DebugLog:   GER:  CLASS_BASE   Abenteurer
DebugLog:   GER:  DEXTERITY      Geschick
DebugLog:   GER:  PERCEPTION   Wahrnehmung
DebugLog:   GER:  STRENGTH      Stärke
DebugLog:   GER:  TOUGHNESS   Zähigkeit
DebugLog:   GER:  WILLPOWER   Willenskraft
DebugLog:   GER:  WISDOM      
DebugLog:   GER:  01221660      Abenteuer
DebugLog:   GER:  01221690      Krieger

[..]

Noch krasseres Beispiel:
Code: [AUSKLAPPEN]
[..]

DebugLog:ADD: 01AF1660 = Abenteuer
DebugLog:   GER:  CLASS_BASE   Abenteurer
DebugLog:   GER:  DEXTERITY      Geschick
DebugLog:   GER:  STRENGTH      Stärke
DebugLog:   GER:  TOUGHNESS   Zähigkeit
DebugLog:   GER:  01AF1660      Abenteuer

[..]

DebugLog:ADD: 01AF16F0 = Jäger
DebugLog:   GER:  CLASS_BASE   Abenteurer
DebugLog:   GER:  DEXTERITY      Geschick
DebugLog:   GER:  STRENGTH      Stärke
DebugLog:   GER:  TOUGHNESS      
DebugLog:   GER:  01AF1660      Abenteuer
DebugLog:   GER:  01AF1690      Krieger
DebugLog:   GER:  01AF16C0      Schurke
DebugLog:   GER:  01AF16F0      Jäger

[..]

DebugLog:ADD: 01AF1720 = Magier
DebugLog:   GER:  CLASS_BASE      
DebugLog:   GER:  DEXTERITY      
DebugLog:   GER:  STRENGTH      
DebugLog:   GER:  TOUGHNESS      
DebugLog:   GER:  01AF1660      Abenteuer
DebugLog:   GER:  01AF1690      Krieger
DebugLog:   GER:  01AF16C0      Schurke
DebugLog:   GER:  01AF16F0      Jäger
DebugLog:   GER:  01AF1720      Magier

[..]


Hat dafür ein erfahrener TMap-User womöglich eine Erklärung? Confused

ChaosCoder

BeitragMi, Mai 06, 2009 23:49
Antworten mit Zitat
Benutzer-Profile anzeigen
Kannst du die Situation mit einem kleinen Codebeispiel nachstellen? Oder tritt das sonst nicht auf?
Ich denke nicht, dass es an der TMap-Klasse liegt... aber das weiß ich auch nich so genau.
Projekte: Geolaria | aNemy
Webseite: chaosspace.de

kog

BeitragMi, Mai 06, 2009 23:55
Antworten mit Zitat
Benutzer-Profile anzeigen
Hmm hat es vielleicht etwas damit zu tun, das seit dem Update keine Null Instancen mehr erlaubt sind und diese glaub auch automatisch rauswirft?
 

Ava

Gast

BeitragDo, Mai 07, 2009 0:49
Antworten mit Zitat
Ich habe etwas rumprobieren müssen, bis ich es rekonstruieren konnte. Ich habe das Gefühl, dieses Problem taucht nur auf, wenn ich Strings mit anderen Objekten in einer TMap mische?! Confused Wenn ich anstatt der Objekte deren ToString in die Map einfüge, dann klappt es *bisher* fehlerfrei. Für meinen Verwendungszweck ist das durchaus akzeptabel so. Aber abgesehen davon, finde ich es nach wie vor etwas erschreckend! Evil or Very Mad

Code: [AUSKLAPPEN]

   SuperStrict
   Framework BRL.MAP
   
   Global MAP:TMap = CreateMap ( )
      
   MapInsert ( MAP, "AAA", "aaa" )      DEBUG ( )
   MapInsert ( MAP, "BBB", "bbb" )      DEBUG ( )

   For   Local i:Int = 0 To 3

      MapInsert ( MAP, CreateMap ( ), String ( i ) )   
      DEBUG ( )
   
   Next
   
   MapInsert ( MAP, "CCC", "ccc" )      DEBUG ( )
   MapInsert ( MAP, "DDD", "ddd" )      DEBUG ( )
   
   Function DEBUG ( )
   
      DebugLog ( "" )

      For   Local KEY:Object = EachIn MapKeys ( MAP )
      
         Local VALUE:Object = MapValueForKey ( MAP, KEY )
         
         If   VALUE
            
            DebugLog (   "KEY:  " + KEY.tostring ( ) + "   VALUE:  " + VALUE.tostring ( ) )

         Else
         
            DebugLog (   "KEY:  " + KEY.tostring ( ) + "   [ FAILED ]" )
                        
         EndIf
         
      Next

      DebugLog ( "" )
   
   EndFunction

REesultat:
Code: [AUSKLAPPEN]
DebugLog:
DebugLog:KEY:  AAA   [ FAILED ]
DebugLog:KEY:  BBB   [ FAILED ]
DebugLog:KEY:  00FB0BE0   VALUE:  0
DebugLog:KEY:  00FB1090   VALUE:  1
DebugLog:KEY:  00FB16B0   VALUE:  2
DebugLog:KEY:  00FB1E40   VALUE:  3
DebugLog:KEY:  CCC   VALUE:  ccc
DebugLog:KEY:  DDD   VALUE:  ddd
DebugLog:

@kog Null Instancen sind keine dabei (jedenfalls nicht gewollt ^^). Abgesehen davon bin ich noch bei v1.30, weisste doch. Wink
 

klepto2

BeitragDo, Mai 07, 2009 9:08
Antworten mit Zitat
Benutzer-Profile anzeigen
Da scheint ein bug im GC zu sein. im Threaded Modus funktioniert es einwandfrei.
Das Problem liegt anscheined darin, das Pointer mit derselben Adresse erzeugt werden, wie die beiden vorigen für AAA und BBB, ich habe im Moment keine Ahnung warum. Vielleicht mal im Bug forum auf bb.com posten.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

amon

BeitragDo, Mai 07, 2009 19:39
Antworten mit Zitat
Benutzer-Profile anzeigen
Kann ich bestätigen, aber auch im Threaded Modus läufts bei mir nicht einwandfrei - in der letzten Iteration der Debug Funktion geht das vierte und letzte Value Element verloren das einen Map als Key bekommt.

Fügt man als Key nur Strings ein, tritt der Fehler sowohl bei Threaded / Nicht Threaded nicht auf.

Den Fehler kann man auch mit anderen Types als Key provozieren.
 

klepto2

BeitragFr, Mai 08, 2009 12:07
Antworten mit Zitat
Benutzer-Profile anzeigen
Wie schon erwähnt, bei mir funktioniert das ganze im threaded Modus einwandfrei. Gut, die Reihenfolge ist halt ne andere, das liegt aber an den interna von TMap und den Pointern.
Matrix Screensaver
Console Modul für BlitzMax
KLPacker Modul für BlitzMax

HomePage : http://www.brsoftware.de.vu

BladeRunner

Moderator

BeitragDi, Mai 12, 2009 12:41
Antworten mit Zitat
Benutzer-Profile anzeigen
Antwort aus dem BB.com-Bugforum für alle interessierten:
Zitat:
The problem is that Objects by default (and TMaps) have their Compare method implemented using their addresses, whereas Strings override that with a character-based implementation. When you mix those two types of objects as keys, it is possible that obj1 < str1 < str3, but str3 < obj1. That messes up the map.

In math-speak, the set of all strings is an ordered set, as is the set of all TMap objects. However, the union of those is not an ordered set. Thus, it cannot be sorted, which is what a map does (tries).

Edit: In short - not allowed.

Not a bug - a feature Wink
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92
 

Ava

Gast

BeitragDi, Mai 12, 2009 13:13
Antworten mit Zitat
Tolles "Feature" ... Razz

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group