Boolean mit falschem Wert

Lschreyer
Schreiberling
Avatar
Gender: n/a
Posts: 527
Registered: 02 / 2007
Subject:

Boolean mit falschem Wert

 · 
Posted: 25.11.2017 - 17:28  ·  #1
Ich hatte ein kurioses Problem mit einer Variable vom Typ Boolean:
Diese speichere ich im EEprom eines Mega1284p und kopiere sie beim Start in einem normale Boolean-Var.

Nun war der Wert eines Tages im Eeprom anscheinend durch etwas anderes als 0 oder 1 überschrieben. Habe ich noch nie gehabt, war aber jetzt so. Die Software zeigte die Variable immer als TRUE an, wohl weil sie ungleich 0 war. Einige Teile des Programms hielten sie aber für False, was sehr unlustige Effekte nach sich zog, ein heilloses Chaos entstand! Die Variable steuert große Teile des Programms.

Da ich in den Einstellungen meines Gerätchens die Änderung der Variable mit
Code

X_MotorAvailable := NOT X_MotorAvailable;

ändere, wurde das nie mehr False, egal was ich versuchte. Ist klar, ein "NOT 64" wird ja etwas anderes als 0 oder 1.

Die Software zeigte TRUE an, obwohl der Wert des Bytes, dass den Boolean repräsentiert nicht 1 war.
So etwas habe ich bisher noch nie gehabt, das ist ziemlich blöd, ich muss dann wohl immer

Code

var b: Boolean;

 if byte(b)>0 then
   b:=boolean(0);
 else
   b:=boolean(1);
 endif;


machen um sicher zu gehen? Anscheinend kontrolliert der Compiler den Inhalt der Variable nicht.
rh
Administrator
Avatar
Gender:
Location: Germany
Age: 24
Homepage: e-lab.de
Posts: 5558
Registered: 03 / 2002
Subject:

Re: Boolean mit falschem Wert

 · 
Posted: 25.11.2017 - 19:26  ·  #2
Hallo Louis,

per definition ist ein boolean entweder 0 oder <> 0
Eine 1 oder $FF ist nicht zwingend. Das kann aber manchmal
bei boolean compares zu Missverständnissen füheren.

rolf
Merlin
Administrator
Avatar
Gender:
Age: 24
Posts: 1409
Registered: 03 / 2005
Subject:

Re: Boolean mit falschem Wert

 · 
Posted: 25.11.2017 - 22:48  ·  #3
I assume 'NOT' compiles to the assembler 'NOT' which is a bitwise NOT, hence X := NOT X only works properly for values 0 and $FF (not for 1, ironically). The following is sufficient to cater for other cases

Code

if X then
  X := FALSE;
else
  X := TRUE;
endif;


No casting is necessary.

But it would be nice if X := NOT X did a logical NOT rather than a bitwise NOT (if indeed my assumption is correct) eg

Code

LDS _ACCA, X
CPI _ACCA, 0
LDI _ACCA, 0
BRNE L001
LDI _ACCA, 0FFh
L001:
STS X, _ACCA
Selected quotes for multi-quoting:   0

Registered users in this topic

Currently no registered users in this section

The statistic shows who was online during the last 5 minutes. Updated every 90 seconds.
MySQL Queries: 14 · Cache Hits: 14   65   79 · Page-Gen-Time: 0.035865s · Memory Usage: 2 MB · GZIP: on · Viewport: SMXL-HiDPI