Globale Variable verändern...oder gehtz anders?



  • Hallo Jungs,

    mein Problem ist folgendes:

    In meinem Hauptprogramm läft eine schleife, solange eine bool variable false ist!
    Diese boolvariable ist global in einer headerdatei mit false initialisiert!

    In einer anderen Datei ist eine funktion, die siese Boolvariable true setzen soll!

    Nach aufruf der funktion, lläuft schleife aber weiter..d.h, das die variable nicht verändert wurde!

    Wie also kann ich die boolvariable auf true setzen??

    Fehlermeldung:

    Warning: Public symbol '_quit' defined in both module (nun meine dateinamen)!
    Ich habe diese quit (genannte boolvariable) aber nur in einer headerdatei stehen!

    Also wie löse ich das problem?

    Bzw...gibt es eine bessere methode?



  • mach '_quit' in eine .c oder .cpp datei und in den header schreibst du
    'extern bool _quit;'



  • da bekomm ich Linker_Fehler,

    unresolved external '_Quit' referenced from (DAtei)

    möchte nur eine bool variable, die ich an verschiedenen orten verändern kann!
    😕



  • im header immer extern.
    in nur einer cpp-datei dann die normale definition.
    und volatile nicht vergessen, wenn ein anderer thread daran rumfummelt.



  • ich würde auf globale variablen immer verzichten!!



  • globel hater schrieb:

    ich würde auf globale variablen immer verzichten!!

    es geht aber nicht immer!!



  • es geht ja eh nicht, immer der Linker Fehler!
    Hab das so:

    Unit1.cpp
    ......
    
    bool quit=false;
    while(quit==false)
    {
    //bla
    irgendwann funktionsaufruf Quit() //funktion aus Unit2.cpp,die soll quit true machen
    }
    
    Unit1.h
    ........
    
    extern bool Quit;
    ...
    
    Unit2.cpp
    .........
    
    void Quit()
    {
    quit=true;
    }
    
    ....
    
    Unit2.h
    .......
    
    void Quit();
    

    hm...wie sollte ich das am besten machen??



  • extern bool Quit;
    

    meinst du nicht das du hier das quir auch klein schreiben solltest
    so wie in der initialsierung?

    Unit1.cpp
    ......
    
    bool quit=false;
    

    gruessle TDO



  • ja hatte mich nur verschrieben!



  • Du hast hoffentlich in Unit2.cpp auch Unit1.h eingebunden?



  • ja hab ich gemacht..... 😕



  • groovemaster schrieb:

    Du hast hoffentlich in Unit2.cpp auch Unit1.h eingebunden?

    Das gleiche gilt natürlich auch für Unit1.cpp und Unit2.h bzgl. der Funktion Quit.



  • ja ich hab alles included!!! 😮

    Weiß echt nimmer weiter!



  • was ich auch gemerkt habe, egal was ich extern mache...da bringt er immer einen linker_fehler!

    Und komisch ist auch der sachverhalt:

    GLobale Variable in Unit2.h--->Diese Variable kann ich in Unit1.cpp(Hauptprogramm verändern)....aber in Unit2.cpp (eine Funktion) kann die Variable nicht verändern....



  • ich geb euch mal ein besiepiel:

    File1.h

    #ifndef FILE1H
    #define FILE1H
    int test2;
    #endif
    

    Unit2.h

    #ifndef Unit2H
    #define Unit2H
    int test;
    void Getit();
    
    //---------------------------------------------------------------------------
    #endif
    

    Unit2.cpp

    #include "Unit2.h"
    #include "File1.h"
    using namespace std;
    
    //---------------------------------------------------------------------------
    
    void Getit()
    {
      cout<<::test<<" "<<::test2<<endl;
    }
    #pragma package(smart_init)
    

    Unit1.cpp

    #include "File1.h"
    #include "Unit2.h"
    using namespace std;
    
    //---------------------------------------------------------------------------
    
    #pragma argsused
    void Getit2()
    {
     cout<<test<<" "<<test2<<endl;
    }
    int main(int argc, char* argv[])
    {
    test=1;
    test2=2;
    Getit();
    Getit2();
    getch();       return 0;
    }
    

    Ausgabe:

    0 0 
    1 2
    

    sollte aber so sein..

    1 2
    1 2
    

    was mach ich falsch??



  • Dein letztes Beispiel dürfte nicht funktionieren.
    Grund:
    Zuerst wird Unit1.cpp kompiliert Du includierst beide Header => die symbole test und test1 sind in Unit1.o definiert.
    Dann wird Unit2.cpp kompiliert, wiederum sind beide Header includiert. test und test1 werden auch in Unit2.o definiert.
    Dann soll der linker aus Unit1.o und Unit2.o eine .exe erstellen. Er beschwert sich das test und test1 doppelt vorkommen.
    Ausweg:
    Du declarierst die variablen in den Headern als extern. Und definierst test in File1.cpp und test2 in Unit2.cpp

    Kurt



  • ok, probiers mal aus!



  • Dancing_ric schrieb:

    was mach ich falsch??

    Du solltest dir die Beiträge auch durchlesen. net und volkard haben doch bereits geschrieben, dass in die ÜE die Definition, in die Headerdatei die Deklaration gehört.


Anmelden zum Antworten