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: 50011280

    Man 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;
    

  • Mod

    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 1 und 0 wechselt, wieso nimmst du dann nicht gleich einen boolschen Typ? index = !index heißt weise index seinen negierten Wert zu. Die Negation von 0 ist 1. Die Negation von 1 ist 0 . 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! 😞


Anmelden zum Antworten