15【#define】と【const】こんにちは管理人のomoroyaです。番外編はarduinoの基本的なことを解説している記事です。本記事は、管理人も使い分けをきちんと理解していない【#define】と【const】について改めて考えてみます。考えるかというとスケッチ(コード)で定数の定義の仕方が本やネットのサンプルスケッチ(コード)によってマチマチだからです。管理人はプログラマーの専門家というわけではありません。これまでは、#defineとconstをあまり意識していませんでした。そこで今回改めて考えることにしました。変数のスコープとも絡むお話となります。下記の記事を読んでおくとより理解が深まると考えます。変数のスコープ(ローカル変数、グローバル変数)今回は、重要なことなんだけと初心者、入門レベルではあまり意識していない?「変数のスコープ(ローカル変数、グローバル変数)」について解説します。Arduinoに複雑なことをさせようとすると、スケッチ(コード、プログラム)がどんどん複雑になって...omoroya.comarduino自身のこと、スケッチ(コード、プログラム)を少しづつ理解して行きましょう。いやいや、arduinoを早速始めたいんだ!というかたは下記の入門編からお読みください。小学校でもプログラミングが始まる。我が家の子供にも、プログラミングを教えられないか。プログラミングしてもつまらない。目に見える形で楽しみたい!そこで、Arduinoの出番。「Arduino」であれば、色んなものを直接制御でき目に見...omoroya.com本Lesson解説で使用しているのはArduino互換品です。互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。そのため互換品の品質も悪くなく、それでいて値段は安いです。正規品本体の値段程度で豊富な部品が多数ついています。Yahoo!正規品の本体単品がほしい方はこちらとなります。定数の定義でよく見かける構文スケッチ(コード)の中には定数の定義が必ずでできます。冒頭であったり、setup()のなかだったりと定義します。そのとき、本やネットによって同じ内容のスケッチ(コード)なのに定義の仕方が異なっていると事が多々あります。13;スケッチ(コード)的には、どちらで定義してもコンパイラエラーもでることはありません。上記の後に同じ内容のスケッチ(コード)をかいたとしても同じように動作します。ここで、ふと思うわけです。どっちがいいの?#defineについてまずは、#defineについて確認していきます。#defineはプログラム中の定数に対して名前を付けることができる#defineで定義された定数は、コンパイル時に定義した値へ置きかえられるチップ上のメモリ(RAM)を消費しない構文例は以下となります。※最後に「;」はつきませんので注意!#defineを使ったサンプルスケッチ(コード)がこちら。単純なLEDのON/OFFです。//1秒待つ}このスケッチでは、#defineによりコンパイル時にledpinという変数が全て13に置き換えられます。constについて次に、constについて確認していきます。変数を読み取り専用にする型を持つ変数として使えるが、値は変更できないconstで定義した変数に値を代入しようとするとコンパイルエラーになるconstを付けた変数はスコープのルールに従うスコープのルールに関しては、下記をご確認ください。変数のスコープ(ローカル変数、グローバル変数)今回は、重要なことなんだけと初心者、入門レベルではあまり意識していない?「変数のスコープ(ローカル変数、グローバル変数)」について解説します。Arduinoに複雑なことをさせようとすると、スケッチ(コード、プログラム)がどんどん複雑になって...omoroya.comconstを使ったサンプルスケッチ(コード)がこちら。単純なLEDのON/OFFです。//1秒待つ}最初の変数の定義の仕方がことなるだけで、スケッチ(コード)の動作としてはまったく同じです。これが、本だったりネットに転がってるスケッチ(コード)だったりでマチマチなわけです。#defineとconstについて公式リファレンスでは#defineよりもconstを使うことを推奨しています。理由はconstで定義された変数はスコープのルールに従うため。変数のスコープ(ローカル変数、グローバル変数)をご確認ください。スコープのルールに従うというのは、間違いやミスを少なくできますよということにつながります。#defineとても便利です。その便利さが欠点でもあります。それは、定義した変数が全て置き換えられるということ。※利点でもありますが・・・。#defineで定義した変数は、その変数がどこにいようともソースファイルをテキストのように扱い文字列の置換をしてしまうのです。これは意図しない置換をしてしまうことがあるということにつながります。短いコードであれば、全体を把握できるので問題ありません。コードが長くなれば長くなるほど把握するのに限界があります。そのため、スケッチ(コード)はスコープのルールを意識して書くことが大事です。これが、constを推奨している理由です。スケッチ(コード)が長くなるため、繰り返し処理する部分を関数化したとします。その関数の中に対して#defineで定義された変数と同じ変数を使っていたらどうなるでしょう。置換が行われてしまいます。考えると置換が行われる範囲がおそろしいですよね・・・。ちなみに、関数化に関しては以下にて解説しています。興味のある方は覗いてみてください。本日は、スケッチ(コード、プログラム)の関数化についてです。Arduinoに複雑なことをさせようとするとスケッチ(コード、プログラム)がどんどん複雑になっていきますよね。そんなときはスケッチ(コード、プログラム)の関数化で解決です。...omoroya.comということで、管理人は以下のように考えます。初級者レベルのうちは基本はconstを使てスケッチ(コード)を書くことに慣れる。中級、上級レベルになって、#defineの意味を理解したうえで使う。管理人は、本日からconstを使うことを基本とします。#defineって何?じゃ、#defineってなんだろうって思いますよね。一言でいうと、マクロです。マクロはconst定数のようにデータの型をもちません。コンパイル時にスケッチ(コード)の該当箇所を置換するマクロ機能です。管理人の知識では、この程度の解説が限界です。Arduinoのスケッチ(コード)に関しては#defineを使わないでも当面大丈夫と考えています。【#define】と【const】」いかがだったでしょうか?Arduinoに色んなことをさせようと考えると、スケッチ(コード)がどんどん複雑になっていきます。これからは#defineを使わずに、スケッチ(コード)を書くようにしたいと考えます。変数のスコープ(ローカル変数、グローバル変数)とあわせて、わかりやすいスケッチを作成するように意識してみましょう。スケッチ(コード)のデバック時に効果が実感できるはずです!次回の番外編も、スケッチについて情報を発信したいと考えています。最後に疑問点、質問などありましたら気軽にコメントください。この電子部品の解説をしてほしい!などなどなんでもOKです。リンク切れなどあればコメントいただけると助かります。Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。Arduino入門編で使用しているUNOはAmazonにて購入可能です。互換品とは言え、Arduinoはオープンソース。複製して販売するのもライセンス的に問題なし。そのため互換品の品質も悪くなく、それでいて値段は安いです。正規品本体の値段程度で豊富な部品が多数ついています。学習用、遊び用、お試し用には安価な互換品がおすすめです。Yahoo!上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。Yahoo!Amazonでお得に買う方法Amazonでお得に購入するなら、Amazonギフト券がおすすめです。現金でチャージするたびに、チャージ額に応じたポイントが付与されます。番外編はarduino自身の基本的な内容を記事にする予定です。今回は、arduinoの「UART通信」について解説していきます。arduinoの入門編を書いていて、arduino自体の説明をしたいと考えていました。arduino自身のことを理解しておいた方が良いですよね。変数のスコープ(ローカル変数、グローバル変数)今回は、重要なことなんだけと初心者、入門レベルではあまり意識していない?「変数のスコープ(ローカル変数、グローバル変数)」について解説します。番外編はarduinoの基本的なことを書いていく方向性にする予定です。番外編はarduino自身の基本的な内容を記事にする予定です。今回は、arduinoの「SPI通信」について解説していきます。番外編はarduinoの基本的なことを書いていく予定です。今回は、arduinoの「I2C通信」について解説していきます。コメントをキャンセルメールアドレスが公開されることはありません。