Чому я не можу оголосити клас на іншій вкладці в Arduino IDE?


20

Я хотів перемістити частину свого коду на другу вкладку в IDE Arduino, щоб все було краще організовано. Спочатку я лише спробував перемістити якусь функцію, і, здавалося, вона спрацювала нормально. Я міг викликати функцію з setup()функції на головній вкладці, і не було проблем зі складанням або завантаженням.

Однак я спробував поставити цілий клас на другу вкладку, і раптом це вже не спрацювало. Наприклад:

Вкладка 1:

TestClass obj;

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

void loop()
{
    //...
}

Вкладка 2:

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

Коли я спробував це скомпілювати, це дало мені такі помилки:

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

Чому він розпізнає функцію на іншій вкладці, а не клас? Чи є спосіб змусити це працювати в IDE Arduino або мені потрібно використовувати таку альтернативу, як Eclipse?


Це сукупність коду? Що таке назви файлів? Немає таких директив препроцесорів, як #include?
asheeshr

Так, це вся суть коду. Вкладки названі tab1і tab2відповідно. Імена були встановлені за допомогою IDE, тому базові файли є обома .ino.
Пітер Блумфілд

Я починаю ненавидіти джиггери покер, який робить ID Arduino. Що додає простоти у використанні в порівнянні з AVR, він забирає такі ламання.
Кібергібони

Відповіді:


13

Неможливо оголосити та використовувати класи, задекларовані в одному .pdeфайлі, в іншому .pdeфайлі з Ardeino IDE.

Одне вирішення - зробити другий файл у вихідному файлі C ++ ( .cpp), а потім додати #include "<filename>"директиву на початку першого файлу.


Цей код складено правильно:

Вкладка 1:

#include "test.cpp"

TestClass obj;

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

void loop()
{
    //...
}

test.cpp:

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

Дякую за вирішення Він працює для основного прикладу, але, на жаль, він не працює, якщо я додаю будь-які специфічні для Arduino дзвінки у файл .cpp. Наприклад, якщо TestClass::init()намагається зателефонувати pinMode(), компілятор скаржиться на те, що pinModeне було оголошено в цій області. Чи є спосіб отримати доступ до функцій Arduino в моєму класі?
Пітер Блумфілд

6
@ PeterR.Bloomfield Додати #include <Arduino.h>вгору .cppфайлу.
asheeshr

1
Я думаю, що це не добре навчати інших включати вихідні файли ( #include "test.cpp"). Це працює, але може гальмувати розуміння процесу зв’язування. Потрібно включати лише файли заголовків.
Марс

1
Я погоджуюся з @Mars - кращим рішенням є розміщення декларації класу у файлі .h, а визначення (реалізація) - у файлі .cpp. Отже, у вас є два додаткові файли в проекті. Це фактично звичайний спосіб поводження з класами.
Нік Гаммон

6

Те, як працює ID Arduino, полягає в тому, що він компілює ваш код (код, який ви пишете в IDE) як "основний" код. Потім він витягує код з усіх імпортованих бібліотек і компілює його разом з основним кодом. Щоб зробити те, що ви пропонуєте, знадобиться створити бібліотеку для Arduino.

Ось додаткова інформація про бібліотеки Arduino:

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

Ось декілька про те, як створити бібліотеку:

http://arduino.cc/en/Hacking/LibraryTutorial // цей найпростіший для розуміння imo
http://playground.arduino.cc/Code/Library
http://www.divilabs.com/2013/03/ write-your-own-arduino-library.html #

Ось приклад бібліотеки, яку я написав https://github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegister, як ви бачите, що немає проблем з викликом функцій Arduino з файлу .cpp (я знаю, я маю протестували бібліотеку)


3
Також можна просто створити .hта .cppфайли у вашому головному проекті, не створюючи окремої бібліотеки.
мікротерйон
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.