Globale Variablen und ihre Werte



  • Hallo Leute,

    ja jetzt kommt noch eine Frage zu globalen Variablen, denn ich hab im Netz keine Lösung zu meinem Problem gefunden (MFC-MDI Projekt):
    Ich habe eine globale Variable im Header einer Klasse deklariert (außerhalb der Klasse):

    //FirtsClass.h headerfile
    static int global;
    class CFirstClass ...
    

    und greife von der ViewClass drauf zu und ändere Werte nachdem ich die headerfile eingebunden habe

    //CMyView.h
    #include "FirstClass.h"
    

    bis hierher alles klar.
    Dann erstelle ich ein neuen Dialog(Klasse) und will an die Daten ran

    //NewDlg.cpp
    #include "FirstClass.h"
    

    Nur sind keine Daten drin. Es ist als ob ich die Variable neu initialisiert habe.
    Dann dachte ich, ich sage

    //NewDlg.cpp
    #include "MyView.h"
    

    da dann die Daten vieleicht von der View mitkommen, aber da kommt beim Compilieren ne Fehlermedung: in der Zeile

    //CMyView.h
    CMyDoc* GetDocument() const;
    

    error C2143: Syntaxfehler: Es fehlt ';' vor '*'
    error C4430: Fehlender Typspezifizierer - int wird angenommen.

    Wieso kenn er jetzt nicht mehr CMyDoc und wie komme ich an die Daten ran?

    Danke Micha



  • ja jetzt kommt noch eine Frage zu globalen Variablen, denn ich hab im Netz keine Lösung zu meinem Problem gefunden (MFC-MDI Projekt):

    Wenn Du genauso suchst, wie Du Postest, wundert das nicht.

    Google: C++ global extern Google: + globale variablen extern



  • der_micha1981 schrieb:

    MFC-MDI Projekt

    Warum fragst Du dann im .NET-Forum?

    zum Ersten:
    Statische globale Variablen sind nur innerhalb einer Übersetzungseinheit sichtbar. Sprich, Du hast für jede Übersetzung, in der Du FirstClass.h includierst, eine andere Inkarnation der Variablen "global".

    zum Zweiten:
    Das sieht so aus, als wäre MyView.h vor MyDoc.h und MyDoc.h in MyView.h selbst garnicht inkludiert (oder Du hast eine zirkuläre Abhängigkeit). Gutes Stichwort an dieser Stelle: Forward Declaration.



  • Dieser Thread wurde von Moderator/in Jochen Kalmbach aus dem Forum C++/CLI mit .NET in das Forum MFC (Visual C++) verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Falsches Forum? das ist doch eher eine allgemneine C++ Sache, aber was soll's.

    Ich beziehe habe das Beispiel http://www.imb-jena.de/~gmueller/kurse/c_c++/c_globv.html Ich habe es auf mein Projekt umgeschrieben, aber es klappt nicht: global.h erzeugt und darin die Variablen mit extern deklariert. global.h in Firstclass.cpp und MyView.cpp includiert. Es wird folgender Fehler erzeugt:
    MyView.obj : error LNK2001: Nicht aufgelöstes externes Symbol ""int g_x" (?g_x@@3HA)".
    bei static kommt kein Fehler und ohne direktive kommt
    MyView.obj : error LNK2005: "int g_x" (?g_x@@3HA) ist bereits in FirstClass.obj definiert.

    Was mache ich Falsch?

    Micha


  • Mod

    1. Im Header muss eine globale Variable mit extern deklariert werden.
    2. In einem Cpp Modul muss diese Variable aber auch deklariert werden (ohne extern).



  • Danke! das wars



  • Hierzu habe ich auch kurz eine Frage.

    Ich habe in der cpp Datein in der meine View Klasse liegt zwei globale Variablen definiert.

    Irgendwann werden diese innerhalb der View Klasse initialisiert und einer globalen Funktion verwendet. Diese globale Funktion wird mehrfach aufgerufen.
    Nach dem 2 Aufruf sind die Werte in den globalen Dateien aber wieder verschwunden und diese sehen ebenfalls aus als wären Sie nie initialisiert worden.

    Wie kann das sein?


  • Mod

    Hast Du diese Vaiablen evtl. zweimal definiert?

    Zeig uns mal Code, der Funktionund der Definition, sowie der Deklarationen.



  • Die Variablen sind definitv nur einmal definiert.

    SOCKADDR_IN g_saRemote;
    SOCKET g_sockRTP;
    DataPacket g_Pack; //Ebenfalls eine Struktur - Diese wird seltsamer Weise nicht neu deklariert.
    
    //Hier die Funktion die auch die Variablen initialisert.
    //Wird nur einmal aufgerufen
    void start(SOCKET sock, SOCKADDR_IN saRemote)
    {
        MMRESULT mmr;
        g_sockRTP = sock;
        g_saRemote.sin_family = saRemote.sin_family;
        g_saRemote.sin_port = saRemote.sin_port;
        g_saRemote.sin_addr = saRemote.sin_addr;
        char szErr[1024];
        pBuffer1 = (PBYTE)malloc(16384);
        pWaveHdr1 = (PWAVEHDR)malloc(sizeof(WAVEHDR));
        :
        :
        :
    }
    
    //Und hier der Aufruf in der View Klasse
    void CClientView::OnBnClickCall()
    {
        //Vorher wird ein Thread gestarted, der die Server Adresse und den Port des 
        //Servers zurückliefert
        if(m_threadqueue.IsOk)
        {
            SOCKADDR_IN sa;
            sa.sin_family = AF_INET;
            sa.sin_port = htons(m_threadqueue.port);
            sa.sin_addr.s_addr = inet_addr(m_threadqueue.addr.c_str());
            SOCKET s = m_threadqueue.sock;
            start(s, sa);
        }
    }
    
    //Upps ganz vergessen die Methode die immer aufgerufen wird.
    //Leicht abgespeckt
    bool sendBuffer(char* szBuffer)
    {
        int nSend = 0;
        nSend = sendto(g_sockRTP, szBuffer, strlen(szBuffer), 0, (SOCKADDR*)&g_saRemote, sizeof(SOCKADDR_IN));
    if(nSend <= 0)
        return false;
    
    return true;
    }
    

Anmelden zum Antworten