เหตุใดฉันจึงไม่สามารถประกาศคลาสในแท็บอื่นใน Arduino IDE ได้


20

ฉันต้องการย้ายโค้ดของฉันออกเป็นแท็บที่สองใน Arduino IDE เพื่อให้การจัดระเบียบดีขึ้น ตอนแรกฉันแค่ลองขยับฟังก์ชั่นเท่านั้นและมันก็ใช้ได้ดี ฉันสามารถเรียกใช้ฟังก์ชั่นจาก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

ทำไมมันถึงรู้จักฟังก์ชั่นในแท็บอื่น แต่ไม่ใช่คลาส? มีวิธีที่จะทำให้มันใช้งานได้ใน Arduino IDE หรือไม่หรือฉันต้องใช้ตัวเลือกอื่นเช่น Eclipse?


นี่คือรหัสทั้งหมดหรือไม่ ชื่อไฟล์คืออะไร? ไม่มีคำสั่ง preprocessor เป็น#includeอย่างไร
asheeshr

ใช่นั่นคือรหัสทั้งหมด แท็บมีชื่อtab1และtab2ตามลำดับ ชื่อที่ถูกตั้งค่าการใช้ IDE .inoดังนั้นไฟล์ต้นแบบมีทั้ง
Peter Bloomfield

ฉันเริ่มเกลียด pokery jiggery ที่ Arduino IDE ทำ สิ่งที่เพิ่มความสะดวกในการใช้งานกับ AVR จะทำลายสิ่งต่างๆเช่นนี้
Cybergibbons

คำตอบ:


13

ไม่สามารถประกาศและใช้คลาสที่ประกาศใน.pdeไฟล์หนึ่งใน.pdeไฟล์อื่นจากภายใน Arduino 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 ในชั้นเรียนของฉันหรือไม่?
Peter Bloomfield

6
@ PeterR.Bloomfield เพิ่ม a #include <Arduino.h>ไปด้านบนสุดของ.cppไฟล์
asheeshr

1
ฉันคิดว่ามันไม่ดีที่จะสอนคนอื่นให้รวมไฟล์ต้นฉบับ ( #include "test.cpp") มันใช้งานได้ แต่อาจทำลายความเข้าใจของกระบวนการเชื่อมโยง ควรรวมเฉพาะไฟล์ส่วนหัว
ดาวอังคาร

1
ฉันเห็นด้วยกับ @Mars - ทางออกที่ดีกว่าคือการประกาศคลาสในไฟล์. h และนิยาม (การนำไปใช้) ในไฟล์. cpp ดังนั้นคุณมีสองไฟล์เพิ่มเติมในโครงการ นี่เป็นวิธีปกติในการจัดการคลาส
Nick Gammon

6

วิธีการทำงานของ Arduino IDE คือมันรวบรวมรหัสของคุณ (รหัสที่คุณเขียนใน IDE) เป็นรหัส "หลัก" จากนั้นจะดึงรหัสจากไลบรารีทั้งหมดที่คุณนำเข้าและคอมไพล์พร้อมกับรหัสหลัก หากต้องการทำสิ่งที่คุณแนะนำคุณจะต้องสร้างห้องสมุดสำหรับ Arduino

นี่คือข้อมูลเพิ่มเติมเกี่ยวกับไลบรารี Arduino:

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

และนี่คือวิธีสร้างห้องสมุด:

http://arduino.cc/th/Hacking/LibraryTutorial // อันนี้ง่ายที่สุดในการเข้าใจ imo
http://playground.arduino.cc/Code/Library
http://www.divilabs.com/2013/03/ การเขียนของคุณเอง Arduino-library.html #

นี่คือตัวอย่างห้องสมุดที่ฉันเขียนhttps://github.com/jamolnng/Arduino/tree/master/lไลบรารี/ShiftRegisterตามที่คุณเห็นว่าไม่มีปัญหากับการเรียกฟังก์ชั่น Arduino จากไฟล์. cpp (ฉันรู้ว่าฉันเป็นฉัน ทดสอบห้องสมุด)


3
นอกจากนี้ยังเป็นไปได้ที่จะสร้าง.hและ.cppไฟล์ในโครงการหลักของคุณโดยไม่ต้องสร้างห้องสมุดแยกต่างหาก
microtherion
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.