Eingebundenes Header will nicht



  • Der Code ist soweit korrekt. Der Fehler liegt woanders.

    Wegen Deiner Annahme bezüglich der Namespaces: Liegt denn K8055 in einem Namensraum namens K8055, oder vielleicht in einem ganz anderen?



  • Da muss ich wohl was falsch verstanden haben, ich dachte sobald eine class nicht in der .cpp Datei liegt, sonder die ihre Header-Datei eingebunden muss ein Aufruf ihrer Funktionen etc so bekanntgemacht werden: Klassenname::Funktion, aber ok.

    Ich poste mal die ganze Header-Datei werd ich sowieso nicht ganz schlau draus:

    #ifndef _K8055_
    #define _K8055_
    
    #ifndef _PORT_H_
    #include "port.h"
    #endif
    
    #define K8055_NCARDS		4	// Number of possible cards
    
    // Bit locations
    #define K8055_NDOUT		5 	// Number of digital outputs
    #define K8055_DIN1		0x10
    #define K8055_DIN2		0x20
    #define K8055_DIN3		0x01
    #define K8055_DIN4		0x40
    #define K8055_DIN5		0x80
    
    // Control byte values
    #define K8055_CRESET_1		0x03
    #define K8055_CRESET_2		0x04
    #define K8055_OUTPUT		0x05
    
    #define K8055_NO_ADDR		0xFFFF
    #define K8055_VENDOR		0x10CF
    
    // Input "Registers" in 8 byte blocks 
    #define K8055_IN_DIGITAL	0
    #define K8055_DA_1		2
    #define K8055_DA_2		3
    #define K8055_CNT_1		4
    #define K8055_CNT_2		6
    
    // Output Registers
    #define K8055_CTL		0
    #define K8055_OUT_DIGITAL	1
    #define K8055_AD_1		2
    #define K8055_AD_2		3
    #define K8055_DEBOUNCE_1	6
    #define K8055_DEBOUNCE_2	7
    
    extern const unsigned int	s_K8055_ids[];
    extern const unsigned char	s_K8055_dndx[];
    extern const int 		s_bytebit[];
    
    #ifdef __cplusplus
    #ifdef _MDEVICE_
    /** Class to interface Velleman K8055 as a generic IOBoard object */
    class K8055 : public IOBoard
    {
    	protected:
    	Boolean	m_fopen[K8055_NCARDS];
    	Boolean m_fdirty[K8055_NCARDS];
    	Boolean	m_fBulkWrite;
    	Boolean m_fBulkRead;
    	void 	ReadAllAD(BYTE *datum);
    	public:
    	K8055();
    	~K8055();
    	Boolean ReadAD(int channel, int *value);
    	Boolean	WriteDA(int channel, int value);
    	Boolean	ReadIO(int channel, int *value);
    	Boolean WriteIO(int channel, int value);
    	Boolean ReadCounter(int channel, int *value);
    	Boolean ClearCounter(int channel);
    	Boolean	BulkWrite(Boolean fBulk=FALSE);
    	Boolean BulkRead(Boolean fBulk=FALSE);
    	int 	Escape(int cmd, int param);
    	int 	GetBits(int type, int channel);
    
    };
    #endif
    extern "C" {
    #endif
    int k8055_writeBlock(int addr);
    
    int k8055_readBlock(int addr);
    
    // Set internal device address 
    int setAddr(unsigned int addr);
    
    // Set a byte in the output buffer
    void setOutputByte(int ndx, unsigned char ubyte);
    
    // Get a byte from the output buffer
    unsigned char getOutputByte(int ndx);
    
    // Get a byte from the input buffer
    unsigned char getInputByte(int ndx);
    
    // Get the 16 bit count from one of the counters
    int getInputCounter(int cntr);
    
    // Get adjusted digital input
    int getInputDigital();
    
    // Clear the bytes in the output buffer
    void clearOutputBytes(void);
    
    //
    // Standard Velleman API
    // (Pretty bogus really because the names are too generic
    // and would probably conflict with other APIs)
    //
    int 	OpenDevice(int addr);
    void 	CloseDevice(void);
    int 	ReadAnalogChannel(int ch);
    int 	ReadAllAnalog(int *data1, int *data2);
    int 	OutputAnalogChannel(int ch, int data);
    int 	OutputAllAnalog(int data1, int data2);
    int 	ClearAnalogChannel(int ch);
    int 	ClearAllAnalog(void);
    int 	SetAnalogChannel(int ch);
    int 	SetAllAnalog(void);
    int 	WriteAllDigital(int data);
    int 	ClearDigitalChannel(int ch);
    int 	ClearAllDigital(void);
    int 	SetDigitalChannel(int ch);
    int 	SetAllDigital(void);
    Boolean	ReadDigitalChannel(int ch);
    long 	ReadAllDigital();
    int 	ResetCounter(int c);
    long 	ReadCounter(int c);
    int 	SetCounterDebounceTime(int c, int deb);
    
    #ifdef __cplusplus
    }
    #endif
    
    #endif
    

    Irgendeine Ideee was da falsch läuft?



  • Da steht nüscht von irgendnem Namespace (also ist mein Code richtig ;)). Woher kommt _MDEVICE_? Wird das in einem anderen Header definiert? Dann solltest du den vorher inkludieren (oder ggf. mal selbst mit "#define _MDEVICE_" vorher definieren und schauen obs kracht ;)).



  • Ok, jetzt versteh ich gar nichts mehr: Ich habe noch eine Header-Datei importiert namens port.h die so aussieht

    #ifndef _PORT_H_
    #define _PORT_H_
    
    #define TIME_SCALE	1000000
    
    #ifndef INT_MAX
    #define INT_MAX		2147483647
    #endif
    #ifndef INT_MIN
    #define INT_MIN		(-INT_MAX - 1)
    #endif
    
    typedef unsigned char BYTE;
    typedef unsigned char Boolean;
    
    #ifndef TRUE
    #define TRUE 1
    #endif
    #ifndef FALSE
    #define FALSE 0
    #endif
    #ifndef Boolean_DEFINED
    #define Boolean_DEFINED
    typedef unsigned char Boolean;
    #endif
    #ifndef MAX
    #define MAX(a,b) (((a)>(b))?(a):(b))
    #endif
    #ifndef MIN
    #define MIN(a,b) (((a)<(b))?(a):(b))
    #endif
    #ifndef ABS
    #define ABS(a)	(a < 0)?(-a):(a)
    #endif
    #ifdef WIN32
    #define VSNPRINTF	_vsnprintf
    #define ALLOCA(cb)	_alloca(cb)
    #define SNPRINTF	_snprintf
    #else
    #define VSNPRINTF	vsnprintf
    #define ALLOCA(cb)	alloca(cb)
    #define SNPRINTF	snprintf
    #endif
    
    extern void errprintf(char *fmt, ...);
    
    enum DeviceTypes
    {
    	DEVTYPE_UNKNOWN,
    	DEVTYPE_FILE,
    	DEVTYPE_SERIAL232,
    	DEVTYPE_SERIALUSB,
    	DEVTYPE_SERIALI2C,
    	DEVTYPE_SERIALPS2,
    	DEVTYPE_PARPORT,
    	DEVTYPE_PCI,
    	DEVTYPE_AGP,
    	DEVTYPE_PIDE,
    	DEVTYPE_SATA,
    	DEVTYPE_SCSI,
    	DEVTYPE_USER
    };
    
    class MDevice
    {
    	protected:
    	int	m_devtype;
    };
    #endif
    

    Wie man sehen kann gibt es eine Klasse MDevice wenn ich also dadrüber #define _MEDVICE_ einfüge. Verschwindet der Fehler in der main-Funktion ich bekomme aber einen neuen:

    class K8055 : public IOBoard
    {
    	protected:
    	Boolean	m_fopen[K8055_NCARDS];
    	Boolean m_fdirty[K8055_NCARDS];
    	Boolean	m_fBulkWrite;
    	Boolean m_fBulkRead;
    ....
    

    In den zweiten Zeile gibt es die Fehlermeldung:
    error: expected class-name before ‘{’ token



  • Dann ist die Klasse IOBoard nicht bekannt.



  • Jetzt hab ichs fast, es war falsch die Header-Datei local einzubinden(#include "blabla"), ich musste sie so einbinden: #include <blabla>

    Jetzt bekommen ich noch den Fehler:
    /usr/local/include/k8055.h error: ‘Boolean’ does not name a type
    Ich vermute das liegt daran, dass der boolsche Datentyp bei mir schlicht bool heißt. Ich hab jetzt natürlich wenig Lust alle booleans in der Bibliothek rauszusuchen gibt es dafür ein Compileranweisung?



  • typedef bool Boolean;
    

    aber schön ist das nicht, mach lieber ein find&replace



  • Ok, danke hat geholfen Boolean stand zwar nicht für bool wie ich zuerst dachte sonder für "unsigned char", aber das Problem ist umschifft mein Programmcode sieht jetzt so aus:

    #include <iostream>
    #include <k8055.h>
    
    int main(){
    	int addr =  OpenDevice(0);
    	int AnalogChn1 = ReadAnalogChannel(1);
    	std::cout << "Kontakt aufgenommen. Addr.: " << addr << std::endl 
    				<< "Wert Analog-Kanal 1: " << AnalogChn1;
    	CloseDevice();
    	return 0;
    }
    

    und ich bekomme jetzt diese Fehlermeldungen:
    undefined reference to CloseDevice' main.cpp line 9 undefined reference toOpenDevice' main.cpp line 5



  • Also ich komm hiermit nicht weiter. Vielleicht hat ja jemand Lust sich die Sources der Bibliothek runterzuladen, sie auszuprobieren und mir zu sagen was ich falsch machen.
    http://www.mohawksoft.org/?q=node/15
    Wäre nett. 🙂



  • So, nachdem ich schon fast aufgegeben hatte (siehe oben)hab ich nun eine C-Bibliothek gefunden mit der es geht,JUHU. Danke nochmal.



  • Hallo, Ihr Fachleute !

    Benötige Hilfe beim Ansprechen des K8055D: Beim "CloseDevice();" erhalte ich die
    Fehlermeldung: "Die Ausnahme "Unbekannter Softwarefehler" (0x0eedfade) in der Anwendung ander Stelle 0x77ef142 aufgetreten." Ansonsten macht das Programm alles, was es soll....

    Die entscheidenden Teile meines Programmlistings sind:

    #include "K8055D.h"
    #include <windows.h> // for DLL usage
    #include <iostream>
    #include <time.h>

    ....

    int main()
    {
    int status;
    long int A1_in = -1; long int A2_in = -1;
    int D1_in; int z1; int z2;

    // Karte 0 öffnen

    cout << "\nOeffne Karte 0...";
    status = OpenDevice( 0 );
    if ( status < 0 )
    {
    cout << "\nFehler beim Oeffnen der Karte";
    return -1;
    }

    ....

    // Karte schließen

    CloseDevice;
    warte( 1000 );
    return EXIT_SUCCESS;
    }

    Könnt Ihr mir helfen, meinen Blindflug zu beenden ?



  • Ja, der Fehler liegt ziemlich sicher IN deiner Funktion CloseDevice(). (ich hoffe mal, die fehlenden Klammern sind beim Abtippen entstanden)



  • Danke für den Tipp ! Allerdings waren die Klammern die Ursache noch nicht. Diegleiche Fehlermeldung erscheint noch immer. Ich forsche also weiter:

    * "inaktuelle DLL" ?...
    * "DLL wieder freigeben" ?...

    Habe auch schon einige progs aus WWW für das K8050D-Board probiert. - Diegleiche Fehlermeldung tritt bei denen teilweise auch auf.

    BIN FUER JEDEN TIPP DANKBAR.



  • Fehler behoben !
    Ursache war eine fehlerhafte DLL von Vellemann. Er stellt selber eine korrigierte auf seiner Webseite zur Verfügung:

    http://www.velleman.be/be/de/download/files/ ; k8055_dll_2_001.zip

    Damit läuft alles glatt.


Anmelden zum Antworten