今回から今まで説明した内容の補足説明です。
補足記事
この基礎編パート1では、プログラミングに必要な最低限の知識を説明しました。ただ実際にプログラミングをする場合、もう少し補足の知識が必要になります。
そこで、これから何回かに分けて、今まで説明した内容の補足をしていきます。
#define定義の注意点
第15回の記事で、#defineの使い方を説明しました。例えばキッチンタイマーの秒を表現するLEDがありますが、このLEDをつけている時間は以下のように#defineで定義しています。
#define BYOU_ON 50
このように#defineすると、例えばスケッチに以下のように書いた場合、50ms時間待ちをします。
delay(BYOU_ON);
Arduino IDEは、スケッチをArduinoボードに送るときに、裏で以下のように「BYOU_ON」を「50」に置き換えます。
delay(50);
これだけを見ると特に何か問題がある、というわけではないですよね。
ところで、「BYOU_ON」を以下のように定義する場合を考えてみます。
#define BYOU_ON 50 + 100
このように定義すると、スケッチに出てくる「BYOU_ON」を「50 + 100」に置き換えてくれます。これだけだと特に問題はなさそうですよね。
先ほどと同じように、時間待ちをするために以下のようにdelay関数を書いたとします。
delay(BYOU_ON);
このように書くと、Arduino IDEは、スケッチをArduinoボードに送るときに、裏で以下のように「BYOU_ON」を「50 + 100」に置き換えます。
delay(50 + 100);
つまり、50+100=150、ということで、150ms時間待ちをするわけです。
次に、この2倍の時間待ちをする場合を考えます。つまり150ms x 2 = 300msの時間待ちをしたいわけです。2倍するには、「BYOU_ON」を2倍すればいいわけですから、以下のようにスケッチに書けばよさそうですよね。
delay(BYOU_ON * 2);
実は、これが問題を引き起こします。どのようになるか、Arduino IDEの裏の作業を確認してみましょう。
まず、Arduino IDEはスケッチをArduinoボードに送るときに「BYOU_ON」を「50+100」に置き換えます。
delay(50 + 100 * 2);
delay関数の引数をよくみてみると、「50+100 x 2」ですよね。四則演算は「 x 」(掛ける)と「 ÷ 」(割る)を先に計算して、そのあとに「 + 」(足す)と「 − 」(引く)を計算するルールですので、
50+100 x 2 = 250
となります。本当は50+100=150を2倍、つまり300にしたかったのに、結果は250になってしまいました。
このような問題を起こさないために、#defineで定義する場合は注意点があります。
#define定義するときの注意点
#defineで定義する際、複数の項目に置き換える場合は基本的には「 ( )」(カッコ)で囲むようにします。言葉ではわかりづらいので、先ほどの例で確認します。
先ほど、「BYOU_ON」を「50 + 100」で定義しましたが、この「50 + 100」をカッコで囲み「 (50 + 100) 」というように定義します。
#define BYOU_ON (50 + 100)
このように定義して、BYOU_ONを2倍にするスケッチがどうなるか確認してみましょう。
delay(BYOU_ON * 2);
Arduino IDEはこのスケッチをAruinoボードに送る時、「BYOU_ON」を以下のように置き換えます。
delay( (50 + 100) * 2 );
このdelay関数の引数は「 (50 + 100) x 2 」ですので、この式は最初にカッコ内を計算することになります。「 150 x 2 」となり、無事BYOU_ONの値、150を2倍することができました。
このように#defineで複数の項目に置き換える場合、カッコで囲むようにしてください。
更新履歴
日付 | 内容 |
---|---|
2019.12.28 | 新規投稿 |
2021.8.27 | 新サイトデザイン対応 |