彼らは悪ですか?多分。グローバルの問題は、制限なしで、実行中の関数またはコードによって、いつでもアクセスおよび変更できることです。これは、たとえば、さかのぼって説明するのが難しい状況につながる可能性があります。したがって、可能であれば、グローバルの量を最小限に抑えて、量をゼロに戻すことが望ましいです。
彼らは避けることができますか?ほとんど常にはい。Arduinoの問題は、彼らがあなたsetup()
とあなたを仮定するこの2つの機能アプローチにあなたを強制することですloop()
。この特定のケースでは、これら2つの関数(おそらくmain()
)の呼び出し元関数のスコープにアクセスできません。持っていれば、すべてのグローバル変数を削除して、代わりにローカル変数を使用できます。
以下を想像してください:
int main() {
setup();
while (true) {
loop();
}
return 0;
}
これはおそらく、Arduinoプログラムの主な機能が多少なりとも似ていることでしょう。あなたは、両方に必要な変数setup()
とloop()
関数は、好ましくはの範囲内で宣言されるだろうmain()
機能ではなく、グローバルスコープ。次に、それらを引数として渡すことにより(必要に応じてポインターを使用して)、他の2つの関数からアクセス可能にすることができます。
例えば:
int main() {
int myVariable = 0;
setup(&myVariable);
while (true) {
loop(&myVariable);
}
return 0;
}
この場合、両方の関数の署名も変更する必要があることに注意してください。
これは現実的でも望ましくもないかもしれないので、Arduinoプログラムからほとんどのグローバルを強制的にプログラム構造を変更せずに削除する方法は実際には1つしかないと思います。
私が正しく思い出すと、Arduinoのプログラミング中にCではなくC ++を完全に使用できます。OOP(Object Oriented Programming)またはC ++に(まだ)慣れていない場合は、ある程度慣れる必要があります。読書。
私の提案は、プログラムクラスを作成し、このクラスの単一のグローバルインスタンスを作成することです。クラスはオブジェクトの青写真と見なされるべきです。
次のプログラム例を考えてみましょう。
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à、私たちはほぼすべてのグローバルを排除しました。アプリケーションロジックの追加を開始する関数はProgram::setup()
and Program::loop()
関数です。これらの機能は、インスタンスの特定のメンバ変数へのアクセス権を持っているmyFirstSampleVariable
し、mySecondSampleVariable
伝統的なのに対し、setup()
およびloop()
機能これらの変数は、クラスがプライベートマークされているとしてアクセスすることはできません。この概念は、データのカプセル化またはデータ隠蔽と呼ばれます。
OOPやC ++を教えることは、この質問に対する答えの範囲外であるため、ここで停止します。
要約すると、グローバルは回避する必要があり、グローバルの量を大幅に削減することはほぼ常に可能です。また、Arduino用にプログラミングしているとき。
最も重要なことは、私の答えがあなたにとっていくらか役に立つことを願っています:)