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
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
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.
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.