Najbardziej podstawowa różnica dotyczy zakresu.
W pierwszym przypadku deklarujesz zmienną globalną. Jest to zmienna, która jest dostępna w każdym zakresie po jej zdefiniowaniu.
void setup()
{
Serial.begin(9600);
}
void inc();
int count = 0;
void loop()
{
Serial.println(count);
count++;
inc();
delay(500);
}
void inc() //Can edit the value of count
{
count=count+1;
};
W drugim przypadku deklarujesz zmienną statyczną o zasięgu lokalnym. Zmienna będzie trwała przez cały czas działania programu podobnie jak zmienne globalne, ale będzie dostępna tylko w bloku kodu, w którym została zadeklarowana. Jest to ten sam przykład, z tylko jedną zmianą. count
jest teraz zadeklarowany w środku jako zmienna statyczna loop
.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
To się nie skompiluje, ponieważ funkcja inc()
nie ma dostępu do count
.
Zmienne globalne, choć z pozoru przydatne, wiążą się z pewnymi pułapkami. Mogą nawet powodować szkody, jeśli chodzi o pisanie programów, które mogą wchodzić w interakcje z fizycznym otoczeniem. To bardzo prosty przykład czegoś, co może się wydarzyć, gdy tylko programy zaczną się powiększać. Funkcja może przypadkowo zmienić stan zmiennej globalnej.
void setup()
{
Serial.begin(9600);
}
void another_function();
int state=0;
void loop()
{
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Inadvertently changes state
state=1;
}
Takie przypadki są bardzo trudne do debugowania. Tego rodzaju problem można jednak łatwo wykryć, po prostu używając zmiennej statycznej.
void setup()
{
Serial.begin(9600);
}
void another_function();
void loop()
{
static int state=0;
//Keep toggling the state
Serial.println(state);
delay(250);
state=state?0:1;
//Some unrelated function call
another_function();
}
void another_function()
{
//Results in a compile time error. Saves time.
state=1;
}