Perché non posso dichiarare una classe in un'altra scheda nell'IDE di Arduino?


20

Volevo spostare parte del mio codice in una seconda scheda nell'IDE di Arduino, per organizzare meglio le cose. All'inizio, ho solo provato a spostare una funzione e sembrava funzionare bene. Potrei chiamare la funzione dalla setup()funzione nella mia scheda principale e non ci sono stati problemi durante la compilazione o il caricamento.

Tuttavia, ho provato a inserire un'intera classe nella seconda scheda e improvvisamente non ha funzionato più. Per esempio:

Scheda 1:

TestClass obj;

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

void loop()
{
    //...
}

Scheda 2:

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

Quando ho provato a compilare questo, mi ha dato i seguenti errori:

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

Perché riconosce una funzione in un'altra scheda, ma non una classe? C'è un modo per farlo funzionare nell'IDE di Arduino o devo usare un'alternativa come Eclipse?


È tutto questo il codice? Quali sono i nomi dei file? Non ci sono direttive per il preprocessore come #include?
asheeshr,

Sì, questo è l'intero codice. Le schede sono denominate tab1e tab2rispettivamente. I nomi sono stati impostati utilizzando l'IDE, quindi i file sottostanti sono entrambi .ino.
Peter Bloomfield,

Sto cominciando a odiare la pazza risata che l'IDE di Arduino fa. Ciò che aggiunge nella facilità d'uso su AVR lo toglie nel rompere cose come questa.
Cybergibbons

Risposte:


13

Non è possibile dichiarare e utilizzare le classi dichiarate in un .pdefile in un altro .pdefile dall'IDE di Arduino.

Una soluzione alternativa consiste nel trasformare il secondo file in un file sorgente C ++ ( .cpp) e quindi aggiungere una #include "<filename>"direttiva all'inizio del primo file.


Questo codice viene compilato correttamente:

Scheda 1:

#include "test.cpp"

TestClass obj;

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

void loop()
{
    //...
}

test.cpp:

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

Grazie per la soluzione alternativa. Funziona per l'esempio di base, ma sfortunatamente non funziona se aggiungo chiamate specifiche per Arduino nel file .cpp. Ad esempio, se TestClass::init()tenta di chiamare pinMode(), il compilatore si lamenta che pinModenon è stato dichiarato in questo ambito. C'è un modo per accedere alle funzioni di Arduino nella mia classe?
Peter Bloomfield,

6
@ PeterR.Bloomfield Aggiungi a #include <Arduino.h>nella parte superiore del .cppfile.
asheeshr,

1
Penso che non sia buono insegnare agli altri a includere i file sorgente ( #include "test.cpp"). Funziona, ma può frenare la comprensione del processo di collegamento. Dovrebbero essere inclusi solo i file di intestazione.
Marte,

1
Sono d'accordo con @Mars - una soluzione migliore è quella di inserire la dichiarazione di classe in un file .h e la definizione (implementazione) in un file .cpp. Quindi hai due file extra nel progetto. Questo è in realtà il modo normale di gestire le classi.
Nick Gammon

6

Il modo in cui l'IDE di Arduino funziona è che compila il tuo codice (il codice che scrivi nell'IDE) come codice "principale". Quindi estrae il codice da tutte le librerie che hai importato e lo compila insieme al codice principale. Per fare ciò che stai suggerendo, è necessario creare una libreria per Arduino.

Ecco alcune ulteriori informazioni sulle librerie di Arduino:

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

Ed eccone alcuni su come creare una libreria:

http://arduino.cc/en/Hacking/LibraryTutorial // questo è il più facile da capire imo
http://playground.arduino.cc/Code/Library
http://www.divilabs.com/2013/03/ write-your-own-arduino-library.html #

Ecco una libreria di esempio che ho scritto https://github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister come puoi vedere non c'è nessun problema con la chiamata delle funzioni di Arduino dal file .cpp (lo so, ho testato la libreria)


3
È anche possibile creare .he .cppfile nel progetto principale, senza dover creare una libreria separata.
microtherion
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.