Warum kann ich eine Klasse in einer anderen Registerkarte in Arduino IDE nicht deklarieren?

20

Ich wollte einen Teil meines Codes in eine zweite Registerkarte in der Arduino IDE verschieben, um die Dinge besser zu organisieren. Zuerst habe ich nur versucht, eine Funktion zu verschieben, und es schien gut zu funktionieren. Ich konnte die Funktion über die setup()Funktion in meiner Hauptregisterkarte aufrufen , und es gab keine Probleme beim Kompilieren oder Hochladen.

Ich habe jedoch versucht, eine ganze Klasse in die zweite Registerkarte zu stellen, und plötzlich hat es nicht mehr funktioniert. Beispielsweise:

Tab 1:

TestClass obj;

void setup()
{
    obj.init();
}

void loop()
{
    //...
}

Tab 2:

class TestClass
{
public:
    void init()
    {
        //...
    }
};

Als ich versuchte, dies zu kompilieren, ergaben sich folgende Fehler:

tab1:1: error: 'TestClass' does not name a type
tab1.ino: In function 'void setup()':
tab1:5: error: 'obj' was not declared in this scope

Warum erkennt es eine Funktion in einer anderen Registerkarte, aber keine Klasse? Gibt es eine Möglichkeit, es in der Arduino IDE zum Laufen zu bringen, oder muss ich eine Alternative wie Eclipse verwenden?

Peter Bloomfield
quelle
Ist das die Gesamtheit des Codes? Wie heißen die Dateien? Gibt es keine Präprozessor-Direktiven wie #include?
Asheeshr
Ja, das ist die Gesamtheit des Codes. Die Tabs sind benannt tab1und tab2jeweils. Die Namen wurden mithilfe der IDE festgelegt, sodass die zugrunde liegenden Dateien beide sind .ino.
Peter Bloomfield
Ich fange an, die witzige Spielerei zu hassen, die die Arduino-IDE macht. Was es im Vergleich zu AVR an Benutzerfreundlichkeit hinzufügt, bedeutet, dass es solche Dinge zerstört.
Cybergibbons

Antworten:

13

Es ist nicht möglich, Klassen, die in einer .pdeDatei deklariert wurden, in einer anderen .pdeDatei in der Arduino IDE zu deklarieren und zu verwenden .

Eine Problemumgehung besteht darin, die zweite Datei in eine C ++ - Quelldatei ( .cpp) umzuwandeln und dann #include "<filename>"am Anfang der ersten Datei eine Direktive hinzuzufügen .


Dieser Code wird korrekt kompiliert:

Tab 1:

#include "test.cpp"

TestClass obj;

void setup()
{
    obj.init();
}

void loop()
{
    //...
}

test.cpp:

class TestClass
{
public:
    void init()
    {
        //...
    }
};
Ascheshr
quelle
Vielen Dank für die Problemumgehung. Es funktioniert für das grundlegende Beispiel, aber leider funktioniert es nicht, wenn ich der CPP-Datei Arduino-spezifische Aufrufe hinzufüge. Wenn beispielsweise TestClass::init()versucht wird, aufzurufen pinMode(), beschwert sich der Compiler, der pinModein diesem Bereich nicht deklariert wurde. Gibt es eine Möglichkeit, auf die Arduino-Funktionen in meiner Klasse zuzugreifen?
Peter Bloomfield
6
@ PeterR.Bloomfield Fügen Sie ein #include <Arduino.h>am Anfang der .cppDatei hinzu.
Asheeshr
1
Ich denke, es ist nicht gut, anderen beizubringen, Quelldateien einzuschließen ( #include "test.cpp"). Es funktioniert, kann aber das Verständnis des Verknüpfungsprozesses beeinträchtigen. Es sollten nur Header-Dateien enthalten sein.
Mars
1
Ich stimme @Mars zu - eine bessere Lösung besteht darin, die Klassendeklaration in eine .h-Datei und die Definition (Implementierung) in eine .cpp-Datei zu schreiben. Sie haben also zwei zusätzliche Dateien im Projekt. Dies ist eigentlich die normale Art, mit Klassen umzugehen.
Nick Gammon
6

Die Arbeitsweise der Arduino IDE besteht darin, dass sie Ihren Code (den Code, den Sie in die IDE schreiben) als "Hauptcode" kompiliert. Anschließend wird Code aus allen von Ihnen importierten Bibliotheken abgerufen und zusammen mit dem Hauptcode kompiliert. Um das zu tun, was Sie vorschlagen, müssen Sie eine Bibliothek für Arduino erstellen.

Hier finden Sie weitere Informationen zu Arduino-Bibliotheken:

http://arduino.cc/en/Guide/Libraries

Und hier einige Hinweise zum Erstellen einer Bibliothek:

http://arduino.cc/de/Hacking/LibraryTutorial // dieses ist das am einfachsten zu verstehende imo
http://playground.arduino.cc/Code/Library
http://www.divilabs.com/2013/03/ schreibe deine eigene Arduino-Bibliothek.html #

Hier ist eine Beispielbibliothek, die ich geschrieben habe: https://github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister Wie Sie sehen, gibt es kein Problem beim Aufrufen von Arduino-Funktionen aus der .cpp-Datei (ich weiß, ich habe Bibliothek getestet)

Jesse Laning
quelle
3
Es ist auch möglich, einfach zu erstellen .hund .cppDateien in Ihrem Hauptprojekt, ohne dass eine separate Bibliothek erstellen zu müssen.
Microtherion