En temel fark kapsamdır.
İlk durumda, global bir değişken bildiriyorsunuz. Tanımından sonra her kapsamda erişilebilen bir değişkendir.
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;
};
İkinci durumda, yerel kapsamı olan bir statik değişken bildiriyorsunuz. Değişken, global değişkenlere benzer tüm program çalışması için devam eder, ancak yalnızca bildirildiği kod bloğundan erişilebilir. Bu, yalnızca bir değişiklikle aynı örnektir. countartık içeride statik bir değişken olarak bildirildi loop.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Bu, işlevin inc()erişimi olmadığından derlenmez count.
Her ne kadar faydalı gibi görünse de, küresel değişkenler bazı zorluklarla birlikte gelir. Fiziksel çevreyle etkileşime girebilecek programlar yazmak söz konusu olduğunda bunlar bile hasara neden olabilir. Bu, programlar büyümeye başlar başlamaz, gerçekleşmesi muhtemel bir şeyin çok temel bir örneğidir. Bir işlev yanlışlıkla global bir değişkenin durumunu değiştirebilir.
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;
}
Bu tür vakaların hatalarını ayıklamak çok zordur. Ancak bu tür bir problem, sadece statik bir değişken kullanılarak kolayca tespit edilebilir.
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;
}