ここから本文です

c言語プログラミングで質問です。初心者です。

アバター

ID非公開さん

2019/2/318:49:06

c言語プログラミングで質問です。初心者です。

void loop のなかのプログラムに、LEDを緑で光らせるプログラムが入っています。
このLEDを緑で光らせるプログラムを変数にすることはできますか?

x=' LEDを緑で光らせるプログラム'

みたいな感じです。

閲覧数:
50
回答数:
1

違反報告

ベストアンサーに選ばれた回答

プロフィール画像

カテゴリマスター

qui********さん

編集あり2019/2/320:25:42

void loopでLEDとかいうとArduinoの匂いプンプンですけれど、そうだとするとC++ベースです。共通の部分もとても多いですけど、時々違うので明確にした方がいいです。勝手にArduinoということにしちゃいますが、
他の言語だと難なく関数を変数に入れことが出来るのもありますけれど、C/C++では
・関数ポインタ
あるいは
・クラス
が多分あなたの思っていることを実現する手段かなぁ、と思います。
どちらも...特にクラスは真面目に説明を始めるととても終わらないので、「そんなのがある」という話だけにさせて下さい。興味があればまずはC++の入門書をどうぞ。

関数ポインタは、「関数を入れられる変数」と言っていいでしょうか。関数の在り処を持っている変数、なのでポインタなんですけれどね。
----Program 1----
const int RED_LED = 4; //ピン番号設定。適宜実機にあわせて
const int GREEN_LED = 5; //

void red() {
//戻り値無し引数無しなら中身はなんでもいいんですけどとりあえず
digitalWrite(RED_LED, HIGH);
delay(500);
digitalWrite(RED_LED, LOW);
}
void green() {
digitalWrite(GREEN_LED, HIGH);
delay(300);
digitalWrite(GREEN_LED, LOW);
}

void (*funcPtr)();//これが戻り値無し引数無しの関数への関数ポインタ、void(*)()型で名前がfuncPtr

void setup() {
pinMode( RED_LED, OUTPUT);
pinMode( GREEN_LED, OUTPUT);
}
void loop() {
funcPtr = green;
funcPtr(); //GREEN_LEDが点灯/消灯する
funcPtr = red;
funcPtr();//RED_LEDが点灯/消灯する
}


一方、クラスは...それはそれで奥深い世界があるのですが、変数や関数をひっくるめた一体として扱う「型」で、継承という仕組みを使うと「同じ変数名や関数名で中身が違うクラスから出来た変数をとっかえひっかえ出来る」ということになります。

----Program 2----
const int RED_LED = 4; //ピン番号設定。適宜実機にあわせて
const int GREEN_LED = 5; //

class LED_BLINK {
protected:
int pin;
public:
LED_BLINK(int p) : pin(p) {
pinMode(p, OUTPUT);
}
virtual void blink() = 0;
};

//点滅時間の違いくらいだったらメンバ変数に持たせるのがスジとも言うけど
//説明の都合上。
class BLINK_500ms: public LED_BLINK {
public:
BLINK_500ms(int p): LED_BLINK(p) {
}
virtual void blink() {
digitalWrite(pin, HIGH);
delay(500);
digitalWrite(pin, LOW);
}
};
class BLINK_300ms: public LED_BLINK {
public:
BLINK_300ms(int p): LED_BLINK(p) {
}
virtual void blink() {
digitalWrite(pin, HIGH);
delay(300);
digitalWrite(pin, LOW);
}
};
void setup() {
}
void loop() {
LED_BLINK *led;
led = new BLINK_300ms(GREEN_LED);
led->blink();
led = new BLINK_500ms(RED_LED);
led->blink();
}

アバター

質問した人からのコメント

2019/2/10 05:35:44

ありがとうございます!やってみます!

みんなで作る知恵袋 悩みや疑問、なんでも気軽にきいちゃおう!

Q&Aをキーワードで検索:

Yahoo! JAPANは、回答に記載された内容の信ぴょう性、正確性を保証しておりません。
お客様自身の責任と判断で、ご利用ください。
本文はここまでです このページの先頭へ

「追加する」ボタンを押してください。

閉じる

※知恵コレクションに追加された質問は選択されたID/ニックネームのMy知恵袋で確認できます。

不適切な投稿でないことを報告しました。

閉じる