Arduino でクラス オブジェクトを使用しようとしていますが、問題が発生し続けています。私がやりたいことは、クラスを宣言し、そのクラスのオブジェクトを作成することだけです。例は何でしょうか?
7 に答える
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);
}
Arduino プラットフォーム用のライブラリを作成する方法に関する優れたチュートリアルがあります。ライブラリは基本的にクラスなので、すべてがどのように行われるかを示す必要があります。
Arduino ではクラスを使用できますが、いくつかの制限があります。
- 新規および削除キーワードなし
- 例外なく
- libstdc++ がないため、標準関数、テンプレート、またはクラスはありません
また、クラス用に新しいファイルを作成する必要があります。メイン スケッチでそれらを宣言することはできません。ライブラリを再コンパイルするときは、Arduino IDE を閉じる必要もあります。そのため、Arduino IDE として Eclipse を使用しています。
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
よろしく、タンバーグ
少し前にこのシンプルなものを作成しました。私が抱えていた主な課題は、優れたビルド環境を作成することでした。これは、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);
うまくいかなかった例を教えてください。ご存じのとおり、Wiring 言語は C/C++ に基づいていますが、すべての C++ がサポートされているわけではありません。
Wiring IDE でクラスを作成できるかどうかはわかりません (私の最初の Arduino は現在郵送中です)。C++ クラスを作成し、AVR-GCCを使用してコンパイルし、 AVRDUDEを使用して Arduino にロードした場合、それが機能することはわかっています。
私のWebduino ライブラリはすべて、Arduino イーサネット シールドの上に Web サーバーを実装する C++ クラスに基づいています。すべての Arduino コードに #include できる .h ファイルでクラス全体を定義しました。コードを自由に見て、私がどのようにそれを行うかを確認してください... Arduino IDE でオブジェクトを個別にコンパイルする本当の理由がないため、すべてをインラインで定義することになりました。
このページでは、Arduino スケッチは、セットアップ ループとメイン ループで呼び出されるいくつかの構造体 (およびいくつかのメソッド) を定義します。私のようなほとんど読み書きのできないプログラマーにとっても、解釈するのに十分単純です。