[ziemlich gelöst] Denkfehler in Tlist's

Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Neue Antwort erstellen

Ana

Betreff: [ziemlich gelöst] Denkfehler in Tlist's

BeitragMi, Sep 19, 2012 16:47
Antworten mit Zitat
Benutzer-Profile anzeigen
Hallo,
vielleicht stehe ich nur auf dem Schlauch, aber ich komme nicht auf meinen Fehler. Bei der untenstehenden Funktion sollte eigentlich das erste Enemie-Objekt zurück gegeben werden, dessen Distanz kleiner als Range ist und das nicht in der OldTarget List steht.
Solange die OldTarget List = null ist, geht es auch wunderbar. Jedoch nicht wenn ein Enemie in der Liste steht. B und I sind nur für mich zur kontrolle im Debugger. Es ist immer i = 1, b = 1 und Enemielist > 1 disjunkt. Allerdings verstehe ich nicht warum. Wenn nur 1 Objekt in der Liste ist und mindestens 2 verschiede damit verglichen werden, dann kann doch nicht jedes Objekt enthalten sein? Vermutlich ein ganz dummer Denkfehler meiner seits aber ich komme nicht drauf ...

BlitzMax: [AUSKLAPPEN]
Function GetTarget:Enemie(g:GameObject,range:Int,OldTargets:TList = Null)
For Local e:Enemie = EachIn EnemieList
If(g.GDistance(e) < range)
If (OldTargets = Null)
Return e
Else
Local i:Int = OldTargets.count()
Local b:Byte = OldTargets.contains(e)
If Not b
Return e
EndIf
EndIf
EndIf
Next
Return Null
End Function


Das Ganze passiert nicht, wenn ich die Enemielist nicht sortiere. Hab ich in der Compare Funktion einen Fehler gemacht?

BlitzMax: [AUSKLAPPEN]
Method Compare:Int(O:Object)
Local e:Enemie = Enemie(o)
If e = Null Or e.length < length Then Return 1
Return -1
End Method


Außerdem funktioniert das remove() der Tlist auch nicht mehr richtig. Daher hatte ich vermutet, dass die LinkedList datein vielleicht ausversehen von mir verwurschtelt wurden und BMax neu installiert, aber das hat nichts geändert.
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine
  • Zuletzt bearbeitet von Ana am Mi, Sep 19, 2012 17:45, insgesamt 2-mal bearbeitet

Lobby

BeitragMi, Sep 19, 2012 17:05
Antworten mit Zitat
Benutzer-Profile anzeigen
Du solltest wissen, dass die Listen-Methoden Contains, FindLink und Remove alle auf der Compare-Methode des zu untersuchenden Objekts basieren. Wenn dieses beim Vergleich 0 zurücklieftert, gelten zwei Objekte als identisch. Ich denke damit sollten sich alle bei dir aufgetretenen Probleme erklären lassen.
Grundsätzlich halte ich es für ratsam die CompareMethode Zahlenwerte zurückliefern zu lassen, die angeben, wie nah die Objekte bei einander liegen (mit dem Vorzeichen als Indikator in welche Richtung).
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

Ana

BeitragMi, Sep 19, 2012 17:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Ah danke, das scheint das Problem zu lösen wenn ich die Compare Funktion so umschreibe

BlitzMax: [AUSKLAPPEN]
Method Compare:Int(O:Object)
Local e:Enemie = Enemie(o)
Return length - e.length
End Method


Allerdings würde ich gerne verstehen warum ...

Nutz Bmax dafür nicht Mergesort und da ist beim vergleichen doch nur interessant ob und nicht wie viel kleiner oder größer die Zahl ist?
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Lobby

BeitragMi, Sep 19, 2012 17:28
Antworten mit Zitat
Benutzer-Profile anzeigen
Ja, BlitzMax nutzt Merge-Sort und es reicht auch, nur -1, 0 oder 1 zurückzugeben, aber ich finde es leserlicher und für eigene Zwecke nützlicher, wenn gleich noch der Abstand zurückgegeben wird Wink .
TheoTown - Eine Stadtaufbausimulation für Android, iOS, Windows, Mac OS und Linux

Ana

BeitragMi, Sep 19, 2012 17:44
Antworten mit Zitat
Benutzer-Profile anzeigen
Gut, dann verstehe ich nicht warum das nun geht und vorher nicht. Aber immerhin geht es. Vielen Danke Lobby =)
Don't only practice your art,
but force your way into its secrets,
for it and knowledge
can raise human to divine

Nova

BeitragMi, Sep 19, 2012 17:59
Antworten mit Zitat
Benutzer-Profile anzeigen
Vielleicht hat das ganze auch etwas damit zu tun, dass du nicht 0 zurückgegeben hast, wenn die beiden length identisch waren. Wink
AMD Athlon II 4x3,1GHz, 8GB Ram DDR3, ATI Radeon HD 6870, Win 7 64bit

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Beginners-Corner

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group