Seite 1 von 2

BUG: XOr-Operation zerstört Werte von Protected-Variablen !

Verfasst: 14.05.2007 16:16
von PureLust
[Edit:] Titel und Text geändert, da der Bug nicht nur (wie zuvor angenommen) auf Static-Variablen beschränkt ist.

Moin, moin, ...

wenn man in einer Prozedur den XOR-Operator anwendet, so werden die Werte der Protected-Variablen zerstört:

Code: Alles auswählen

Procedure StaticBug()
	Protected	a = 11
	Protected	b = 22
	Protected	c = 33
	Protected	d = 44
	Static		z = #False
	Debug "VOR Änderung der Static-Variable:"
	Debug "a = "+Str(a)
	Debug "b = "+Str(b)
	Debug "c = "+Str(c)
	Debug "d = "+Str(d)
	Debug "z = "+Str(z)
	z = 1 XOr z
	Debug ""
	Debug "NACH XOr-Operation mit Static-Variable:"
	Debug "a = "+Str(a)+"            < 'a' hat nun den Wert von 'b'"
	Debug "b = "+Str(b)+"            < 'b' hat nun den Wert von 'c'"
	Debug "c = "+Str(c)+"            < 'c' hat nun den Wert von 'd'"
	Debug "d = "+Str(d)+"  < komplett falscher Wert"
	Debug "z = "+Str(z)
EndProcedure

StaticBug()
Debug-Ausgabe: hat geschrieben:VOR Änderung der Static-Variable:
a = 11
b = 22
c = 33
d = 44
z = 0

NACH XOr-Operation mit Static-Variable:
a = 22 < 'a' hat nun den Wert von 'b'
b = 33 < 'b' hat nun den Wert von 'c'
c = 44 < 'c' hat nun den Wert von 'd'
d = 4198507 < komplett falscher Wert
z = 1
Da die Protected-Variablen ja auf einem Stack gespeichert werden, ist es vermutlich ein Stack-Fehler beim XOR-Operator.

Gruß, PL.

[Nachtrag:]
Habe gerade festgestellt, dass dies nicht nur bei XOr-Operationen mit Static-Variablen der Fall ist (siehe Codebeispiel), sondern generell bei XOr-Operationen innerhalb einer Prozedur.
Also auch bei XOr-Operationen mit Globalen- und Protected-Variablen.
Ist also ein genereller Bug beim XOR-Operator !!!

Verfasst: 14.05.2007 17:41
von AND51

Code: Alles auswählen

a=1
b=0
z=a XOr b
Die 3. Zeile... Das machst du ja auch: Da wird doch versucht, in eine Variable das bool'sche Ergebnis zu speichern, sehe ich das richtig? Wenn ja, dann sag ich nur so viel: Das Rechnen mit bool'schen Ausdrücken wird (noch, wahrscheinlich :roll: ) nicht unterstützt.
Wenn ich falsch liege, dann nehme ich alles zurück.

Verfasst: 14.05.2007 19:59
von Kaeru Gaman
man sollte das schon im richtigen kontext verwenden,
aber selbst dann tritt der bug auf.

wenn man die zeile

Code: Alles auswählen

   z = 1 XOr z
welche sachlich falsch ist,
ersetzt durch die korrekte bit-operation

Code: Alles auswählen

   z = 1 ! z
dann funktioniert es.

allrdings wenn man den logischen oprator richtig benutzt

Code: Alles auswählen

   If b = 22 XOr a = 22
     Debug "funzt"
   EndIf
tritt der bug ebenfalls auf, und die abfrage liefert auch nicht das korrekte ergebnis.

Verfasst: 15.05.2007 19:00
von mk-soft
Ist nicht neu das Probleme mit XOr

http://www.purebasic.fr/german/viewtopi ... highlight=

Sollte mit den der nächsten Update erledigt sein.

FF :|

Verfasst: 07.06.2007 09:52
von Little John
Der Bug ist offenbar in der aktuellen Windows-Version 4.10 beta 1 noch nicht behoben ... :(

Gruß, Little John

Verfasst: 07.06.2007 13:57
von AND51
Dann poste es doch im englischen Forum!

Verfasst: 07.06.2007 14:24
von ts-soft
bei mir ist alles korrekt:

Code: Alles auswählen

Procedure StaticBug()
   Protected   a = 11
   Protected   b = 22
   Protected   c = 33
   Protected   d = 44
   Static      z = #False
   Debug "VOR Änderung der Static-Variable:"
   Debug "a = "+Str(a)
   Debug "b = "+Str(b)
   Debug "c = "+Str(c)
   Debug "d = "+Str(d)
   Debug "z = "+Str(z)
   z = 1 ! z
   Debug ""
   Debug "NACH XOr-Operation mit Static-Variable:"
   Debug "a = "+Str(a)+"            < 'a' hat nun den Wert von 'b'"
   Debug "b = "+Str(b)+"            < 'b' hat nun den Wert von 'c'"
   Debug "c = "+Str(c)+"            < 'c' hat nun den Wert von 'd'"
   Debug "d = "+Str(d)+"  < komplett falscher Wert"
   Debug "z = "+Str(z)
EndProcedure

StaticBug()
korrekter weise ist z am ende 1
XOr usw. funktioniert nur im Kontext mit If

Verfasst: 07.06.2007 14:50
von mk-soft
Wenn die Variablen nicht deklariert worden sind führt es zu einen Fehler und die Variable B wird erstört

Code: Alles auswählen

;Global a,b

a = #False
b = #True
;------------------
Debug "A=" + Str(a)
Debug "B=" + Str(b)

If a XOr b
  Debug "True"
EndIf

Debug "A=" + Str(a)
Debug "B=" + Str(b)

c = a XOr b

Debug "A=" + Str(a)
Debug "B=" + Str(b)
Debug "C=" + Str(c)
;------------------

Procedure test()

Debug "In Procedure"
If a XOr b
  Debug "True"
EndIf

Debug "A=" + Str(a)
Debug "B=" + Str(b)

c = a XOr b

Debug "A=" + Str(a)
Debug "B=" + Str(b)
Debug "C=" + Str(c)

EndProcedure

;------------------

test()

Verfasst: 07.06.2007 14:54
von ts-soft

Code: Alles auswählen

c = a XOr b
Das ist kein Vergleichsoperator, also warum sollte XOr dort funktionieren?
Das ist ein Zuweisungsoperator, das geht nicht
PureBasic.chm hat geschrieben:Logisches XOR. Kann zum Kombinieren der logisch wahren ('true') und falschen ('false') Ergebnisse der Vergleichsoperatoren benutzt werden und ergibt die in der folgenden Tabelle enthaltenen Resultate.

Verfasst: 07.06.2007 15:01
von mk-soft
Mit And und Or geht es auch

C ist das Ergebnis von Type Boolean (LONG) und sollte somit gehen.
Geht ja auch wenn die Variablen vorher deklariert worden sind.