-         
Ergebnis 1 bis 9 von 9

Thema: C++ Verweis aus einer C++ Datei auf Classen, Variablen in anderen C++Datei

  1. #1
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33

    C++ Verweis aus einer C++ Datei auf Classen, Variablen in anderen C++Datei

    Anzeige

    Praxistest und DIY Projekte
    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);

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

  2. #2
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    2.387
    Blog-Einträge
    25
    Hallo,

    in C++ gibt es auch "extern": https://riptutorial.com/de/cplusplus...e/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

  3. #3
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    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
    Geändert von arwar52 (24.11.2020 um 20:41 Uhr)

  4. #4
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    2.387
    Blog-Einträge
    25
    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.


  5. #5
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    . . . 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);

  6. #6
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    2.387
    Blog-Einträge
    25
    Was macht das "C" da ? Zumindest bei SoftwareSerial müsste das auch ohne "C" funktionieren.

    mfG

  7. #7
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    . . . 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);

  8. #8
    Erfahrener Benutzer Robotik Einstein Avatar von Moppi
    Registriert seit
    18.03.2018
    Beiträge
    2.387
    Blog-Einträge
    25
    versuch mal so:

    "extern SoftwareSerial port;"

    anschließend:

    "port.begin(baudrate);"

    EasyVR kenne ich nicht.


    MfG

  9. #9
    Benutzer Stammmitglied
    Registriert seit
    05.10.2018
    Beiträge
    33
    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
    Geändert von arwar52 (04.12.2020 um 16:20 Uhr)

Ähnliche Themen

  1. AVR DOS, Uhrzeit nach überschreiben einer Datei.
    Von tomdul im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 0
    Letzter Beitrag: 01.09.2015, 17:31
  2. Hex.Datei für Steuerung einer Mischanlage
    Von Flitzek im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 10
    Letzter Beitrag: 08.03.2013, 16:36
  3. Zwei Word Variablen in einer anderen verpacken Schieberegist
    Von Fabi1234 im Forum Basic-Programmierung (Bascom-Compiler)
    Antworten: 17
    Letzter Beitrag: 11.12.2007, 17:44
  4. Erzeugen einer .Hex-Datei aus mehreren C-Quelltexten !!
    Von casa74 im Forum C - Programmierung (GCC u.a.)
    Antworten: 6
    Letzter Beitrag: 13.06.2005, 21:33
  5. [ERLEDIGT] C Datei in Bin oder Hex Datei umwandeln
    Von MSSauerxxx im Forum Microcontroller allgemeine Fragen/Andere Microcontroller
    Antworten: 3
    Letzter Beitrag: 08.05.2005, 16:31

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •