Muss bool üblicherweise initialisiert werden? Problem mit MinGW 3.4.5, welche Version benutzen?

08/04/2008 - 16:51 von Edzard Egberts | Report spam
Hallo,

gleich vorweg - wegen "compilerspezifisch" kann ich das leider nicht in
der C++-Gruppe fragen und hoffe, dass das hier jemanden interessiert:

Ich bin gerade aus allen Wolken gefallen, weil sich bool nicht mehr
invertieren ließ: Bool_Var= !Bool_Var; ergibt immer true. Das passiert,
wenn ich die Bool_Var nicht initialisiere (z.B. Blinkflags, wo es mir
eigentlich egal ist, ob das Blinken mit "An" oder "Aus" startet), also

bool Bool_Var; // statt bool Bool_Var= false;
Bool_Var= !Bool_Var; // ist immer true

Der Debugger zeigt so für Bool_Var z.B. "115" an und beim Invertieren
wechselt das zwischen "115" und "114" - ein völlig unerwartetes
Verhalten. Interessanterweise funktioniert das bei einer Zuweisung
richtig, z.B.

int FehlerNr= 34;
bool Fehler= Fehlernummer; // ergibt true, statt "34"

Ich halte das für einen groben Fehler - auch ohne Initialisierung darf
eine Variable doch nicht den Typ wechseln, sondern sollte die
Eigenschaften des entsprechenden Datentyps behalten, also zufàllig
"true" oder "false" sein und nicht "115". Gibt es dazu abweichende
Meinungen?

Hat hier jemand Erfahrungen mit der MinGW-4-Version, ist die brauchbar,
oder enthàlt die ebenfalls solche Fehler? MinGW 3.4.5 ist ja "current"
und ich habe das bis zu diesem Fehler für die "Produktivversion"
gehalten - 4,94 MB Quelltext meines aktuellen Projektes auf
Initialisierung von bool-Variablen zu prüfen, steigert meine
Produktivitàt aber nicht gerade. ;o(

Gruß,

Ed
 

Lesen sie die antworten

#1 Wolfgang Fellger
08/04/2008 - 17:04 | Warnen spam
Edzard Egberts schrieb:

Ich halte das für einen groben Fehler - auch ohne Initialisierung darf eine
Variable doch nicht den Typ wechseln, sondern sollte die Eigenschaften des
entsprechenden Datentyps behalten, also zufàllig "true" oder "false" sein
und nicht "115". Gibt es dazu abweichende Meinungen?



Ein bool IST in C ein Integer, da wird auch kein großer Hehl daraus gemacht.
Die Definition ist explizit "False wenn 0, sonst True".

Die Implementierung des !-Operators ist hier aber tatsàchlich kaputt, die
Operation sollte mit obigem umgehen können und immer 0 oder 1 liefern. (!!
ist daher tatsàchlich keine No-Op, sondern "normalisiert" einen bool.)

Wolfgang Fellger

Ähnliche fragen