casting mit Sortieren von Listen über method compare

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

JamesBlond

Betreff: casting mit Sortieren von Listen über method compare

BeitragDo, Feb 26, 2009 20:24
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo Blitz-Community!

Ich habe ein Problem mit dem Sortieren von Waffen, die ein Spieler in der Hand hält.
Hier ist das Type der Waffen, welches eine Waffe erstellen kann und in dem die original compare-Methode überschrieben wird.

Code: [AUSKLAPPEN]

Type tWaffe
   Field name:String
   Field slot:Int
   
   Method Compare(Obj:Object)
      If tWaffe(Obj).slot < slot Return 1 Else Return -1
   EndMethod
   
   Method Create:tWaffe(_name:String,_slot:Byte)
      name = _name
      slot = _slot
      Return Self
   End Method
End Type


Das ist ein Spieler, der eine Waffe in die Hand bekommt, welche nach dem Slot sortiert wird.


Code: [AUSKLAPPEN]

Type tSpieler
   Global list:TList = New(TList) 
   Field waffen:TList
   Field linkWaffe:TLink
   Field waffe:tWaffe
   
   Method New()
          list.AddLast(Self)
      waffen = CreateList()
      waffe:tWaffe = New tWaffe
   End Method
   
   Method cast()
       waffe = tWaffe(linkWaffe.value())
   End Method
   
   Method wechsleWaffe()
      If KeyHit(tasten.waffeUp) Then
         linkWaffe = linkWaffe.nextlink()
         If Not linkWaffe Then linkWaffe = waffen.findLink(waffen.first())
      End If
      If KeyHit(tasten.waffeDown) Then
         linkWaffe = linkWaffe.prevlink()
         If Not linkWaffe Then linkWaffe = waffen.findLink(waffen.last())
      End If
   End Method
   
   Method addWaffe(waffe:tWaffe)
      waffen.addLast(waffe)
   End Method
   
   Method sortWaffen()
      waffen.sort(True)   

                'Sortieren funktioniert:
                'For Local w:tWaffe = EachIn waffen
         'Print "Name: "+w.Name+" Score:"+w.Slot
      'Next

      linkWaffe = waffen.findLink(waffen.first())
   End Method
End Type




Ich erhalte folgende Fehlermeldung, wenn die Methode cast() aufgerufen wird:

"Unhandled Exception:Attempt to access field or method of Null object"

Kann mir jemand den Fehler erklären? Kann man mit einer überschriebenen Compare Methode nicht casten? Das Sortieren an sich funktioniert. Wenn ich nach waffen.sort die liste ausgebe, dann ist alles wunderbar sortiert.

Vielen Dank im voraus für eure Unterstützung!

Artemis

BeitragFr, Feb 27, 2009 10:40
Antworten mit Zitat
Benutzer-Profile anzeigen
Zitat:
Unhandled Exception:Attempt to access field or method of Null object

bei diesem Code:
Code: [AUSKLAPPEN]
       waffe = tWaffe(linkWaffe.value())

heißt sehr wahrscheinlich einfach, dass linkWaffe gleich Null ist, also nicht auf ein richtiges Objekt zeigt.

Nur wenn du vor dem Aufrufen von cast() oder wechsleWaffe() die Methode sortWaffen() aufrufst zeigt linkWaffe auf ein Objekt (und dass auch nur, wenn mindestens eine Waffe existiert.
 

JamesBlond

BeitragFr, Feb 27, 2009 16:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi Artemis!

Natürlich rufe ich vor cast() die Methode sortWaffen() auf und es existieren ebenfalls Waffen. Wenn ich die Compare-Methode von tWaffe auskommentiere, funktioniert der Code.

mfg JamesBlond

ChaosCoder

BeitragFr, Feb 27, 2009 16:31
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
linkWaffe = waffen.findLink(waffen.first())

ist das nicht das gleiche wie
Code: [AUSKLAPPEN]
linkWaffe = waffen.firstLink()
nur so btw...
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

JamesBlond

BeitragFr, Feb 27, 2009 18:51
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, danke! Damit funktionierts. Kannst du den Unterschied erklären?

ChaosCoder

BeitragFr, Feb 27, 2009 19:58
Antworten mit Zitat
Benutzer-Profile anzeigen
ahhh, jetzt weiß ich glaub ich deinen fehler.
es liegt wirklich an deiner comparefunction:

Code: [AUSKLAPPEN]
Method Compare(Obj:Object)
      If tWaffe(Obj).slot < slot Return 1 ElseIf tWaffe(Obj).slot > slot Return -1 Else Return 0
   EndMethod
Das wichtige dabei ist das "return 0". Die TList.findLink() Methode überprüft nämlich mittels der compare funktion ob die Objekte gleich sind (compare=0) und wenn du nur -1 oder 1 zurückgibst sind sie dem Anschein nach nie gleich. Wink
Projekte: Geolaria | aNemy
Webseite: chaosspace.de
 

JamesBlond

BeitragFr, Feb 27, 2009 20:17
Antworten mit Zitat
Benutzer-Profile anzeigen
Hey, das ist sehr einleuchtend! Danke!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group