static Variable 0 setzen klappt nicht
-
Hallo,
ich habe hier ein Verhalten, das ich nicht verstehe:
void change_position(Widget widget, int shape) { Window win; Cursor cursor; Pixmap pixmap1; Pixmap pixmap2; unsigned char *bits; int width; int height; int xs, ys; static int lastShape[2]; static int index = 0; static int numCalls = 1; printf("numCalls: %i\n", called++); #ifdef APP return; #endif printf("shape: %i, index: %i\n", shape, index); if (shape == C_SHAPE_LAST) shape = lastShape[index]; else lastShape[index] = shape; index = !index;index ist eine statische Variable, die immer zwischen 0 und 1 wechselt. Am Anfang hat index den Wert 0. numCalls ist zum Debuggen und steht fuer die Anzahl Aufrufe der Funktion.
Die Ausgabe ist:
numCalls: 1
shape: 3, index: 50011280Man sieht, die Funktion wurde gerade das 1. Mal aufgerufen, aber index hat den Wert 50011280, obwohl ich ihn auf 0 gesetzt habe. Wie kann das sein?!
Offenbar besteht das Problem nur bei der 0. Setze ich index auf 1 oder 2, dann wird auch 1 oder 2 geprinted. Wieso steht in index so ein Schrott, wenn ich es mit 0 initialisiere??
-
Weil !index nicht das macht was du denkst.
Entweder nimmst du einen bool und vertraust auf die automatische Konvertierung false->0 true->1, oder du weist explizit 1 bzw 0 zu:index = index==0 ? 1 : 0;
-
Variable zwischen 0 und 1 hin und her schalten:
index ^= 1;
-
Die Zeile
index = !index(die im Übrigen sehr wohl genau das tut, was hier gewünscht ist) wurde doch noch gar nicht erreicht. Wieso gebt ihr so offensichtlich unsinnige Antworten?Ich kann leider auch nicht helfen, eigentlich sollte das funktionieren. Mein Tipp wäre ja, dass das mal wieder nicht die ganze Wahrheit ist. Auffallend ist z.B. die Diskrepanz zwischen den Bezeichnern numCalls und called, die offenbar eigentlich dasselbe sein sollten ... bitte funktionierenden Code posten.
-
Wenn Index sowieso nur zwischen
1und0wechselt, wieso nimmst du dann nicht gleich einen boolschen Typ?index = !indexheißt weiseindexseinen negierten Wert zu. Die Negation von0ist1.Die Negation von1ist0. Genauso für boolsche Typen.C++ Standard 5.3.1 Klausel 8 schrieb:
The operand of the logical negation operator ! is implicitly converted to bool (clause 4); its value is true if the
converted operand is false and false otherwise. The type of the result is bool.
-
Also: mit der Initialisierung mit static int index = 0 und index = !index zum Alternieren (0,1) ist alles ok. Der Bock liegt deshalb woanders!
edit: ob das nun mit int oder bool gemacht wird, ändert nichts!
