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無しで解決できますか?
何パターンかあれば教えて頂けると助かります。
No.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);
}
No.1
- 回答日時:
この例だと、ラベル〜gotoは、単に「条件を満す間処理を繰り返す」というループをしているだけです。
そのような場合は、while、do〜while , for といった、ループ専用の構文を使います。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- Visual Basic(VBA) [Excel VBA] このコードでは行の挿入や行の消去をすると13のエラーが出てしまう。 3 2022/12/09 00:29
- Java Java 南京錠 2 2023/02/04 11:46
- Visual Basic(VBA) vbaのループ処理について 6 2022/05/06 15:35
- Visual Basic(VBA) 3つのプロシージャをまとめたら実行時エラー発生で対応不能 6 2022/05/17 01:47
- C言語・C++・C# C言語 leetcode21 Merge Two Sorted Lists 2 2022/04/24 19:35
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
- Visual Basic(VBA) excel2021で実行できないマクロ。どこを直したらいいのか 2 2022/03/28 03:40
- Ruby vscode 文字化け 1 2022/05/21 19:17
- その他(プログラミング・Web制作) ColabでのPytorchのエラー 1 2022/11/19 20:51
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・「みんな教えて! 選手権!!」開催のお知らせ
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~12/6】 西暦2100年、小学生のなりたい職業ランキング
- ・ちょっと先の未来クイズ第5問
- ・これが怖いの自分だけ?というものありますか?
- ・スマホに会話を聞かれているな!?と思ったことありますか?
- ・それもChatGPT!?と驚いた使用方法を教えてください
- ・見学に行くとしたら【天国】と【地獄】どっち?
- ・2024年のうちにやっておきたいこと、ここで宣言しませんか?
- ・とっておきの「夜食」教えて下さい
- ・これまでで一番「情けなかったとき」はいつですか?
- ・プリン+醤油=ウニみたいな組み合わせメニューを教えて!
- ・タイムマシーンがあったら、過去と未来どちらに行く?
- ・遅刻の「言い訳」選手権
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・この人頭いいなと思ったエピソード
- ・あなたの「必」の書き順を教えてください
- ・10代と話して驚いたこと
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・人生最悪の忘れ物
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
C言語 exitの使い方
-
Excel-vba 文字列と変数を...
-
フリーランタイマーの時間差分...
-
フォームを開くときに、コンボ...
-
足して100になるような乱数のア...
-
VB6.0-整数と余りを求める
-
VBAで配列のNULL判定
-
ラジオボタンの値の取得につい...
-
DataGridView 複数行同時変更...
-
VBAでプロセデュア間で共有でき...
-
VBA コンボボックスの値をスピ...
-
VBAでC列が入力済みならそのま...
-
vbaで極大値を抽出する方法
-
10進数をアスキーコードに変換
-
関数で複数の値を戻り値として...
-
VBAのチェックボックス結果を集...
-
数字の位ごとの値を表示するプ...
-
C言語(arduino)での条件分岐...
-
VBAの定数の使い方で、計算値を...
-
コンボボックスの名前を変数に...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
C言語 exitの使い方
-
フォームを開くときに、コンボ...
-
Excel-vba 文字列と変数を...
-
VB6.0-整数と余りを求める
-
数字の位ごとの値を表示するプ...
-
足して100になるような乱数のア...
-
VBAの定数の使い方で、計算値を...
-
C#で動的にコントロールを取得...
-
Nullってどういう意味ですか?
-
1つ前の値を変数に保存する方法
-
VBAで配列のNULL判定
-
DWORDって
-
DataGridView 複数行同時変更...
-
ラジオボタンの値の取得につい...
-
4択問題のプログラムでランダム...
-
フリーランタイマーの時間差分...
-
関数で複数の値を戻り値として...
-
VBA コンボボックスの値をスピ...
-
世界のナベアツ
-
long型のランダムな値を返す方法
おすすめ情報