Arduino 入門
番外編 10
【変数のスコープ】
(ローカル変数、グローバル変数)
こんにちは管理人のomoroyaです。
arduino 入門 番外編はarduinoの基本的なことを解説している記事です。
今回は、重要なことなんだけと初心者、入門レベルではあまり意識していない?
「変数のスコープ(ローカル変数、グローバル変数)」について解説します。
Arduinoに複雑なことをさせようとすると、スケッチ(コード、プログラム)がどんどん複雑になっていきますよね。
そんなとき、変数の管理をしっかりしていないと・・・。
何が何だかわからなくなることが多々あります。
そこで重要となるのが、変数のスコープです。
変数のスコープを意識することで分かりやすいスケッチを書くことが可能となります。
arduino自身のこと、スケッチ(コード、プログラム)を少しづつ理解して行きましょう。
いやいや、arduinoを早速始めたいんだ!というかたは下記の入門編からお読みください。
Arduino入門編の解説にて使用しているArduinoは互換品です。
互換品とは言え、Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
正規品(Arduino UNO R3)の本体単品がほしい方はこちらとなります。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
変数のスコープについて
ArduinoはC/C++をベースにしています。
そのため、変数のスコープという考え方があります。
それが、グローバル変数であり、ローカル変数と呼ばれるものです。
このグローバルとローカルを意識することで、より安全で分かりやすいプログラムにすることが可能となります。
例えば、自作した関数内でグローバル変数を使うとしましょう。
そのグローバル変数は、どこからでも参照可能なわけで関数内で使用したときに意図しない値を使うということにもなりかねません。
また、関数内で意図しない値に変えてしまっているということもありえます。
プログラムが小さい場合は、特に問題にならないでしょう。
しかし、プログラムの規模が大きくなればなるほど意図しないミスを防ぐ必要があります。
そのためにも、変数のスコープは重要な考え方の1つです。
グローバル変数について
グローバル変数は全ての関数から参照ができます。
プログラムのどこでも使えると考えていただければ良いでしょうか。
Arduinoのスケッチで言うと、
setup()、loop()などの関数の外側で宣言された変数がグローバル変数となります。
下記に示す、「global_val」がグローバル変数となります。
//変数のスコープ1(グローバル変数) //https://omoroya.com/ int global_val; //どこからでも参照可能 void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: }
ローカル変数について
ローカル変数は宣言された関数内でのみ参照されます。
関数内でのみ使える変数と考えていただければ良いでしょうか。
Arduinoのスケッチで言うと、
setup()、loop()関数などの内側で宣言された変数がローカル変数となります。
下記に示す、「local_val_1」、「local_val_2」がローカル変数となります。
//変数のスコープ2(ローカル変数) //https://omoroya.com/ void setup() { int local_val_1; //setup関数内だけで参照される。 // put your setup code here, to run once: } void loop() { int local_val_2; //loop関数内だけで参照される。 // put your main code here, to run repeatedly: }
グローバル変数、ローカル変数 サンプル例
実際にグローバル変数、ローカル変数を全て記載して実際にコンパイルしてみましょう。
ぜひ、下記サンプルコードをコピーして試してみてください。
下記のサンプルプログラムは一部わざとエラーとなるようにしています!
エラーとなる箇所がどこなのか、確かめてみてください。
//変数のスコープ3(global変数、ローカル変数 サンプル例) //エラー箇所あり //https://omoroya.com/ int global_val; //どこからでも参照可能 void setup() { int local_val_1; //setup関数内だけで参照される。 // put your setup code here, to run once: local_val_1 = 5; // OK } void loop() { int local_val_2; //loop関数内だけで参照される。 // put your main code here, to run repeatedly: global_val = 10; // OK local_val_1 = 10; // Error local_val_2 = 10; // OK }
グローバル変数、ローカル変数 サンプル例の解答
コンパイルすることでエラー箇所をご確認いただけたかと思います。
念のため、エラー箇所の解答を記載しておきます。
エラー箇所は20行目の下記となります。
local_val_1 = 10; // Error
こちらの変数は、ローカル変数としてsetup()関数内で宣言した変数です。
そのため、setup()関数以外のところで使用するとエラーとなります。
コンパイル時のエラー内容がこちら。
global_local:20:3: error: 'local_val_1' was not declared in this scope local_val_1 = 10; // Error ^ exit status 1 'local_val_1' was not declared in this scope
グローバル変数、ローカル変数の違いをよく理解しておくことが重要です。
短いスケッチだとしてもグローバル変数だけを使うのではなくローカル変数も使うことを意識しましょう。
複雑で大きいスケッチを書くときに必ず役に立つはずです。
まとめ
「Arduino 入門 番外編 10 変数のスコープ(ローカル変数、グローバル変数)」
いかがだったでしょうか?
Arduinoに色んなことをさせようと考えると、スケッチ(コード、プログラム)がどんどん複雑になっていきます。
そんなときは、以前に解説した
Arduino 入門 番外編 09 スケッチ(コード、プログラム)の関数化
とあわせて、「グローバル変数」「ローカル変数」を意識してスケッチを作成してみましょう。
スケッチ(コード、プログラム)のデバック時に効果が実感できるはずです!
次回の番外編も、【搭載メモリ】について情報を発信したいと考えています。

最後に
疑問点、質問などありましたら気軽にコメントください。
この電子部品の解説をしてほしい!などなどなんでもOKです。
リンク切れ、間違いなどあればコメントいただけると助かります。
Arduino入門編、番外編、お役立ち情報などなどサイトマップで記事一覧をぜひご確認ください。
Arduino入門編、Arduino入門編2で使用しているUNOはAmazonにて購入可能です。
Arduino入門編では互換品を使用。
Arduinoはオープンソース。
複製して販売するのもライセンス的に問題なし。
そのため互換品の品質も悪くなく、それでいて値段は安いです。
正規品本体の値段程度で豊富な部品が多数ついています。
学習用、遊び用、お試し用には安価な互換品がおすすめです。
ELEGOO UNO キット レベルアップ チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用
上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。
Arduino入門編2では「Arduino UNO R4 Minima」「Arduino UNO R4 WIFI」にて遊ぶため今のところは正規品を使用。(まだ互換品が・・・ほぼない)
Amazonでお得に買う方法
Amazonでお得に購入するならAmazon Mastercard、Amazonギフト券がおすすめです。
時期により異なりますが、様々なキャンペーンを実施しています。
\Amazonギフト券/
Amazonギフトカード キャンペーン
\Amazon Mastercard お申込み/
Amazon Mastercard 申し込み
いずれの場合もプライム会員である方がお得!!
\Amazon Prime 30日間の無料会員を試す/
無料会員登録
コメント
たとえば、
void loop{
int i;//外のi
for (int i=..;..;..){iを使った処理;}
}
の場合、”iを使った処理”ではforループで定義したiが優先的に使われますか?それともforループでiは定義できないんでしょうか?
コメントありがとうございます。
for文内のiはfor文内のみで有効です。
外側のiは、自由につかえます。
【Arduino 入門 番外編 10】変数のスコープ(ローカル変数、グローバル変数)
について記事をアップしました。
【Arduino 入門 番外編 09】スケッチ(コード、プログラム)の関数化
と併せて読むことで分かりやすいプログラムを書くための参考になると思います。