スケッチで変数を利用する

変数とは何で、スケッチでどうやって利用するのか。


LAST REVISION: 2022/11/28 23:46


変数は一連のデータを格納する場所です。変数は、名前と値、型を持っています。例えば、以下の文(定義と呼ばれます)は、

int pin = 13;

名前がpinで、値が13、型がintの変数を作ります。後のプログラムで、この変数を名前で参照することができ、その時点での値が参照され使用することができます。例えば、以下の文では、

pinMode(pin, OUTPUT);

pinの値(13)がpinMode()という関数に渡されます。この場合、変数を利用する必要はないかもしれません。以下の文も同様に動作します。

pinMode(13, OUTPUT);

この場合での変数の利点は、実際のピンの値を一度だけ指定することで、何度も利用することができることです。このため、後でピンを13から12に変更すると決めたときには、コードを1か所だけ変更するだけですみます。また、変数の意味を明確にするために、意味のある名前を付けることができます。例えば、RGB LEDを制御するプログラムでは、redPinやgreenPin、bluePinという変数を利用することで意味がわかりやすくなります。

変数には数字のような値よりも利点があります。もっとも重要なことは、代入(=)を使って変数の値を変更できることです。例えば、

pin = 12;

は、その変数の値を12に変更します。ここでは変数の型を指定していないことに注意してください。代入によって型は変更されません。つまり、変数の値は変更されますが、変数の名前は最初に指定した型からは変更されません。変数に値を代入する前に、変数を定義する必要があることに注意してください1。変数の定義がない状態で、上記の文をプログラムに書くと、“error: pin was not declared in this scope"のようなメッセージが出力されます。

ある変数の値を他の変数に代入すると、値のコピーが作られそのコピーが他の変数に割り当てられたメモリの場所に格納されます。一方を変更しても、もう一方には影響を与えません。例えば、以下の実行後は、

int pin = 13;
int pin2 = pin;
pin = 12;

pinは12になりますが、pin2は13のままです。

先ほどのエラーメッセージで、「スコープ(scope)」という言葉が何を意味しているのか気になっているかもしれません。これは、プログラム内で変数が利用できる場所(有効範囲)を意味します。変数を宣言する場所によって決まります。例えば、プログラムのどこでも変数を使いたい場合は、コードの最初で宣言します。これはグローバル変数と呼ばれます。以下に例を示します。

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);
}

setup()関数で変数に値が代入されているので、loop()から呼ばれるdigitalWrite()関数での値は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.
}

さきほどと同じメッセージ(“error: ‘pin’ was not declared in this scope”)が出力されます。つまり、プログラムのどこかでpinを宣言していても、スコープ外で利用しようとしたということになります。

全ての変数をグローバル変数にすればいいのにと思っているかもしれません。では、どこで変数を使うかわからないのに、スコープを一つの関数に限定しなければならないのでしょうか。何が起こるのかがわかりやすくなる、というのが答えです。グローバル変数だと、コードのどこでも値を変更できます。これは、変数に何が起こるのかを知るために、プログラムの全てを知る必要があるということです。例えば、変数が期待しない値になったときに、変数のスコープが限定されている方が、その値がどこで設定されたのかを見つけやすくなります。

オリジナルのページ

https://docs.arduino.cc/learn/programming/variables


  1. Python®のようないくつかの言語では、型は変数ではなく値に結びついていて、任意の値を変数に代入することができます。これは動的型付けと呼ばれます。 ↩︎

最終更新日

November 29, 2022

inserted by FC2 system