Perbedaan paling mendasar adalah ruang lingkup.
Dalam kasus pertama, Anda mendeklarasikan variabel global. Ini adalah variabel yang dapat diakses di setiap lingkup setelah definisinya.
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;
};
Dalam kasus kedua, Anda mendeklarasikan variabel statis dengan cakupan lokal. Variabel akan bertahan selama seluruh program berjalan mirip dengan variabel global, tetapi hanya dapat diakses di blok kode yang dideklarasikan. Ini adalah contoh yang sama, dengan hanya satu perubahan. count
sekarang dinyatakan sebagai variabel statis di dalamnya loop
.
void inc();
void loop()
{
static int count = 0;
Serial.println(count);
count++;
inc();
delay(500);
}
Ini tidak akan dikompilasi karena fungsi inc()
tidak memiliki akses count
.
Variabel global, betapapun bermanfaat, datang dengan beberapa jebakan. Ini bahkan dapat menyebabkan kerusakan ketika datang ke menulis program yang dapat berinteraksi dengan lingkungan fisik. Ini contoh yang sangat mendasar dari sesuatu yang sangat mungkin terjadi, segera setelah program mulai membesar. Suatu fungsi dapat secara tidak sengaja mengubah status variabel global.
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;
}
Kasus-kasus seperti itu sangat sulit di-debug. Namun jenis masalah ini, dapat dengan mudah dideteksi, hanya dengan menggunakan variabel statis.
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;
}