Arduino IDEの別のタブでクラスを宣言できないのはなぜですか?


20

私はコードをArduino IDEの2番目のタブに移動して、整理しやすくしました。最初は、関数を移動しようとしただけで、うまくいくように見えました。setup()メインタブの関数から関数を呼び出すことができ、コンパイルまたはアップロードに問題はありませんでした。

しかし、クラス全体を2番目のタブに入れようとしましたが、突然機能しなくなりました。例えば:

タブ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のような代替手段を使用する必要がありますか?


これはコード全体ですか?ファイル名は何ですか?次のようなプリプロセッサディレクティブはありません#includeか?
asheeshr

はい、それがコード全体です。タブにはそれぞれ名前が付けられtab1ていtab2ます。名前はIDEを使用して設定されているため、基になるファイルは両方.inoです。
ピーターブルームフィールド

私は、Arduino IDEが行うジグリーポケリーを嫌い始めています。AVRを超える使いやすさで追加されたものは、このようなものを壊すことでなくなります。
サイバーギボン14年

回答:


13

Arduino IDE内から、ある.pdeファイルで宣言されたクラスを別の.pdeファイルで宣言して使用することはできません。

1つの回避策は、2番目のファイルをC ++ソースファイル(.cpp)に#include "<filename>"してから、最初のファイルの先頭にディレクティブを追加することです。


このコードは正しくコンパイルされます:

タブ1:

#include "test.cpp"

TestClass obj;

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

void loop()
{
    //...
}

test.cpp:

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

回避策をありがとう。基本的な例では機能しますが、残念ながら、.cppファイルにArduino固有の呼び出しを追加すると機能しません。たとえば、TestClass::init()を呼び出そうとするとpinMode()、コンパイラpinModeはこのスコープで宣言されていないことを訴えます。クラスのArduino関数にアクセスする方法はありますか?
ピーターブルームフィールド

6
@ PeterR.Bloomfield ファイル#include <Arduino.h>の先頭にa を追加し.cppます。
アヒーシュ14

1
ソースファイルを含めるように他の人に教えるのは良くないと思います(#include "test.cpp")。動作しますが、リンクプロセスの理解を妨げる可能性があります。ヘッダーファイルのみを含める必要があります。
火星

1
@Marsに同意します。より良い解決策は、クラス宣言を.hファイルに、定義(実装)を.cppファイルに入れることです。したがって、プロジェクトには2つの追加ファイルがあります。これは実際にクラスを処理する通常の方法です。
ニックギャモン

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/を理解するのが最も簡単です
write-your-own-arduino-library.html#

https://github.com/jamolnng/Arduino/tree/master/libraries/ShiftRegisterで作成したサンプルライブラリは、.cppファイルからArduino関数を呼び出しても問題がないことがわかります(私は知っていますが、ライブラリをテストしました)


3
別のライブラリを作成せずに、メインプロジェクトでファイルを作成.hして.cppファイルを作成することもできます。
マイクロテリオン14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.