Apakah mereka jahat? Mungkin. Masalah dengan global adalah bahwa mereka dapat diakses dan dimodifikasi pada suatu titik waktu dengan fungsi atau bagian kode apa pun yang dieksekusi, tanpa batasan. Ini dapat menyebabkan situasi yang, katakanlah, sulit untuk dilacak dan dijelaskan. Oleh karena itu diminimalkan jumlah global, jika mungkin membawa jumlah kembali ke nol, karena itu diinginkan.
Bisakah mereka dihindari? Hampir selalu ya. Masalah dengan Arduino adalah, bahwa mereka memaksa Anda ke dalam dua pendekatan fungsi di mana mereka menganggap Anda setup()
dan Anda loop()
. Dalam kasus khusus ini Anda tidak memiliki akses ke ruang lingkup fungsi pemanggil dari kedua fungsi ini (mungkin main()
). Jika Anda melakukannya, Anda akan dapat menyingkirkan diri Anda dari semua global dan menggunakan penduduk lokal sebagai gantinya.
Bayangkan yang berikut ini:
int main() {
setup();
while (true) {
loop();
}
return 0;
}
Ini mungkin lebih atau kurang apa fungsi utama dari sebuah penampilan Program Arduino seperti. Variabel yang Anda butuhkan di kedua setup()
dan loop()
fungsi akan kemudian lebih dinyatakan dalam lingkup main()
fungsi daripada lingkup global. Mereka kemudian dapat diakses oleh dua fungsi lain dengan cara melewati mereka sebagai argumen (menggunakan pointer jika diperlukan).
Sebagai contoh:
int main() {
int myVariable = 0;
setup(&myVariable);
while (true) {
loop(&myVariable);
}
return 0;
}
Perhatikan bahwa dalam hal ini Anda juga perlu mengubah tanda tangan dari kedua fungsi tersebut.
Karena ini mungkin tidak layak atau tidak diinginkan, saya benar-benar melihat hanya satu cara untuk menghapus sebagian besar global dari program Arduino tanpa memodifikasi struktur program yang dipaksakan.
Jika saya ingat dengan benar, Anda dapat menggunakan C ++ saat pemrograman untuk Arduino, dan bukan C. Jika Anda belum terbiasa dengan OOP (Pemrograman Berorientasi Objek) atau C ++, mungkin perlu beberapa waktu untuk membiasakan diri dan beberapa bacaan.
Proposal saya akan membuat kelas Program dan membuat contoh tunggal global kelas ini. Kelas harus dianggap sebagai cetak biru untuk objek.
Pertimbangkan contoh program berikut:
class Program {
public:
Program();
void setup();
void loop();
private:
int myFirstSampleVariable;
int mySecondSampleVariable;
};
Program::Program() :
myFirstSampleVariable(0),
mySecondSampleVariable(0)
{
}
void Program::setup() {
// your setup code goes here
}
void Program::loop() {
// your loop code goes here
}
Program program; // your single global
void setup() {
program.setup();
}
void loop() {
program.loop();
}
Voa, kami telah menyingkirkan hampir semua global. Fungsi di mana Anda akan mulai menambahkan logika aplikasi Anda akan menjadi Program::setup()
dan Program::loop()
fungsi. Fungsi-fungsi ini memiliki akses ke variabel anggota contoh spesifik myFirstSampleVariable
dan mySecondSampleVariable
sedangkan fungsi tradisional setup()
dan loop()
tidak memiliki akses karena variabel-variabel ini telah ditandai sebagai kelas privat. Konsep ini disebut enkapsulasi data atau penyembunyian data.
Mengajari Anda OOP dan / atau C ++ sedikit keluar dari ruang lingkup jawaban untuk pertanyaan ini jadi saya akan berhenti di sini.
Untuk meringkas: global harus dihindari dan hampir selalu mungkin untuk secara drastis mengurangi jumlah global. Juga saat Anda pemrograman untuk Arduino.
Yang terpenting saya harap jawaban saya agak berguna bagi Anda :)