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;
}
Kedua variabel statis - mereka bertahan untuk seluruh sesi eksekusi. Global terlihat oleh fungsi apa pun jika ia menyatakan - bukan mendefinisikan - global, atau jika fungsi tersebut mengikuti definisi dalam unit kompilasi yang sama (file + termasuk).
Memindahkan definisi
count
ke dalam suatu fungsi, keduanya membatasi cakupan visibilitasnya ke kumpulan{}
es terdekat yang terlampir , dan memberikannya waktu pemanggilan fungsinya (fungsi tersebut dibuat dan dimusnahkan saat fungsi tersebut masuk dan keluar). Mendeklarasikannyastatic
juga memberikannya sesi eksekusi seumur hidup dari awal hingga akhir sesi eksekusi, bertahan di seluruh pemanggilan fungsi.BTW: hati-hati menggunakan statika diinisialisasi dalam suatu fungsi, karena saya telah melihat beberapa versi dari kompiler gnu mendapatkan kesalahan ini. Variabel otomatis dengan penginisialisasi harus dibuat dan diinisialisasi pada setiap entri fungsi. Statis dengan penginisialisasi hanya boleh diinisialisasi sekali, selama setup eksekusi, sebelum main () diberikan kontrol (seperti global akan). Saya memiliki statika lokal yang diinisialisasi ulang pada setiap entri fungsi seolah-olah itu adalah otomatis, yang tidak benar. Uji kompiler Anda sendiri untuk memastikan.
sumber
extern
?Menurut dokumentasi Atmel: "Jika variabel global dideklarasikan, alamat unik dalam SRAM akan ditugaskan ke variabel ini pada waktu tautan program."
Dokumentasi lengkap ada di sini (Tip # 2 untuk variabel global): http://www.atmel.com/images/doc8453.pdf
sumber