Arduinoと戯れてみる!

Arduino 入門 番外編 10 変数のスコープ(ローカル変数、グローバル変数)

arduino-extra-edition-10-00 Arduino番外編
スポンサーリンク

Arduino 入門 番外編 10 変数のスコープ
(ローカル変数、グローバル変数)

こんにちは管理人のomoroyaです。

arduino 入門 番外編はarduinoの基本的なことを解説している記事です。

 

今回は、重要なことなんだけと初心者、入門レベルではあまり意識していない?

変数のスコープ(ローカル変数、グローバル変数)」について解説します。

 

Arduinoに複雑なことをさせようとすると、スケッチ(コード、プログラム)がどんどん複雑になっていきますよね。

そんなとき、変数の管理をしっかりしていないと・・・。

何が何だかわからなくなることが多々あります。

 

そこで重要となるのが、変数のスコープです。

変数のスコープを意識することで分かりやすいスケッチを書くことが可能となります。

 

arduino自身のこと、スケッチ(コード、プログラム)を少しづつ理解して行きましょう。

いやいや、arduinoを早速始めたいんだ!というかたは下記の入門編からお読みください。

 

Lessonの入門編で使用しているArduinoは互換品です。

互換品とは言え、

Arduinoはオープンソースであり複製して販売するのもライセンス的に問題なし。

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段で豊富な部品が多数ついています。

 

スポンサーリンク

変数のスコープについて

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入門編で使用しているUNOはAmazonにて購入可能です。

互換品とは言え、Arduinoはオープンソース。

複製して販売するのもライセンス的に問題なし。

 

そのため互換品の品質も悪くなく、それでいて値段は安いです。

正規品本体の値段程度で豊富な部品が多数ついています。

 

学習用、遊び用、お試し用には安価な互換品がおすすめです。

 

Amazon ベストセラーNo.1
ELEGOO UNO キット レベルアップ  チュートリアル付 uno mega2560 r3 nanoと互換 Arduino用

 

上記のものでも十分に多数の部品が入っていますが、最初からもっと多数の部品が入っているこちらもお勧めです。

コメント

  1. omoroya omoroya より:

    【Arduino 入門 番外編 10】変数のスコープ(ローカル変数、グローバル変数)
    について記事をアップしました。
    【Arduino 入門 番外編 09】スケッチ(コード、プログラム)の関数化
    と併せて読むことで分かりやすいプログラムを書くための参考になると思います。

タイトルとURLをコピーしました