Seite 1 von 1

[PB 4.20] Absturz mit Select

Verfasst: 28.06.2008 12:04
von Little John
Mit PB 4.20 unter Windows XP führt folgender Code

Code: Alles auswählen

EnableExplicit

Define.f p, q

p = 0.92
q = 0.95
Select p
   Case 0 To (q-0.01)
      Debug "Test"
EndSelect

Debug "Fertig"
in der IDE zu einem Programmabsturz mit der Fehlermeldung
PureBasic - Assembler error
---------------------------------
PureBasic.asm [104]:
CMP st0,[esp]
error: invalid operand.
Im Gegensatz dazu funktioniert

Code: Alles auswählen

Case 0 To q
einwandfrei, aber laut Hilfe ist die Syntax

Code: Alles auswählen

Case <Ausdruck> To <Ausdruck>
durchaus erlaubt, und (q-0.01) ist ein gültiger Ausdruck.

Gruß, Little John

Verfasst: 28.06.2008 12:51
von STARGÅTE
Select ist aber nur für Ganzezahlen definiert:

Das hier funzt also durchaus.

Code: Alles auswählen

EnableExplicit 

Define p, q 

p = 1 
q = 2 
Select p 
   Case 0 To (q-1)
      Debug "test"
EndSelect 

Debug "Fertig"

EDIT: In der Hilfe steht zwas das auch .f erlaupt ist, aber diese werden wieder zu Ganzen Zahlen abgerundet !

Verfasst: 28.06.2008 14:11
von Little John
STARGÅTE hat geschrieben:Select ist aber nur für Ganzezahlen definiert:

Das hier funzt also durchaus.

Code: Alles auswählen

EnableExplicit 

Define p, q 

p = 1 
q = 2 
Select p 
   Case 0 To (q-1)
      Debug "test"
EndSelect 

Debug "Fertig"
Richtig, aber darum geht es hier nicht.

STARGÅTE hat geschrieben:
EDIT: In der Hilfe steht zwas das auch .f erlaupt ist, aber diese werden wieder zu Ganzen Zahlen abgerundet !
Wörtlich steht in der Hilfe:
Hinweis: Select akzeptiert auch Fließkommazahlen (Floats) als <Ausdruck1>, rundet diese jedoch auf die nächstgelegene Ganzzahl (Integer) ab
Und das passiert wie gesagt auch, wenn ich in meinem Test-Code

Code: Alles auswählen

Case 0 To q
schreibe, aber eben nicht wenn ich stattdessen

Code: Alles auswählen

Case 0 To (q-0.01)
schreibe. Das ergibt keinen Sinn, da nach der Hilfe an der Stelle nicht nur Zahlen, sondern Ausdrücke erlaubt sind, und eben (q-0.01) genauso ein gültiger Fließkommaausdruck ist wie q.

Erschwerend kommt hinzu, dass PB hier keine sinnvolle Fehlermeldung produziert. Das Problem trat natürlich nicht in solch einem kleinen Codeschnipsel auf, sondern in einem längeren Quelltext. Daher musste ich erst mühsam suchen, wo das Problem überhaupt lag.

Gruß, Little John

Verfasst: 28.06.2008 16:39
von Helle
Ich hätte mich so rausgeredet: In der Hilfe steht nur für Ausdruck1, daß er Float sein kann (für Select), für Case heißt das Argument nur Ausdruck :D . Habe mir mal den ASM-Output angesehen: Ausdruck1 wird ordentlich in Integer umgewandelt, Ausdruck (!) ebenso beim Einzelwert (also nur q). Bei q-0.01 berechnet PB diesen Ausdruck auch noch richtig, kommt aber dann ins Schleudern und will mit einem x86-Befehl (CMP) auf den x87-Stack (ST0) zugreifen. Entweder fehlen hier einige nötige Schritte (wäre Bug von PB) oder PB sagt. nö, für Case <Ausdruck> bitte nur Integer. Dann wäre vielleicht eine Typ-Überprüfung nicht schlecht.

Gruß
Helle

Verfasst: 28.06.2008 21:13
von Little John
Helle hat geschrieben:Ich hätte mich so rausgeredet: In der Hilfe steht nur für Ausdruck1, daß er Float sein kann (für Select), für Case heißt das Argument nur Ausdruck :D .
Sooo genau hatte ich das gar nicht gelesen, danke für den Hinweis.

Im folgenden Test wird allerdings das "Uups!" angezeigt, danach zu urteilen wird also der Ausdruck nach Case auch auf ganze Zahlen gerundet:

Code: Alles auswählen

EnableExplicit

Define.l p
Define.f q

p = 3
q = 3.2
Select p
   Case q
      Debug "Uups!"
EndSelect
Helle hat geschrieben:Habe mir mal den ASM-Output angesehen: Ausdruck1 wird ordentlich in Integer umgewandelt, Ausdruck (!) ebenso beim Einzelwert (also nur q). Bei q-0.01 berechnet PB diesen Ausdruck auch noch richtig, kommt aber dann ins Schleudern und will mit einem x86-Befehl (CMP) auf den x87-Stack (ST0) zugreifen.
Jetzt verstehe ich wenigstens was da passiert, vielen Dank!
Helle hat geschrieben:Entweder fehlen hier einige nötige Schritte (wäre Bug von PB) oder PB sagt. nö, für Case <Ausdruck> bitte nur Integer. Dann wäre vielleicht eine Typ-Überprüfung nicht schlecht.
Unterm Strich stellt sich die Situation für mich aus Benutzersicht so dar:
Dass PB nach Select und Case nur Integer-Ausdrücke verarbeitet ist für mich, ähm ... verblüffend. Ich denke viele Benutzer rechnen kaum damit, und man kann ja auch nicht die ganze Hilfe im Kopf haben. Fließkommawerte stillschweigend zu runden halte ich für keine gute Idee. Das kann zu versteckten Bugs führen, die sind viel schlimmer (weil schwerer zu finden) als offensichtliche Bugs.
Wenn denn schon keine Fließkomma-Ausdrücke akzeptiert werden, sollte m.E. in jedem Fall eine klare Fehlermeldung ausgegeben werden wie etwa:

Code: Alles auswählen

Fehler in Zeile 27: Nach Select kann nur ein Integer-Ausdruck stehen.
Gruß, Little John