ArduinoのSketch(スケッチ)では、変数に修飾子をつけて変数を宣言する事ができます。
修飾子をつけて変数を宣言すると、そのキーワードに応じた性質を変数が持つ事になります。
static修飾子
関数内でstaticを付けて宣言するとスタティック変数になります。通常のローカル変数は、関数が呼ばれる度に生成と破棄が行われますが、スタティック変数は継続的で、関数が初めて呼ばれたときに1度だけ生成され、関数が繰り返し呼ばれても、ずっと値が保持されます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 |
/* RandomWalk * Paul Badger 2007 * RandomWalk wanders up and down randomly between two * endpoints. The maximum move in one loop is governed by * the parameter "stepsize". * A static variable is moved up and down a random amount. * This technique is also known as "pink noise" and "drunken walk". */ #define randomWalkLowRange -20 #define randomWalkHighRange 20 int stepsize; int thisTime; int total; void setup() { Serial.begin(9600); } void loop() { // tetst randomWalk function stepsize = 5; thisTime = randomWalk(stepsize); Serial.println(thisTime); delay(10); } int randomWalk(int moveSize){ static int place; // variable to store value in random walk - declared static so that it stores // values in between function calls, but no other functions can change its value place = place + (random(-moveSize, moveSize + 1)); if (place < randomWalkLowRange){ // check lower and upper limits place = place + (randomWalkLowRange - place); // reflect number back in positive direction } else if(place > randomWalkHighRange){ place = place - (place - randomWalkHighRange); // reflect number back in negative direction } return place; } |
Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
“Arduino Reference:Static” by Arduino Team is licensed under CC BY-SA 3.0
上記の例では、31行目の、
static int place;
でstatic修飾子をつけて、変数placeを宣言しています。これにより場所を表す変数placeの値を継続的なものにしています。
volatile修飾子
volatile修飾子を型宣言の前に付けて宣言すると、変数をレジスタではなくRAMからロードするよう、コンパイラに指示する事ができます。この様な指示が必要になるのは、特定条件では、レジスタに記憶された変数の値は不確かになるからです。具体的には、変数がコントロールの及ばない別の場所(たとえば並行して動作するコード)で変更される可能性があるときです。Arduinoの場合、割り込みサービスルーチンと呼ばれる、割り込みに関連したコードが、これに該当します。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 |
// toggles LED when interrupt pin changes state int pin = 13; volatile int state = LOW; void setup() { pinMode(pin, OUTPUT); attachInterrupt(0, blink, CHANGE); } void loop() { digitalWrite(pin, state); } void blink() { state = !state; } |
Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
“Arduino Reference:volatile keyword” by Arduino Team is licensed under CC BY-SA 3.0
上の例では、4行目で、
volatile int state = LOW;
とvolatile修飾子付きで変数宣言しています。これで、割り込み発生時とメインループの双方から、安全にstateにアクセスする事が出来ます。
const修飾子
const修飾子をつけて変数を宣言すると、その変数は読み取りのみ可で実質的な定数になります。値は変更できなくなり、値を代入しようとすると、コンパイルエラーが発生します。
1 2 3 4 5 6 7 8 |
const float pi = 3.14; float x; // .... x = pi * 2; // it's fine to use const's in math pi = 7; // illegal - you can't write to (modify) a constant |
Creative Commons Attribution-ShareAlike 3.0 License (CC BY-SA 3.0)
“Arduino Reference:const keyword” by Arduino Team is licensed under CC BY-SA 3.0
上の例では、1行目の
const float pi = 3.14;
で、piをconst付で宣言して使用していますが、8行目で値を代入しようとしていますので、コンパイルは通りません。
まとめ
必要に応じて修飾子をつけた変数宣言を行うと、効率および安全性を高めたプログラミングが可能になります。修飾子には上記以外にもPROBMEM等がありますが、別の機会に説明したいと思います。
Sponsored Link