Seite 3 von 3

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 14:43
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

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 15:51
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.

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 15:59
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.

Re: Bug bei binärem ODER?

Verfasst: 02.09.2019 16:26
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