Tại sao tôi không thể khai báo một lớp trong một tab khác trong Arduino IDE?


20

Tôi muốn chuyển một số mã của mình ra một tab thứ hai trong Arduino IDE, để giữ mọi thứ được tổ chức tốt hơn. Lúc đầu, tôi chỉ thử di chuyển một chức năng, và nó dường như hoạt động tốt. Tôi có thể gọi hàm từ setup()hàm trong tab chính của mình và không có vấn đề gì khi biên dịch hoặc tải lên.

Tuy nhiên, tôi đã thử đặt cả lớp vào tab thứ hai và đột nhiên nó không hoạt động nữa. Ví dụ:

Tab 1:

TestClass obj;

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

void loop()
{
    //...
}

Tab 2:

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

Khi tôi cố gắng biên dịch nó, nó đã cho tôi các lỗi sau:

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

Tại sao nó nhận ra một hàm trong một tab khác, nhưng không phải là một lớp? Có cách nào để làm cho nó hoạt động trong Arduino IDE hay tôi cần sử dụng một giải pháp thay thế như Eclipse?


Đây có phải là toàn bộ mã? Tên tập tin là gì? Không có chỉ thị tiền xử lý như thế #includenào?
asheeshr

Vâng, đó là toàn bộ mã. Các tab được đặt tên tab1tab2tương ứng. Các tên được đặt bằng IDE, vì vậy các tệp bên dưới là cả hai .ino.
Peter Bloomfield

Tôi bắt đầu ghét trò đùa tinh quái mà Arduino IDE làm. Những gì nó thêm vào dễ sử dụng so với AVR, nó sẽ lấy đi những thứ như thế này.
Cyberg Ribbon

Câu trả lời:


13

Không thể khai báo và sử dụng các lớp được khai báo trong một .pdetệp trong một .pdetệp khác từ bên trong Arduino IDE.

Một cách giải quyết khác là tạo tệp thứ hai thành tệp nguồn C ++ ( .cpp) và sau đó thêm một #include "<filename>"lệnh vào đầu tệp đầu tiên.


Mã này biên dịch chính xác:

Tab 1:

#include "test.cpp"

TestClass obj;

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

void loop()
{
    //...
}

test.cpp:

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

Cảm ơn cách giải quyết. Nó hoạt động cho ví dụ cơ bản, nhưng thật không may, nó không hoạt động nếu tôi thêm bất kỳ cuộc gọi cụ thể nào của Arduino vào tệp .cpp. Ví dụ: nếu TestClass::init()cố gắng gọi pinMode(), trình biên dịch phàn nàn rằng pinModekhông được khai báo trong phạm vi này. Có cách nào để truy cập các chức năng Arduino trong lớp của tôi không?
Peter Bloomfield

6
@ PeterR.Bloomfield Thêm một #include <Arduino.h>vào đầu .cpptập tin.
asheeshr

1
Tôi nghĩ rằng không tốt khi dạy người khác bao gồm các tệp nguồn ( #include "test.cpp"). Nó hoạt động, nhưng có thể hãm sự hiểu biết về quá trình liên kết. Chỉ bao gồm các tập tin tiêu đề.
Sao Hỏa

1
Tôi đồng ý với @Mars - một giải pháp tốt hơn là đặt khai báo lớp trong tệp .h và định nghĩa (triển khai) trong tệp .cpp. Vì vậy, bạn có hai tập tin bổ sung trong dự án. Đây thực sự là cách xử lý bình thường của các lớp.
Nick Gammon

6

Cách thức hoạt động của Arduino IDE là nó biên dịch mã của bạn (mã bạn viết trong IDE) thành mã "chính". Sau đó, nó lấy mã từ tất cả các thư viện bạn đã nhập và biên dịch cùng với mã chính. Để làm những gì bạn đang đề xuất sẽ yêu cầu bạn tạo một thư viện cho Arduino.

Dưới đây là một số thông tin về các thư viện Arduino:

http://arduino.cc/en/Guide/L Thư viện

Và đây là một số cách tạo thư viện:

http://arduino.cc/en/Hacking/L LibraryTutorial // đây là cách dễ hiểu nhất imo
http://playground.arduino.cc/Code/L Library
http://www.divilabs.com/2013/03/ write-your-own-arduino-library.html #

Dưới đây là một thư viện ví dụ tôi đã viết https://github.com/jamolnng/Arduino/tree/master/lologists/ShiftRegister như bạn có thể thấy không có vấn đề gì khi gọi các hàm Arduino từ tệp .cpp (Tôi biết, tôi đã đã kiểm tra thư viện)


3
Cũng có thể chỉ cần tạo .h.cppcác tệp trong dự án chính của bạn mà không cần phải tạo một thư viện riêng.
microtherion
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.