PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [ERLEDIGT] C++ Verweis aus einer C++ Datei auf Classen, Variablen in anderen C++Datei



arwar52
24.11.2020, 13:45
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);

+++++++++++++++++++++++++++++++++

Moppi
24.11.2020, 14:38
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

arwar52
24.11.2020, 19:36
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

Moppi
24.11.2020, 21:51
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.

arwar52
25.11.2020, 12:21
. . . 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);

Moppi
25.11.2020, 17:41
Was macht das "C" da ? Zumindest bei SoftwareSerial müsste das auch ohne "C" funktionieren.

mfG

arwar52
25.11.2020, 19:23
. . . 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);

Moppi
26.11.2020, 12:29
versuch mal so:

"extern SoftwareSerial port;"

anschließend:

"port.begin(baudrate);"

EasyVR kenne ich nicht.


MfG

arwar52
02.12.2020, 23:01
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