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

Re: Bug bei binärem ODER?

Beitrag von techniker »

Das kann doch nicht wirklich die Lösung sein? :?

Code: Alles auswählen

Procedure.b Invers(in.q) ; Invertiert und maskiert das LSB
  ProcedureReturn (~in) & 1
EndProcedure

Procedure.q CastBQ(in.b) ; Workaround .b -> .q
  ProcedureReturn in
EndProcedure

Procedure.b CastQB(in.q) ; Workaround .q -> .b
  ProcedureReturn in
EndProcedure


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

c = CastQB(Invers(CastBQ(a)) | Bool(b))

Debug c
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:Wo steht das? :?
Warum sollte das wo stehen?
techniker hat geschrieben:Wenn dies wirklich so sein sollte, dann ist dies ein gravierender Nachteil (und meiner Ansicht nach ein Bug) von PB, das ich so noch nie bei einer anderen Sprache gesehen habe!
Ich beherrsche zwar kein C++, habe aber mal folgenden Code zusammengebastelt und getestet:

Code: Alles auswählen

#include <iostream>

int main()
{
    char      b   = 0;
    long long q   = 1;

    char      ret;
  //long long ret;

    ret = b|q;
    std::cout << ret;
}
Dieser Code bringt genau wie Pb ein undefiniertes Ergebnis (ein Sonderzeichen wird ausgegeben). Wenn du den auskommentierten 'long long' Wert verwendest, bekommst du ein korrektes Ergebnis. Also kein Unterschied zwischen Pb und C++, kein Nachteil und schon gar kein Bug.
Benutzeravatar
techniker
Beiträge: 160
Registriert: 27.01.2016 11:08
Wohnort: BY

Re: Bug bei binärem ODER?

Beitrag von techniker »

C sollte hier normalerweise eine Warnung auswerfen.
In dem Fall kann ich ganz einfach per Cast

Code: Alles auswählen

ret = (b&1)|((char)q&1);
den long long in einen char zwingen.

Dabei kommt natürlich wertemäßig Müll raus, was mich aber nicht stört, da es mir nur um das LSB geht.
Never change a running system - Never run a changed system!
(PB 6.03 LTS [x86])
Nino
Beiträge: 1300
Registriert: 13.05.2010 09:26
Wohnort: Berlin

Re: Bug bei binärem ODER?

Beitrag von Nino »

techniker hat geschrieben:Bzw. wie Caste ich den Typ dann mit PB?
Wenn x z.B. ein Long oder ein Quad ist, erhältst Du das Low Byte von x mit

Code: Alles auswählen

x & $FF
Antworten