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

Hier werden, insbesondere in den Beta-Phasen, Bugmeldungen gepostet. Das offizielle BugForum ist allerdings hier.
Benutzeravatar
PureLust
Beiträge: 1145
Registriert: 21.07.2005 00:02
Computerausstattung: Hab aktuell im Grunde nur noch 'nen Lenovo Yoga 2 Pro im Einsatz.
Wohnort: am schönen Niederrhein

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

Beitrag 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 !!!
[Dynamic-Dialogs] - komplexe dynamische GUIs einfach erstellen
[DeFlicker] - Fenster flimmerfrei resizen
[WinFX] - Window Effekte (inkl. 'durchklickbares' Window)
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag 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.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag 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.
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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 :|
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Little John

Beitrag von Little John »

Der Bug ist offenbar in der aktuellen Windows-Version 4.10 beta 1 noch nicht behoben ... :(

Gruß, Little John
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Dann poste es doch im englischen Forum!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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()
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Beitrag 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.
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
mk-soft
Beiträge: 3845
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten