Compare mit Floats

Übersicht BlitzMax, BlitzMax NG Allgemein

Neue Antwort erstellen

 

Schoppy

Betreff: Compare mit Floats

BeitragSo, März 11, 2012 20:10
Antworten mit Zitat
Benutzer-Profile anzeigen
Hi,

habe zum sortieren immer die Compare Methode genutzt. Hat bei Int immer wunderbar funktioniert aber jetzt müsste ich nach Floats Sortieren.

Wenn ich bei Compare als Rückgabe Float nehme kommt es zum Absturz.

Hier mal der kleine Beispiel Code:

Code: [AUSKLAPPEN]

SuperStrict

Global list:TList = New TList

Type TTest

Field z:Float



Function Create(_z:Float)
Local t:TTest = New TTest
t.z = _z
list.AddLast(t)
End Function

Function Show()
For Local t:TTest = EachIn list
Print(t.z)
Next
Print("")
Print("---")
Print("")
End Function

'* Compare-Methode für dieses Objekt anders definieren!
Method Compare:Int(withObject:Object)
Return Self.z - TTest(withObject).z
End Method

End Type


'* Erstellen:
TTest.Create(0.69)
TTest.Create(0.22)
TTest.Create(0.33)

'* Unsortiert:
TTest.Show()

'* Sortieren:
list.Sort()

TTest.Show()

BladeRunner

Moderator

BeitragSo, März 11, 2012 20:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Code: [AUSKLAPPEN]
'* Compare-Methode für dieses Objekt anders definieren!
Method Compare:Int(withObject:Object)
Local erg:Float = Self.z - TTest(withObject).z
If erg > 0 Then Return 1
If erg < 0 Then Return - 1
Return 0
'Return Self.z - TTest(withObject).z
End Method

Nur eine Kleinigkeit- beim Konvertieren zu Integer wird eben die Nachkommastelle abgeschnitten, und damit ist dein Ergebnis bei kleinen Zahlen immer 0 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
 

PhillipK

BeitragMo, März 12, 2012 0:09
Antworten mit Zitat
Benutzer-Profile anzeigen
Jop - Compare methoden sind complett selbst schreibbar.
WEnn ichs richtig verstehe, ist -1 = Self ist kleiner, 0 = withObject und Self sind gleichgroß und 1 - self ist größer. (je kleiner, desto weiter vorne in der liste!)
Wie du die werte vergibst, ist deine sache.

Ich würde es bei floatzahlen genau wie BR machen - mit dem unterschied, das ich faul bin:
BlitzMax: [AUSKLAPPEN]
Method Compare:Int(withObject:Object)
Local o2:TTest = TTest(withObject)

If o2 Then
Return Sgn(Self.z - o2.z)
EndIf
Return 0
End Method


Ob die abfrage, ob es ein TTest objekt ist, wirklch lohnt, weiß ich nicht. Ich habs allgemein hin immer für sauberer gehalten. Meine änderungs nutzt ausserdem Sgn - es liefert das Vorzeichen einer zahl (-1, 0 oder 1) - also genau die rückgabe, die Compare erwartet Smile (oder bin ich nun ganz deppert?)

BtbN

BeitragMo, März 12, 2012 3:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Sgn ist ungeeignet, weil es auch bei 0, also Gleichheit, eine 1 liefert.

ToeB

BeitragMo, März 12, 2012 12:26
Antworten mit Zitat
Benutzer-Profile anzeigen
Nein, Sgn liefert -1 bei Zahlen kleiner als 0, 0 bei 0 und 1 bei Zahlen größer als 0.
BlitzMax: [AUSKLAPPEN]
Print Sgn(-1)
Print Sgn(0)
Print Sgn(1)


Lg
Religiöse Kriege sind Streitigkeiten erwachsener Männer darum, wer den besten imaginären Freund hat.
Race-Project - Das Rennspiel der etwas anderen Art
SimpleUDP3.0 - Neuste Version der Netzwerk-Bibliothek
Vielen Dank an dieser Stelle nochmal an Pummelie, welcher mir einen Teil seines VServers für das Betreiben meines Masterservers zur verfügung stellt!

Neue Antwort erstellen


Übersicht BlitzMax, BlitzMax NG Allgemein

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group