Der grundlegendste Unterschied liegt im Umfang.
Im ersten Fall deklarieren Sie eine globale Variable. Es ist eine Variable, auf die nach ihrer Definition in jedem Bereich zugegriffen werden kann.
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;
};
Im zweiten Fall deklarieren Sie eine statische Variable mit lokalem Gültigkeitsbereich. Die Variable bleibt für den gesamten Programmlauf ähnlich wie globale Variablen bestehen, ist jedoch nur in dem Codeblock verfügbar, in dem sie deklariert ist. Dies ist das gleiche Beispiel mit nur einer Änderung. count
wird jetzt als statische Variable im Inneren deklariert loop
.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Dies wird nicht kompiliert, da die Funktion inc()
keinen Zugriff hat count
.
Globale Variablen, wie nützlich sie auch erscheinen mögen, bergen einige Fallstricke. Diese können sogar Schäden verursachen, wenn Programme geschrieben werden, die mit der physischen Umgebung interagieren können. Dies ist ein sehr einfaches Beispiel für etwas, das sehr wahrscheinlich passieren wird, sobald Programme größer werden. Eine Funktion kann versehentlich den Status einer globalen Variablen ändern.
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;
}
Solche Fälle sind sehr schwer zu debuggen. Diese Art von Problem kann jedoch leicht erkannt werden, indem einfach eine statische Variable verwendet wird.
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;
}