変数は、データを格納する場所です。変数には名前、値、型があります。例えば、次の文(宣言と呼ばれます)は、
int pin = 13;
名前が pin、値が13、型が int である変数を作成します。プログラムの後半では、この変数を名前で参照することができ、その時点で値が検索され、使用されます。例えば、次の文では:
pinMode(13, OUTPUT);
この場合の変数の利点は、ピンの実際の番号を一度だけ指定すれば、何度も使用できることです。つまり、後でピン13からピン12に変更したい場合でも、コード内の1箇所を変更するだけで済みます。また、変数の意味を明確にするために、わかりやすい名前を付けることもできます(例えば、RGB LEDを制御するプログラムでは、redPin、greenPin、bluePinという変数を使用するなど)。
変数には、数値などの値に比べて他にも利点があります。最も重要なのは、変数の値を代入(イコール記号で示されます)を使って変更できることです。例えば、次のようになります。
pin = 12;
変数の値は12に変更されます。変数の型を指定していないことに注意してください。型は代入によって変更されません。つまり、変数名は型と永続的に関連付けられ、値のみが変化します。(注:Pythonなどの一部の言語では、型は変数名ではなく値に関連付けられており、変数には任意の型の値を代入できます。これは動的型付けと呼ばれます。動的型付けは、Arduino言語と86Duino言語の両方でサポートされていません。)
変数に値を代入する前に宣言する必要があることに注意してください。最初の文をプログラムに含めずに、前の文をプログラムに含めると、「エラー: このスコープではピンが宣言されていません」のようなメッセージが表示されます。
ある変数を別の変数に代入すると、その変数の値のコピーが作成され、そのコピーが別の変数に関連付けられたメモリ上の場所に格納されます。一方の変数の値を変更しても、もう一方の変数には影響しません。例えば、以下のコードを実行した後は、
int pin = 13; int pin2 = pin; pin = 12;
pin のみ値が 12 です。pin2 は 13 のままです。
さて、上記のエラーメッセージにある「スコープ」という言葉はどういう意味なのか、と疑問に思われるかもしれません。これは、変数を使用できるプログラムの範囲を指します。これは、変数を宣言する場所によって決まります。例えば、プログラム内のどこでも変数を使用できるようにしたい場合は、コードの先頭で宣言します。これはグローバル変数と呼ばれます。例を以下に示します。
int pin = 13;
void setup()
{
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(pin, HIGH);
}ご覧のとおり、pin は setup() 関数と loop() 関数の両方で使用されています。どちらの関数も同じ変数を参照しているため、一方の変数の値を変更すると、もう一方の関数の値も変化します。例を以下に示します。
int pin = 13;
void setup()
{
pin = 12;
pinMode(pin, OUTPUT);
}
void loop()
{
digitalWrite(pin, HIGH);
}ここで、loop() から呼び出された digitalWrite() 関数には、setup() 関数で変数に割り当てられた値である 12 が渡されます。
変数を単一の関数内でのみ使用する必要がある場合は、その関数内で宣言することができます。その場合、変数のスコープはその関数内に限定されます。例えば、
void setup()
{
int pin = 13;
pinMode(pin, OUTPUT);
digitalWrite(pin, HIGH);
}この場合、変数 pin は setup() 関数内でのみ使用できます。次のようなことを実行しようとすると、
void loop()
{
digitalWrite(pin, LOW); // wrong: pin is not in scope here.
}先ほどと同じメッセージが表示されます。「エラー: ‘pin’ はこのスコープでは宣言されていません」。つまり、プログラム内のどこかで pin を宣言しているにもかかわらず、スコープ外で使用しようとしているということです。
なぜすべての変数をグローバルにしないのか、と疑問に思うかもしれません。そもそも、変数がどこで必要になるかわからないのに、なぜその変数のスコープを1つの関数だけに限定する必要があるのでしょうか?答えは、その変数に何が起こるかを把握しやすくなるからです。変数がグローバルの場合、その値はコード内のどこでも変更される可能性があります。つまり、変数に何が起こるかを知るには、プログラム全体を理解する必要があります。例えば、変数に予期しない値が設定された場合、変数のスコープを限定しておけば、その値がどこから来たのかを把握するのがはるかに簡単になります。
参照
- [Language] Variable Declaration
Language Reference Home
86Duinoリファレンスのテキストは、Arduinoリファレンスを改変したもので、Creative Commons Attribution-ShareAlike 3.0ライセンスに基づいてライセンスされています。リファレンス内のコードサンプルはパブリックドメインとして公開されています。