Eingebundenes Header will nicht
-
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 #endifIrgendeine 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; }; #endifWie 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 toCloseDevice' 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.