Arduinoでクラスオブジェクトを使用しようとしていますが、引き続き問題が発生します。私がやりたいのは、クラスを宣言し、そのクラスのオブジェクトを作成することです。例は何でしょうか?
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ではクラスを使用できますが、いくつかの制限があります。
また、クラス用に新しいファイルを作成する必要があります。メインスケッチでそれらを宣言することはできません。また、ライブラリを再コンパイルするときにArduino IDEを閉じる必要があります。そのため、EclipseをArduino IDEとして使用します。
http://www.arduino.cc/cgi-bin/yabb2/YaBB.pl?num=1230935955 状態:
デフォルトでは、Arduino IDEおよびライブラリは演算子newおよびoperator 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を使用せずにすべてをコンパイルおよびリンク/デプロイするメイクファイルです。コードの場合、ヘッダーは次のとおりです。
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 language はC/C++に基づいていますが、 C++のすべてがサポートされているわけではありません です。
Wiring IDEでクラスを作成することが許可されているかどうかはわかりません(私の最初のArduinoは今メールにあります)。 C++クラスを記述し、 AVR-GCC を使用してコンパイルし、 [〜#〜] avrdude [〜#〜] を使用してArduinoにロードした場合、それは動作します。
My Webduino library はすべて、Arduino Ethernetシールドの上にWebサーバーを実装するC++クラスに基づいています。 Arduinoコードが#includeできる.hファイルでクラス全体を定義しました。自由にコードを見て、その方法を確認してください... Arduino IDEでオブジェクトを個別にコンパイルする本当の理由がないため、すべてインラインで定義することになりました。
このページ では、Arduinoスケッチは、セットアップループとメインループで呼び出されるいくつかの構造(およびいくつかのメソッド)を定義します。私のようなほとんど読み書きのできないプログラマーでさえ、解釈するのに十分簡単です。