第46回 補足 – #define

今回から今まで説明した内容の補足説明です。

補足記事

この基礎編パート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 新規投稿