Mengapa saya tidak dapat mendeklarasikan kelas di tab lain di Arduino IDE?

20

Saya ingin memindahkan beberapa kode saya ke tab kedua di Arduino IDE, agar semuanya lebih teratur. Pada awalnya, saya hanya mencoba memindahkan fungsi, dan sepertinya berfungsi dengan baik. Saya dapat memanggil fungsi dari setup()fungsi di tab utama saya, dan tidak ada masalah saat mengompilasi atau mengunggah.

Namun, saya mencoba menempatkan seluruh kelas ke tab kedua, dan tiba-tiba itu tidak berfungsi lagi. Sebagai contoh:

Tab 1:

TestClass obj;

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

void loop()
{
    //...
}

Tab 2:

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

Ketika saya mencoba untuk mengkompilasi ini, itu memberi saya kesalahan berikut:

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

Mengapa ia mengenali fungsi di tab lain, tetapi bukan kelas? Apakah ada cara untuk membuatnya bekerja di Arduino IDE, atau apakah saya perlu menggunakan alternatif seperti Eclipse?

Peter Bloomfield
sumber
Apakah ini keseluruhan kode? Apa nama filenya? Apakah tidak ada arahan preprosesor seperti #include?
asheeshr
Ya, itulah keseluruhan kodenya. Tab diberi nama tab1dan tab2masing - masing. Nama-nama itu diatur menggunakan IDE, sehingga file yang mendasarinya sama-sama .ino.
Peter Bloomfield
Saya mulai membenci jiggery pokery yang dilakukan Arduino IDE. Apa yang ditambahkannya dalam kemudahan penggunaan dibandingkan AVR, menghilangkan hal-hal seperti ini.
Cybergibbons

Jawaban:

13

Tidak mungkin untuk mendeklarasikan dan menggunakan kelas yang dideklarasikan dalam satu .pdefile di .pdefile lain dari dalam Arduino IDE.

Salah satu solusinya adalah membuat file kedua menjadi file sumber C ++ ( .cpp) dan kemudian menambahkan #include "<filename>"arahan di awal file pertama.


Kode ini dikompilasi dengan benar:

Tab 1:

#include "test.cpp"

TestClass obj;

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

void loop()
{
    //...
}

test.cpp:

class TestClass
{
public:
    void init()
    {
        //...
    }
};
asheeshr
sumber
Terima kasih atas solusinya. Ini berfungsi untuk contoh dasar, tetapi sayangnya tidak berfungsi jika saya menambahkan panggilan khusus Arduino dalam file .cpp. Misalnya, jika TestClass::init()mencoba menelepon pinMode(), kompiler mengeluh yang pinModetidak dideklarasikan dalam lingkup ini. Apakah ada cara untuk mengakses fungsi Arduino di kelas saya?
Peter Bloomfield
6
@ PeterR.Bloomfield Tambahkan #include <Arduino.h>ke bagian atas .cppfile.
asheeshr
1
Saya pikir itu tidak baik untuk mengajar orang lain untuk memasukkan file sumber ( #include "test.cpp"). Ini bekerja, tetapi mungkin rem pemahaman proses menghubungkan. Hanya file header yang harus dimasukkan.
Mars
1
Saya setuju dengan @Mars - solusi yang lebih baik adalah dengan meletakkan deklarasi kelas dalam file .h, dan definisi (implementasi) dalam file .cpp. Jadi, Anda memiliki dua file tambahan dalam proyek ini. Ini sebenarnya cara normal dalam menangani kelas.
Nick Gammon
6

Cara kerja Arduino IDE adalah mengkompilasi kode Anda (kode yang Anda tulis dalam IDE) sebagai kode "utama". Kemudian ia menarik kode dari semua perpustakaan yang telah Anda impor dan mengkompilasinya bersama dengan kode utama. Untuk melakukan apa yang Anda sarankan akan mengharuskan Anda membuat perpustakaan untuk Arduino.

Berikut ini beberapa informasi lebih lanjut tentang perpustakaan Arduino:

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

Dan berikut ini beberapa cara membuat perpustakaan:

http://arduino.cc/en/Hacking/LibraryTutorial // yang ini adalah yang termudah untuk dipahami imo
http://playground.arduino.cc/Code/Library
http://www.divilabs.com/2013/03/ write-your-own-arduino-library.html #

Berikut adalah contoh perpustakaan yang saya tulis https://github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister seperti yang Anda lihat tidak ada masalah dengan memanggil fungsi Arduino dari file .cpp (saya tahu, saya sudah menguji perpustakaan)

Jesse Laning
sumber
3
Dimungkinkan juga untuk hanya membuat .hdan .cppfile di proyek utama Anda, tanpa harus membuat perpustakaan terpisah.
microtherion