Bug bei binärem ODER?

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Bug bei binärem ODER?

Beitrag 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
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Bug bei binärem ODER?

Beitrag 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)
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Bug bei binärem ODER?

Beitrag 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 !!!
Zuletzt geändert von Josh am 02.09.2019 09:54, insgesamt 1-mal geändert.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Bug bei binärem ODER?

Beitrag 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:
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Bug bei binärem ODER?

Beitrag 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
Zuletzt geändert von Josh am 02.09.2019 09:59, insgesamt 1-mal geändert.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Bug bei binärem ODER?

Beitrag 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..
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Bug bei binärem ODER?

Beitrag 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
Zuletzt geändert von techniker am 02.09.2019 10:12, insgesamt 1-mal geändert.
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
Josh
Beiträge: 1028
Registriert: 04.08.2009 17:24

Re: Bug bei binärem ODER?

Beitrag 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:
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Bug bei binärem ODER?

Beitrag von techniker »

Josh hat geschrieben:Hilfeleser wissen eben mehr :mrgreen:
Ich verwende aber das Ergebnis in einer weiteren Variable.. :-b
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Benutzeravatar
mk-soft
Beiträge: 3701
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: Bug bei binärem ODER?

Beitrag von mk-soft »

Ist definitiv ein Bug...

War aber schon mal für die x86 Version vor Ewigkeiten gemeldet worden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten