スコープ
Maple(Arduino STM32)が使用するC ++プログラミング言語の変数(すべてのスケッチは偽装されたC ++プログラムです)にはスコープという特性があります。 簡単に言えば、変数のスコープは、その変数が使用できるプログラム内の範囲を意味します。
C ++のスコープはかなり複雑なトピックなので、ここではそれを完全に説明しようとはしません。 代わりに、グローバルとローカルの2種類のスコープについて簡略化した内容の説明を提示します。 詳細については、C ++リファレンスを参照してください。
グローバル変数とローカル変数
グローバル変数は、プログラム内のすべての関数から「参照する」ことができる変数です。 Maple IDE(Arduino IDE+Arduini STM32環境)では、関数(setup()やloop()など)の外部で宣言された変数はグローバル変数です。 ローカル変数は、特定の関数の内部でしか参照することができません。 変数をその関数を囲む中括弧の中に宣言することで、関数をローカルに宣言することができます。
プログラムが大きくなり複雑になると、ローカル変数は、関数が独自の変数に排他的にアクセスできるようにするのに便利な方法です。 これにより、ある関数が別の関数で使用されている変数を誤って変更すると、プログラミングエラーを防ぐことができます。
また、forループの中で変数を宣言して初期化すると便利なことがあります。 これにより、ループ本体の内部からのみアクセス可能な変数が作成されます。 利用例
ここでは、グローバル変数とローカル変数の使用法、およびforループ内の変数の宣言だけでなく、Maple IDE(Arduino IDE+Arduini STM32環境)にコピーしてMaple(Arduino STM32)で実行できるスケッチの例を示します。 スケッチを確認してアップロードした後、必ずシリアルモニタを開きます。
code:sample.ino
int globalVar; // any function will see this variable
void setup() {
// since "globalVar" is declared outside of any function,
// every function can "see" and use it:
globalVar = 50;
// the variables "i" and "d" declared inside the "loop" function
// can't be seen here. see what happens when you uncomment the
// following lines, and try to Verify (compile) the sketch:
//
// i = 16;
// SerialUSB.print("i = ");
// SerialUSB.println(i);
// d = 26.5;
// SerialUSB.print("d = ");
// SerialUSB.println(d);
}
void loop() {
// since "i" and "d" are declared inside of the "loop" function,
// they can only be seen and used from inside of it:
int i;
double d;
for (int j = 0; j < 5; j++) {
// variable i can be used anywhere inside the "loop" function;
// variable j can only be accessed inside the for-loop brackets:
i = j * j;
SerialUSB.print("i = ");
SerialUSB.println(i);
}
// globalVar can be accessed from anywhere. note how even
// though we set globalVar = 50 in the "setup" function, we can
// see that value here:
SerialUSB.print("globalVar = ");
SerialUSB.println(globalVar);
// d can be accessed from anywhere inside the "loop" function:
d = 26.5;
SerialUSB.print("d = ");
SerialUSB.print(d);
SerialUSB.println(" (before separateFunction())");
separateFunction();
// notice how even though separateFunction() has a variable
// named "d", it didn't touch our (local) variable which has
// the same name:
SerialUSB.print("d = ");
SerialUSB.print(d);
SerialUSB.println(" (after separateFunction())");
}
void separateFunction() {
// variable "d" here has the same name as variable "d" inside of
// the "loop" function, but since they're both _local_
// variables, they don't affect each other:
double d = 30.5;
SerialUSB.print("d = ");
SerialUSB.print(d);
SerialUSB.println(" (inside of separateFunction())");
}
関連項目
このドキュメントはleafLabs, LLC.が執筆し、たま吉が翻訳・一部加筆修正したものです。