Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] C++ Verweis aus einer C++ Datei auf Classen, Variablen in anderen C++Datei
Hallo kollegen.
Will ein Arduno Sketch in Eclipse in einzelne Funktionen in separaten .cpp Dateien unterteilen.
Aus Funktionen (= separate .cpp Dateien) wird auf globale Valiablen, Classen zugegrifen die der Datei1 deklariert sind.
In .c kriegt man das mit „extern“ in Griff.
Wie geht das in .cpp???
Mein Versuch siet so aus
++++++++++++++++++++++++++++++++
Datei1 - deklaration:
// Shield Jumper on SW (using pins 12/13 or 8/9 as RX/TX)
SoftwareSerial port(12, 13);
EasyVR easyvr(port);
Datei2 - Verweis auf die Classen in Datei1:
extern "C" SoftwareSerial port(12, 13);
extern "C" EasyVR easyvr(port);
+++++++++++++++++++++++++++++++++
Hallo,
in C++ gibt es auch "extern": https://riptutorial.com/de/cplusplus/example/28730/extern
Für mehr mal gogglen im Netz?
In .c kriegt man das mit „extern“ in Griff.
Ich weiß nicht, inwiefern Arduino-C++ sich wie echtes C++ verhält. Habe da keine Ahnung, aber ich verwende da auch "extern" für Variablen (auch in CPP-Dateien) und anderes.
Extern kann man auch auf Klassen anwenden. Bin aber eher C/C++ - Laie. Für den Grad "Guru" beschäftige ich mich zu wenig und noch nicht lang genug damit. ;)
MfG
Sorry wenn meine Aussagen falsch sind - bin kein C++ Programmierer.
SoftwareSerial und EasyVR sind Classen - hab gerade in den Header Dateien gecheckt.
Die werden im gleichen Zug deklariert und definiet.
Datei1:
SoftwareSerial port(12, 13);
EasyVR easyvr(port);
++++++++++++++++++++++++++++++++
Datei2:
extern "C" SoftwareSerial port(12, 13);
extern "C" EasyVR easyvr(port);
Syntaktisch scheint alles OK zu sein - Eclipse meldet keinen Fehler.
Nur der Compiler meint es handelt sich um eine Doppeldefinition.
Wie gehe ich das Problemm um???
project/setup.cpp.o (symbol from plugin): In function `port':
(.text+0x0): multiple definition of `port'
project/SprachSteuerung01.cpp.o (symbol from plugin):(.text+0x0): first defined here
project/setup.cpp.o (symbol from plugin): In function `port':
(.text+0x0): multiple definition of `irsend'
project/SprachSteuerung01.cpp.o (symbol from plugin):(.text+0x0): first defined here
project/setup.cpp.o (symbol from plugin): In function `port':
(.text+0x0): multiple definition of `rcSwitch'
project/SprachSteuerung01.cpp.o (symbol from plugin):(.text+0x0): first defined here
project/setup.cpp.o (symbol from plugin): In function `port':
(.text+0x0): multiple definition of `easyvr'
project/SprachSteuerung01.cpp.o (symbol from plugin):(.text+0x0): first defined here
collect2.exe: error: ld returned 1 exit status
Es gibt zwei Dateien: project/setup.cpp.o und SprachSteuerung01.cpp.o
port, irsend, rcSwitch und easyvr sind dort aus irgend einem Grund doppelt definiert.
. . . genau das ist mein Problemm.
Die Classen (port, irsend, rcSwitch und easyvr) sollen in Datei1 definiert werden und
in Datei2 soll darauf verwiesen werden.
Wie in C : man definiert eine globale Variable in Datei1
in Datei2 verweist man mit "extern" auf diese Variable
und schon kann man diese Variable in Datei2 nutzen.
++++++++++++++++++++++++++++++++++++++++++++
Noch mal hier wie es in der Dateien aussiet:
Datei1
IRsend irsend;
RCSwitch rcSwitch = RCSwitch();
SoftwareSerial port(12, 13);
EasyVR easyvr(port);
Datei2
extern IRsend irsend;
extern RCSwitch rcSwitch;
extern "C" SoftwareSerial port();
extern "C" EasyVR easyvr(port);
Die 2 ersten Einträge für "irsend" und "rcSwitch" scheinen OK zu sein.
und dann
ERROR
../../Datei2.cpp:21:30: error: no matching function for call to 'EasyVR::EasyVR(SoftwareSerial (&)())'
extern "C" EasyVR easyvr(port);
Was macht das "C" da ? Zumindest bei SoftwareSerial müsste das auch ohne "C" funktionieren.
mfG
. . . kann sein - hab alles mögliche ausprobiert.
Es geht nur um diese 2 Einträge in Datei2
1. extern SoftwareSerial port();
2. extern "C" EasyVR easyvr(port);
Der 2. Eintrag ist mit dem Syntax Fehler markiert:
<< Invalid arguments ' Candidates are: EasyVR(const EasyVR &) EasyVR(Stream &) >>
Kann leider nichts damit anfangen :-(
Der Compiler beklagt sind auch über "SoftwareSerial port();":
error: request for member 'begin' in 'port', which is of non-class type 'SoftwareSerial()'
port.begin(9600);
versuch mal so:
"extern SoftwareSerial port;"
anschließend:
"port.begin(baudrate);"
EasyVR kenne ich nicht.
MfG
Wie schon erwähnt programmiere ich nur notgezwungen in C++.
Daher sind meine Aussagen unten nicht unbedingt korrekt, haben aber funktioniert.
Datei1:
IRsend irsend;
- „IRsend“ ist eine Classe von der wird eine neue Classe „irsend“ erzeugt
RCSwitch rcSwitch = RCSwitch();
- Das gleiche wie oben, nur der neuen Clasee wirg gleich ein Wert zugewiesen
In diesem Fall wert einer Funktion RCSwitch();
Geanu wie int A = 5;
SoftwareSerial port(12, 13);
- Hier bin ich mir nicht sicher, kann sein dass die neue Classe „port“ von Classe „SeftwareSerial“ unbedingt Parameter braucht
EasyVR easyvr(port);
- Wie gerade beschrieben
#define pcSerial SERIAL_PORT_MONITOR
- Anweisung an den Preprozessor das Wort „pcSerial“ durch „SERIAL_PORT_MONITOR“ zu ersetzen (SERIAL_PORT_MONITOR ist auch eine Classe)
Datei2;
extern IRsend irsend;
extern RCSwitch rcSwitch;
extern SoftwareSerial port;
extern EasyVR easyvr;
- "Übergabe" der Classen an die Datei2 mit „extern"
#define pcSerial SERIAL_PORT_MONITOR
- Preprozessor Anweisung wird in Datei2 wiederholt
Powered by vBulletin® Version 4.2.5 Copyright ©2024 Adduco Digital e.K. und vBulletin Solutions, Inc. Alle Rechte vorbehalten.