秘密基地、どこに作った?

arduinoのスケッチ(C言語)について教えてください。



************************************************

int pin = 0; //変数pinに0を代入(初期化)


void setup() {

Serial.begin(9600) ;
}



void loop() {

int val;
hantei:
val = analogRead(pin) ; //A0ピンから値を読み込み変数valに代入 

Serial.println(val) ; //読み込まれた値をモニターへ表示

if(val < 150){ //まず最初にvalの値をチェック。150より小さければ下の行へ、150以上ならばこのif文を抜けて goto hantei;の次の行へ 
goto hantei;
}

hantei2:
val = analogRead(pin) ;
Serial.println(val) ;
hantei2:
if(val >= 150){ //次に再びvalの値をチェック。150以上ならば下の行へ、150より小さければこのif文を抜けて goto hantei2;の次の行へ
goto hantei2;
}

hantei3:
val = analogRead(pin) ;
Serial.println(val) ;

if(val < 150){ //まず最初にvalの値をチェック。150より小さければ下の行へ、150以上ならばこのif文を抜けて goto hantei3;の次の行へ 
goto hantei3;
}
}

******************************************



これは今回作ったスケッチ中の条件分岐の部分を抜粋したものです。



動作としては
if文を使用し、

・最初のif文でピンの値を読み取る。
・それが150未満ならその間は読み取りを繰り返す。
・繰り返していて値が150以上になったら最初のif文を抜けて2番目のif文へ進む。
・2番目のif文でもう一度値を読み取る。
・次は値が150以上ならその間読み取りを繰り返す。
・繰り返していて値が150未満になったらい2番目のif文を抜けて3番目のif文へ進む。
・3番目のif文でも値を読み取る。
・今度は値が150未満ならその間は読み込みを繰り返す。
・繰り返していて値が150以上になったら3番目のif文を抜けて次へ(ここでは書いてない)進む。

if文の条件を満たしていない間はピンの値の読み取りを繰り返すようにするためgotoを使い、hantei(hantei2,hantei3)というラベルへ飛ぶという動きをさせています。
if文での値の判定を3つクリアしたらこの先のプログラムへ実行が移ります。
(回路での動作としては、CDSセルで明るさを監視しており、一度明るくなって、そのあと暗くなったらその次のプログラムを実行(サーボモーターを動かす)するというものです)

このスケッチ自体は正常にコンパイルできて、arduino uno+ブレッドボードでの基盤でも正常に希望通りの動作をしてくれました。
シリアルモニターでも値の変化と回路の動作が正常に行われているのを確認できました。
なのでこのままでも全く問題はないんです。

ただ、C言語の勉強をしていると、goto文の説明には必ず「goto文は使い方によっては便利だが流れが分かりづらくなるのであまり好んで使用されることは無い」とあります。
私は以前、アセンブリ言語によるPICマイコンのプログラミングをほんの少しかじっていて、そこではgoto命令で特定のラベルへ飛ぶという動作はごく普通に使用していたので違和感なく今回も使用したのですが、
どうせならgotoを使用しないスケッチの書き方を知っておきたいと思いました。
ただ、私の頭ではどうしてもgotoを使用せずに上記のスケッチと同じ動作の物を書くことができませんでした。
どうすればgoto無しで解決できますか?
何パターンかあれば教えて頂けると助かります。

A 回答 (2件)

void loop(){


int val;

do{
val = analogRead(pin);
Serial.println(val);
}while(val >= 150);

do{
val = analogRead(pin);
Serial.println(val);
}while(val < 150);

do{
val = analogRead(pin);
Serial.println(val);
}while(val >= 150);
}
    • good
    • 0

この例だと、ラベル〜gotoは、単に「条件を満す間処理を繰り返す」というループをしているだけです。


そのような場合は、while、do〜while , for といった、ループ専用の構文を使います。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!


おすすめ情報