Seite 1 von 3

Bug bei binärem ODER?

Verfasst: 02.09.2019 07:50
von techniker
Hi!

ich habe mir eben schon den Ast gesucht und folgendes gefunden:
Ist das wirklich ein Bug oder ein Denkfehler meinerseits?
Ich arbeite zwar mit 32 Bit (wegen externer DLL's), aber trotzdem sollte PB doch korrekt mit Quad arbeiten?

OK:

Code: Alles auswählen

Macro Invers(in) ; Invertiert und maskiert das LSB
  ((~in) & $1)
EndMacro

Define a.b = #False, b.l = 0

Debug Invers(a) | Bool(b)
FAIL:

Code: Alles auswählen

Macro Invers(in) ; Invertiert und maskiert das LSB
  ((~in) & $1)
EndMacro

Define a.b = #False, b.q = 0

Debug Invers(a) | Bool(b)
Der Unterschied ist lediglich die Variable b, welche in Quad geändert wurde.
PureBasic-Version: 5.62, 32-bit

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 09:25
von techniker
Workaround:

Code: Alles auswählen

Macro Invers(in) ; Invertiert und maskiert das LSB
  ((~in) & $1)
EndMacro

Procedure.l BoolQ(value.q)
  ProcedureReturn Bool(value)
EndProcedure

Define a.b = #False, b.q = 0

Debug Invers(a) | BoolQ(b)

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 09:45
von Josh
Help hat geschrieben:Wird das Ergebnis des Operators nicht benutzt und es befindet sich eine Variable auf LS, dann wird das Ergebnis des Ausdrucks direkt in dieser Variable gespeichert
Dein Ergebnis wird also in eine Variable vom Typ .b gestellt. Was soll da also außer Blödsinn rauskommen.

Code: Alles auswählen

Macro Invers(in) ; Invertiert und maskiert das LSB
  ((~in) & $1)
EndMacro

Define a.b = #False, b.q = 0

x.q = Invers(a) | Bool(b)
Debug x
ODER:
Wenn du zwei verschiedene Typen ohne Ergebnisvariable verwendest, dann stelle den größeren Typ auf die linke Seite.

Code: Alles auswählen

Macro Invers(in) ; Invertiert und maskiert das LSB
  ((~in) & $1)
EndMacro

Define a.b = #False, b.q = 0

Debug Bool(b) | Invers(a)

Wenn du nicht weißt ob es sich um einen Bug handelt, dann solltest du unter Fragen posten und nicht bei den Fehlern !!!

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 09:53
von techniker
Josh hat geschrieben: Dein Ergebnis wird also in eine Variable vom Typ .b gestellt. Was soll da also außer Blödsinn rauskommen.
Und warum funktioniert dann b.l?
nach deiner Aussage dürfte dies auch nicht funktionieren, da .b = 1 Byte und .l = 4 Byte.
Der Fehler tritt jedoch nur bei .q auf! - Daher die Vermutung auf einen Bug!
Josh hat geschrieben: Wenn du nicht weißt ob es sich um einen Bug handelt, dann solltest du unter Fragen posten und nicht bei den Fehlern !!!
Kein Grund um (virtuell) herumzuschreien..! :angry:

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 09:56
von Josh
techniker hat geschrieben:Und warum funktioniert dann b.l?
Die Frage stellt sich einfach nicht. Wenn du einen Befehl falsch ausführst und in bestimmten Fällen kommt ein richtiges Ergebnis, dann hast du trotzdem einen Befehl falsch ausgeführt.
techniker hat geschrieben:Kein Grund um (virtuell) herumzuschreien..! :angry:
Doch, ist ein Grund

@Einen Mod
Bitte in Fragen verschieben

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 09:59
von techniker
Josh hat geschrieben:
techniker hat geschrieben:Und warum funktioniert dann b.l?
Die Frage stellt sich einfach nicht. Wenn du einen Befehl falsch ausführst und in bestimmten Fällen kommt ein richtiges Ergebnis, dann hat du trotzdem einen Befehl falsch ausgeführt.
Und welche saubere Lösung (ohne Tricksereien, wie bedingte ODER-Reihenfolgen) schlägst du vor?
Ein Cast unterstützt (m.W.n.) PB noch nicht..

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 10:02
von techniker
Gleiches Verhalten von Variable b:
(einfach von .l auf .q tauschen)

Code: Alles auswählen

Macro Invers(in) ; Invertiert und maskiert das LSB
  ((~in) & $1)
EndMacro

Define a.b = #False, b.l = 0, c.l

c = Invers(a) | Bool(b)

Debug c

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 10:04
von Josh
techniker hat geschrieben:Und welche saubere Lösung (ohne Tricksereien, wie bedingte ODER-Reihenfolgen) schlägst du vor?
Ich habe dir oben zwei Vorschläge gemacht. Eine Trickserei sehe ich keine, weil ich in beiden Fällen genau das mache, was in der Hilfe steht.
Hilfeleser wissen eben mehr :mrgreen:

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 10:11
von techniker
Josh hat geschrieben:Hilfeleser wissen eben mehr :mrgreen:
Ich verwende aber das Ergebnis in einer weiteren Variable.. :-b

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 12:31
von mk-soft
Ist definitiv ein Bug...

War aber schon mal für die x86 Version vor Ewigkeiten gemeldet worden.