[PB 4.20] Absturz mit Select

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Little John

[PB 4.20] Absturz mit Select

Beitrag 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
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7031
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Beitrag 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 !
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Little John

Beitrag 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
Benutzeravatar
Helle
Beiträge: 566
Registriert: 11.11.2004 16:13
Wohnort: Magdeburg

Beitrag 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
Little John

Beitrag 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
Antworten