Onlar kötülük mü? Olabilir. Globals ile ilgili sorun, herhangi bir zamanda, herhangi bir zamanda, herhangi bir fonksiyon ya da kod parçası tarafından, kısıtlama olmaksızın, erişilebilmesi ve değiştirilebilmesidir. Bu, izini sürmek ve açıklamak zor diyelim, diyelim. Bu nedenle, mümkünse sıfıra geri getirerek küresel miktarının en aza indirilmesi arzu edilir.
Kaçınılabilirler mi? Neredeyse her zaman evet. Arduino'nun sorunu, sizi setup()
ve sizi kabul ettikleri bu iki işlev yaklaşımına zorlamalarıdır loop()
. Bu özel durumda, bu iki fonksiyonun (muhtemelen main()
) arayan işlevinin kapsamına erişiminiz yoktur . Elinizde olsaydı, kendinizi tüm dünyadan kurtarır ve onun yerine yerliler kullanırsınız.
Aşağıdakileri hayal edin:
int main() {
setup();
while (true) {
loop();
}
return 0;
}
Bu muhtemelen bir Arduino programının temel işlevinin neye benzediğidir. Değişkenler hem de ihtiyaç setup()
ve loop()
fonksiyon daha sonra tercihen kapsamında iç ilan edilirdimain()
fonksiyonu yerine küresel kapsam. Daha sonra argüman olarak geçirerek (gerekirse işaretçiler kullanarak) diğer iki fonksiyona erişilebilir hale getirilebilirler.
Örneğin:
int main() {
int myVariable = 0;
setup(&myVariable);
while (true) {
loop(&myVariable);
}
return 0;
}
Bu durumda, her iki fonksiyonun imzasını da değiştirmeniz gerektiğini unutmayın.
Bu mümkün veya arzu edilmeyebileceği için, zorlanan program yapısını değiştirmeden bir çok Arduino programından globları çıkarmanın tek bir yolunu görüyorum.
Doğru hatırlıyorsam, C + yerine Arduino için programlama yaparken C ++ 'ı mükemmel şekilde kullanabiliyorsunuz (henüz) OOP (Nesneye Yönelik Programlama) hakkında bilginiz yoksa veya C ++ , biraz alıştırabilir ve bazı okuma.
Teklifim bir Program sınıfı oluşturmak ve bu sınıfın tek bir küresel örneğini oluşturmak olacaktır. Bir sınıf, nesnelerin planı olarak düşünülmelidir.
Aşağıdaki örnek programı göz önünde bulundurun:
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();
}
Voilà, kendimizi hemen hemen tüm dünyalardan kurtardık. Uygulama mantığınızı eklemeye başlayacağınız işlevler Program::setup()
ve Program::loop()
işlevleri olacaktır. Bu işlevler örneği belirli üye değişkenlerine erişebilir myFirstSampleVariable
ve mySecondSampleVariable
geleneksel oysa setup()
ve loop()
bu değişkenler sınıf olarak gizli işaretlenmiş olarak erişimi olmayan fonksiyonlar. Bu kavram veri kapsülleme olarak adlandırılır. veya veri gizleme .
Size OOP ve / veya C ++ 'ların öğretilmesi, bu sorunun cevabının kapsamı dışında kaldığı için burada duracağım.
Özetlemek gerekirse: kürelerden kaçınılmalı ve küreler miktarını büyük ölçüde azaltmak neredeyse her zaman mümkün. Ayrıca Arduino için programlama yaparken.
En önemlisi, cevabımın sizin için biraz faydalı olduğunu umuyorum :)