Fehler beim einbinden einer Headerdatei



  • Hallo,
    ich möchte einige Anwendungsbeispiele nachprogrammieren. Dazu habe ich vom Hersteller ein PDF und eine CD mit Dateien und Treiber geschickt bekommen. Ich erstelle mit Visual C++ 6.0 oder mit VS2005 eine neue Konsolenanwendung. In dem PDF steht nun ich müsse als erstes die benötigte Headerdatei xem3001.h sowie die benötigte Dll einbinden:

    #include "xem3001.h"
    #pragma comment(lib, "XemDll.lib")
    

    Ich mache noch nichts weiter und möchte die Anwendung kompilieren, dann erhalte ich folgenden Fehlercode:

    c:\programme...\xem3001.h(368): error C2258: Ungültige Syntax fuer rein virtuelle Methode; '=0' erforderlich
    c:\programme...\xem3001.h(368): error C2252: 'm_nClkFrequency' : Nur Funktionen koennen rein virtuell deklariert werden
    c:\programme...\xem3001.h(369): error C2258: Ungültige Syntax fuer rein virtuelle Methode; '=0' erforderlich
    c:\programme...\xem3001.h(369): error C2252: 'm_iMaxSerialNumber' : Nur Funktionen koennen rein virtuell deklariert werden
    

    Hier mal ein kleiner Auszug aus der Header. Hab die Zeilen markiert, wo der Wurm dring steckt.

    void GetOutput(const int iIONumber, bool &activated);
    
        /**
         * \brief read input signals
         * \param iIONumber pin number      
         */
        //void EnableTriggerOut(INTERRUPTPROC callback, void *context);
        //void DisableTriggerOut();
        /*
        void GetIntReg (int &reg)
        {
            reg = m_InputRegister1;
        }*/
        //void XemDebug();
    protected:
        void EnterCs(void)     { if (m_Cs) EnterCriticalSection (m_Cs); }
        void LeaveCs(void)  { if (m_Cs) LeaveCriticalSection (m_Cs); }
        int m_InputRegister1;
        void *m_pContext;
    private:
        HANDLE m_hThread;
        CRITICAL_SECTION *m_Cs;
    
        INTERRUPTPROC m_TriggerCallback;
        bool m_runEventTimer;
        //xem3001 declaration
        // okCUsbXEM3001v2 *xem;
        okCUsbFrontPanel *xem;
        //xem3001 onboard clock frequency
    /*(368)*/    static const int m_nClkFrequency = 100000000;
    /*(369)*/    static const int m_iMaxSerialNumber = 64;
    
        //I/O-buffer
        unsigned int m_iOutBuffer;    
        unsigned int m_iInBuffer;
    
        //channel activation flags
        unsigned char m_cChannelActivationFlags;    
        bool m_bChannelConfigured[4];
        bool m_bChannelWrappedAround[4];
    
        //trigger flag
        bool m_bLockinTriggerSig;
        bool m_bPrePulseMode;
    

    Wie kann es sein, dass ein Header bereits 4 Fehlermeldungen bringt, obwohl ich noch nichts gemacht habe? Und wie kann ich diese beseitigen? Hab mal versucht die Werte auf 0 zu setzen, aber dann passiert das selbe in grün. Bin für jede Hilfe Dankbar.



  • Das Ganze sollte mit VS2005 problemlos funktionieren. Der VS6 mag es jedoch
    nnicht wenn du Konstanten auf diese Art im header deklarierest und auch noch
    initialisierst. Du musst die Initialisierung in eine CPP-Datei verschieben.

    const int CKlasse::m_iMaxSerialNumber = 64;
    


  • abrissbirne schrieb:

    /*(368)*/    static const int m_nClkFrequency = 100000000;
    /*(369)*/    static const int m_iMaxSerialNumber = 64;
    
    enum
    {
        m_nClkFrequency = 100000000,
        m_iMaxSerialNumber = 64
    };
    


  • Redhead schrieb:

    Das Ganze sollte mit VS2005 problemlos funktionieren. Der VS6 mag es jedoch
    nnicht wenn du Konstanten auf diese Art im header deklarierest und auch noch
    initialisierst. Du musst die Initialisierung in eine CPP-Datei verschieben.

    const int CKlasse::m_iMaxSerialNumber = 64;
    

    habs mal so versucht:

    #include "stdafx.h"
    #include "xem3001.h"
    
    const int xem3001::m_nClkFrequency = 100000000;
    const int xem3001::m_iMaxSerialNumber = 64;
    

    dann kommt diese Meldung:

    1>------ Build started: Project: Lock-In, Configuration: Debug Win32 ------
    1>Compiling...
    1>Lock-In.cpp
    1>o:\eigene dateien\visual studio 2005\projects\lock-in\lock-in\lock-in.cpp(10) : warning C4273: 'm_nClkFrequency' : inconsistent dll linkage
    1>o:\eigene dateien\visual studio 2005\projects\lock-in\lock-in\xem3001.h(369) : see previous definition of 'private: static int const xem3001::m_nClkFrequency'
    1>o:\eigene dateien\visual studio 2005\projects\lock-in\lock-in\lock-in.cpp(10) : error C2491: 'xem3001::m_nClkFrequency' : definition of dllimport static data member not allowed
    1>o:\eigene dateien\visual studio 2005\projects\lock-in\lock-in\lock-in.cpp(11) : warning C4273: 'm_iMaxSerialNumber' : inconsistent dll linkage
    1>o:\eigene dateien\visual studio 2005\projects\lock-in\lock-in\xem3001.h(370) : see previous definition of 'private: static int const xem3001::m_iMaxSerialNumber'
    1>o:\eigene dateien\visual studio 2005\projects\lock-in\lock-in\lock-in.cpp(11) : error C2491: 'xem3001::m_iMaxSerialNumber' : definition of dllimport static data member not allowed
    

    Classendeklaration beginnt so:

    class DLLDIR xem3001
    {
    


  • cpt. obvious schrieb:

    enum
    {
        m_nClkFrequency = 100000000,
        m_iMaxSerialNumber = 64
    };
    


  • suoivbo .tpc schrieb:

    cpt. obvious schrieb:

    enum
    {
        m_nClkFrequency = 100000000,
        m_iMaxSerialNumber = 64
    };
    

    Nöp. leider auch nit.



  • abrissbirne schrieb:

    Nöp. leider auch nit.

    doch.



  • cpt. obvious schrieb:

    abrissbirne schrieb:

    Nöp. leider auch nit.

    doch.

    Kannst doch nicht doch sagen wenn es hier nit funzt 😉

    Habs nu mal so gelöst. Hab im Header bei der Klassendefinition noch eine Publicfunktion definiert.

    void ChangeValue(void);
    

    Und in der C++ Datei dann diese Funktion implementiert:

    void xem3001::ChangeValue(void)
    {
    	const int m_nClkFrequency = 100000000;
    	const int m_iMaxSerialNumber = 64;
    };
    

    Das Schluckt er wenigstens! 😃



  • abrissbirne schrieb:

    cpt. obvious schrieb:

    abrissbirne schrieb:

    Nöp. leider auch nit.

    doch.

    Kannst doch nicht doch sagen wenn es hier nit funzt 😉

    Hast du denn die Bibliothek im Quelltext vorliegen? Wenn ja, solltest du sie anpassen (wahlweise indem du die Konstanten durch enum's ersetzt oder die Initialisierungswerte in die CPP packst). Wenn nicht, frag den Entwickler nach einer VS6-tauglichen Version der Bibliothek oder verwende einen neueren Compiler.

    Habs nu mal so gelöst. Hab im Header bei der Klassendefinition noch eine Publicfunktion definiert.

    void ChangeValue(void);
    

    Und in der C++ Datei dann diese Funktion implementiert:

    void xem3001::ChangeValue(void)
    {
    	const int m_nClkFrequency = 100000000;
    	const int m_iMaxSerialNumber = 64;
    };
    

    Das Schluckt er wenigstens! 😃

    Ja, er schluckt es - aber die beiden Variablen haben absolut nichts mit den static-Werten der Klasse zu tun (außer daß sie zufällig den selben Namen haben).


Anmelden zum Antworten