maik() Geschrieben 22. Januar 2010 Geschrieben 22. Januar 2010 guten tag die herren, erster post und gleich ne nette frage. es geht um folgendes. ich persönlich bin ein ziemlicher fan von learning-by-doing und hab mich nach den üblichen vorarbeiten einfach mal an ein schon etwas größeres projekt gesetzt. genau genommen geht es dabei um eine kommunikation mit einem endgerät über die serielle schnittstelle (rs485). ich bin ja nun nicht blöde und hab mir ein fertiges interface ausm netz gezogen, und zwar von hier: Serial Communication for WIN32 (Event-driven) wie unschwer zu erkennen ist (ganz runtr scrollen) will der autor dass ich einen callback verwende, was aber bei der oop wohl erstens nicht so sinnig zu sein scheint und außerdem an meine grenzen geht. ich hab mir also gedacht, maik, hab ich mir gedacht, übergib dem tserial_event doch einfach eine referenz auf mein schnittstellenobjekt und ruf dann die betreffende methode einfach so auf. aber, man kennts ja, es will nicht. das ist meine schnittstelle.h #ifndef SCHNITTSTELLE_H #define SCHNITTSTELLE_H #include <conio.h> #include "Tserial_event.h" class Schnittstelle{ private: void SerialEventManager(uint32 object, uint32 event); void OnDataArrival(int size, char *buffer); void SerialCallback(Tserial_event *com_source, uint32 event); Tserial_event* com; int c; int error; char txt[32]; char* buffer; int size; public: Schnittstelle(); ~Schnittstelle(); }; #endif SCHNITTSTELLE_H das der konstruktor in schnittstelle.cpp mit dem callback den ich umgehen will (auskommentiert) Schnittstelle::Schnittstelle(){ com = new Tserial_event(); if (com!=0) { //com->setManager(SerialEventManager); com->owner = (void *) this; error = com->connect("COM5", 9600, SERIAL_PARITY_NONE, 8, false); auf jedenfall bekomme ich, wenn ich nun in die tserial_event.h das #include "Schnittstelle.h" einfüge, böse fehlermeldungen aus denen ich, ehrlich gesagt, nicht schlau werde... Fehler 4 error C2061: Syntaxfehler: Bezeichner 'uint32' c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h 10 Fehler 5 error C2061: Syntaxfehler: Bezeichner 'Tserial_event' c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h 12 Fehler 6 error C2143: Syntaxfehler: Es fehlt ';' vor '*' c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h 14 Fehler 7 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h 14 Fehler 8 error C4430: Fehlender Typspezifizierer - int wird angenommen. Hinweis: "default-int" wird von C++ nicht unterstützt. c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\schnittstelle.h 14 Ich hoffe ihr könnt mit den gegebenen informationen anfangen und mich vom kommenden wahnsinn bewahren, euer maik Zitieren
Klotzkopp Geschrieben 22. Januar 2010 Geschrieben 22. Januar 2010 auf jedenfall bekomme ich, wenn ich nun in die tserial_event.h das #include "Schnittstelle.h" einfüge, böse fehlermeldungen aus denen ich, ehrlich gesagt, nicht schlau werde... Hast du bemerkt, dass in Schnittstelle.h wiederum die Tserial_event.h eingebunden wird? Wenn du das machst, binden sich die Dateien gegenseitig ein, das funktioniert nicht. Über die Includedirektiven kann man Headerdateien vor anderem Code einbinden. Es können aber nicht zwei Dateien gleichzeitig jeweils vor der anderen sein. Die Include-Guards (#ifndef/#define/#endif) sorgen dafür, dass hier keine Endlos-Include-Rekursion passiert, aber trotzdem steht hinterher eine der beiden Dateien hinter der anderen. In den meisten Fällen lässt sich das mit Forward Declarations auflösen. Ich weiß nicht, ob Schnittstelle.h in Tserial_event.h gebraucht wird, aber die Includedirektive für Tserial_event.h in Schnittstelle.h ist nicht unbedingt notwendig. Hier wird nur ein Zeiger des Typs Tserial_event benutzt, ohne auf irgendwelche Member zuzugreifen. Dafür reicht auch eine Forward Declaration. Ersetz also die Includedirektive für Tserial_event.h in Schnittstelle.h durch class Tserial_event; // oder struct Tserial_event, was auch immer Tserial_event ist.[/code] Zitieren
maik() Geschrieben 23. Januar 2010 Autor Geschrieben 23. Januar 2010 ich hab jetzt die includedirektive in Tserial_event.h duch class Schnittstelle; ersetzt, da ja die Schnittstelle das objekt von tserial erstellt. ich hoffe mal ich hab da richtig mitgedacht. wenn ich nun bei der erzeugung des tserialobjekts mit com = new Tserial_event((Schnittstelle*) this) die referenz auf die erzeugende schnittstelle übergebe und der konstruktor wie folgt aussieht Tserial_event:Tserial_event(Schnittstelle* pSchnittstelle){ Schnittstelle = pSchnittstelle; Schnittstelle.test(); erhalte ich die fehlermeldung Fehler 4 error C2228: Links von ".test" muss sich eine Klasse/Struktur/Union befinden. c:\dokumente und einstellungen\maik\desktop\maik\cbus_master\cbus_master\cbus_master\tserial_event.cpp 128 Zitieren
Klotzkopp Geschrieben 23. Januar 2010 Geschrieben 23. Januar 2010 Schnittstelle = pSchnittstelle; Schnittstelle.test(); [/CODE] Was sollen diese beiden Zeilen denn bewirken? Bedenke, dass Schnittstelle ein Typ ist, keine Variable. Zitieren
maik() Geschrieben 25. Januar 2010 Autor Geschrieben 25. Januar 2010 darstellungsfehler meinerseits die zwei unteren Schnittstellen sind ne variable, der ich vorher mySchnittstelle übergeben habe. ich möchte nun über diese referenz eine methode des objekts (my)Schnittstelle aufrufen... er beklagt sich nur immer, rechts von .test(); müsste ne klasse/union/whatever stehen. Zitieren
Klotzkopp Geschrieben 25. Januar 2010 Geschrieben 25. Januar 2010 die zwei unteren Schnittstellen sind ne variable, der ich vorher mySchnittstelle übergeben habe. ich möchte nun über diese referenz eine methode des objekts (my)Schnittstelle aufrufen...Diese Variable kann nur ein Zeiger sein (also Schnittstelle*), sonst würde die Zuweisung nicht funktionieren. er beklagt sich nur immer, rechts von .test(); müsste ne klasse/union/whatever stehen.Bei Zeigern benutzt man den Pfeiloperator, nicht den Punktoperator. Zitieren
maik() Geschrieben 25. Januar 2010 Autor Geschrieben 25. Januar 2010 hab den fehler gefunden. musste noch in Tserial_event.cpp die "Schnittstelle.h" inkludieren und dann mit dem pfeiloperator arbeiten. jetzt läufts soweit, nun werd ich mich an die implementierung von nem timer machen. großes dankeschön meinerseits, hast mir wirklich geholfen! Zitieren
Empfohlene Beiträge
Dein Kommentar
Du kannst jetzt schreiben und Dich später registrieren. Wenn Du ein Konto hast, melde Dich jetzt an, um unter Deinem Benutzernamen zu schreiben.