मैं 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 में काम करने का एक तरीका है, या क्या मुझे ग्रहण जैसे विकल्प का उपयोग करने की आवश्यकता है?


क्या यह कोड की संपूर्णता है? फ़ाइल नाम क्या हैं? क्या कोई प्रीप्रोसेसर निर्देश जैसे नहीं हैं #include?
अशेष

हां, यह कोड की संपूर्णता है। टैब नाम tab1और tab2क्रमशः हैं। नाम आईडीई का उपयोग करके सेट किए गए थे, इसलिए अंतर्निहित फाइलें दोनों हैं .ino
पीटर ब्लूमफील्ड

मैं Arduino IDE करता है गुड़ की पकौड़ी से नफरत करने लगा हूं। एवीआर के उपयोग में आसानी के साथ यह इस तरह की चीजों को तोड़ने में दूर ले जाता है।
साइबरबर्गन

जवाबों:


13

Arduino IDE के भीतर से .pdeकिसी अन्य .pdeफ़ाइल में एक फ़ाइल में घोषित वर्गों की घोषणा करना और उनका उपयोग करना संभव नहीं है ।

एक वर्कअराउंड दूसरी फ़ाइल को C ++ स्रोत फ़ाइल ( .cpp) में बनाना है और फिर #include "<filename>"पहली फ़ाइल की शुरुआत में एक निर्देश जोड़ना है ।


यह कोड सही तरीके से संकलित है:

टैब 1:

#include "test.cpp"

TestClass obj;

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

void loop()
{
    //...
}

टेस्ट .pp:

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

वर्कअराउंड के लिए धन्यवाद। यह मूल उदाहरण के लिए काम करता है, लेकिन दुर्भाग्य से यह काम नहीं करता है अगर मैं .cpp फ़ाइल में किसी भी Arduino- विशिष्ट कॉल को जोड़ता हूं। उदाहरण के लिए, यदि TestClass::init()कॉल करने का प्रयास किया जाता है pinMode(), तो कंपाइलर शिकायत करता है कि pinModeइस दायरे में घोषित नहीं किया गया था। क्या मेरी कक्षा में Arduino फ़ंक्शन को एक्सेस करने का एक तरीका है?
पीटर ब्लूमफील्ड

6
@ PeterR.Bloomfield फ़ाइल #include <Arduino.h>के शीर्ष पर एक जोड़ें .cpp
एशेश्र

1
मुझे लगता है कि स्रोत फ़ाइलों को शामिल करने के लिए दूसरों को सिखाना अच्छा नहीं है ( #include "test.cpp")। यह काम करता है, लेकिन लिंकिंग प्रक्रिया की समझ को तोड़ सकता है। केवल हेडर फ़ाइलों को शामिल किया जाना चाहिए।
मंगल

1
मैं @मार्स से सहमत हूं - एक बेहतर समाधान है कि .hpp फाइल में क्लास डिक्लेरेशन को .h फाइल में और डेफिनिशन (इंप्लीमेंटेशन) में डालें। इसलिए आपके पास प्रोजेक्ट में दो अतिरिक्त फाइलें हैं। यह वास्तव में कक्षाओं को संभालने का सामान्य तरीका है।
निक गैमन

6

जिस तरह से Arduino IDE काम करता है वह आपके कोड (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/ लिखने-अपने-खुद-arduino-library.html #

यहाँ एक उदाहरण पुस्तकालय है जो मैंने लिखा है https://github.com/jamolnng/Arduino/tree/master/lbooks/ShiftRegister जैसा कि आप देख सकते हैं। .cpp फ़ाइल से Arduino फ़ंक्शन को कॉल करने में कोई समस्या नहीं है (मुझे पता है, मुझे पता है। पुस्तकालय का परीक्षण किया)


3
एक अलग लाइब्रेरी बनाने के बिना, अपने मुख्य प्रोजेक्ट में बस बनाना .hऔर .cppफाइल करना भी संभव है ।
माइक्रोथियॉन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.