36

Arduino でクラス オブジェクトを使用しようとしていますが、問題が発生し続けています。私がやりたいことは、クラスを宣言し、そのクラスのオブジェクトを作成することだけです。例は何でしょうか?

4

7 に答える 7

21

Arduino 1.0 では、これは問題なくコンパイルされます。

class A
{
  public:
   int x;
   virtual void f() { x=1; }
};

class B : public A
{
  public:
    int y;
    virtual void f() { x=2; }
};


A *a;
B *b;
const int TEST_PIN = 10;

void setup()
{
   a=new A(); 
   b=new B();
   pinMode(TEST_PIN,OUTPUT);
}

void loop()
{
   a->f();
   b->f();
   digitalWrite(TEST_PIN,(a->x == b->x) ? HIGH : LOW);
}
于 2012-10-06T15:14:15.540 に答える
14

Arduino プラットフォーム用のライブラリを作成する方法に関する優れたチュートリアルがあります。ライブラリは基本的にクラスなので、すべてがどのように行われるかを示す必要があります。

Arduino ではクラスを使用できますが、いくつかの制限があります。

  • 新規および削除キーワードなし
  • 例外なく
  • libstdc++ がないため、標準関数、テンプレート、またはクラスはありません

また、クラス用に新しいファイルを作成する必要があります。メイン スケッチでそれらを宣言することはできません。ライブラリを再コンパイルするときは、Arduino IDE を閉じる必要もあります。そのため、Arduino IDE として Eclipse を使用しています。

于 2009-11-16T16:04:11.540 に答える
6

http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230935955の状態:

デフォルトでは、Arduino IDE とライブラリは演算子 new と演算子 delete を使用しません。malloc() と free() をサポートしています。したがって、解決策は、new および delete 演算子を自分で実装して、これらの関数を使用することです。

コード:

#include <stdlib.h> // for malloc and free
void* operator new(size_t size) { return malloc(size); } 
void operator delete(void* ptr) { free(ptr); }

これにより、オブジェクトを作成できます。

C* c; // declare variable
c = new C(); // create instance of class C
c->M(); // call method M
delete(c); // free memory

よろしく、タンバーグ

于 2010-01-14T14:09:06.157 に答える
4

少し前にこのシンプルなものを作成しました。私が抱えていた主な課題は、優れたビルド環境を作成することでした。これは、GUIを使用せずにすべてをコンパイルおよびリンク/デプロイするmakefileです。コードの場合、ヘッダーは次のとおりです。

class AMLed
{
    private:
          uint8_t _ledPin;
          long _turnOffTime;

    public:
          AMLed(uint8_t pin);
          void setOn();
          void setOff();
          // Turn the led on for a given amount of time (relies
          // on a call to check() in the main loop()).
          void setOnForTime(int millis);
          void check();
};

そしてここに主な情報源があります

AMLed::AMLed(uint8_t ledPin) : _ledPin(ledPin), _turnOffTime(0)
{
    pinMode(_ledPin, OUTPUT);
}

void AMLed::setOn()
{
    digitalWrite(_ledPin, HIGH);
}

void AMLed::setOff()
{
    digitalWrite(_ledPin, LOW);
}

void AMLed::setOnForTime(int p_millis)
{
    _turnOffTime = millis() + p_millis;
    setOn();
}

void AMLed::check()
{
    if (_turnOffTime != 0 && (millis() > _turnOffTime))
    {
        _turnOffTime = 0;
        setOff();
    }
}

ここでよりきれいにフォーマットされています:http://amkimian.blogspot.com/2009/07/trivial-led-class.html

使用するには、.pdeファイルで次のようにします。

#include "AM_Led.h"

#define TIME_LED    12   // The port for the LED

AMLed test(TIME_LED);
于 2009-11-16T15:57:16.983 に答える
1

うまくいかなかった例を教えてください。ご存じのとおり、Wiring 言語は C/C++ に基づいていますが、すべての C++ がサポートされているわけではありません。

Wiring IDE でクラスを作成できるかどうかはわかりません (私の最初の Arduino は現在郵送中です)。C++ クラスを作成し、AVR-GCCを使用してコンパイルし、 AVRDUDEを使用して Arduino にロードした場合、それが機能することはわかっています。

于 2009-11-15T04:26:10.603 に答える
1

私のWebduino ライブラリはすべて、Arduino イーサネット シールドの上に Web サーバーを実装する C++ クラスに基づいています。すべての Arduino コードに #include できる .h ファイルでクラス全体を定義しました。コードを自由に見て、私がどのようにそれを行うかを確認してください... Arduino IDE でオブジェクトを個別にコンパイルする本当の理由がないため、すべてをインラインで定義することになりました。

于 2009-11-18T02:24:13.760 に答える
0

このページでは、Arduino スケッチは、セットアップ ループとメイン ループで呼び出されるいくつかの構造体 (およびいくつかのメソッド) を定義します。私のようなほとんど読み書きのできないプログラマーにとっても、解釈するのに十分単純です。

于 2009-12-07T03:43:08.777 に答える