Ich kapiers nicht



  • Hallo,

    ich habe ein kleines Problem und komme einfach nicht
    dahinter was an meinem Programm falsch ist.
    Ich hab mal ein kleines Beispiel gebastelt wol mein Problem auftaucht.

    //////////////////////////////////////////////////////////
    //main.c
    #include "main.h"
    
    int main(int argc, char* argv[])
    {
      lStatic = 100; // lStatic erhält den Wert 100
      lStatic = 200; // lStatic erhält den Wert 200
      Test();        // lStatic Wert bleibt unverändert
      // Warum wird der Wert von Static nicht auf 99 gesetzt?
      return 0;
    };
    //////////////////////////////////////////////////////////
    //main.h
    #ifndef MAIN_H
    #define MAIN_H
    
    #include "glob.h"
    #include "test.h"
    
    #endif //MAIN_H
    //////////////////////////////////////////////////////////
    //glob.h
    #ifndef GLOB_H
    #define GLOB_H
    
    static unsigned long lStatic;
    
    #endif //GLOB_H
    //////////////////////////////////////////////////////////
    //test.c
    #include "main.h"
    void Test()
    {
      lStatic = 99;
    };
    //////////////////////////////////////////////////////////
    //test.h
    #ifndef WORK_H
    #define WORK_H
    
    void Work();
    
    #endif //WORK_H
    //////////////////////////////////////////////////////////
    

    Ich hoffe jemand kann mir bei meinem Problem helfen.
    Danke schon mal für alle Informationen

    Bye Peter.



  • Nachdem Du in Deiner .h-Datei eine Variable definierst, ist diese Variable in allen Quellen bekannt, die diese .h-Datei includieren. Das hätte normalerweise einen Linkerfehler verursacht, wenn der selbe Bezeichner mehrmals gelinkt werden soll.

    Du hast diese Variable aber mit static qualifiziert -> den Sichtbarkeitsbereich eingeschränkt. Deshalb sind zwei Variablen entstanden, die sich gegenseitig nicht beeinflussen.

    Die Lösung ist einfach: Erstelle zu Deiner .h Datei eine passende .c, in der ganz einfach dises Variable definiert (ohne static) wird. In der .h änderst Du das 'static' in 'extern'.



  • @mady,

    danke erstmal für die schnelle Hilfe.
    Ich habe gedacht das durch das

    #ifndef GLOB_H
    #define GLOB_H
    ...
    #endif //GLOB_H
    

    die Variable nur einmal erstellt wird.
    Ich werde mir wohl nochmal etwas aus meinem
    C/C++ Buch durchlesen müssen.

    Bye Peter.



  • jep, nur einmal pro Uebersetzungseinheit!

    Aber du hast ja 2 uebersetzungseinheiten 🙂


Anmelden zum Antworten