Sind sie böse Vielleicht. Das Problem bei Globals ist, dass sie zu jedem Zeitpunkt von einer Funktion oder einem Codeteil, der ausgeführt wird, ohne Einschränkungen aufgerufen und geändert werden können. Dies kann zu Situationen führen, die sich beispielsweise nur schwer zurückverfolgen und erklären lassen. Es ist daher wünschenswert, die Anzahl der Globalen zu minimieren, wenn möglich, um die Anzahl auf Null zurückzusetzen.
Können sie vermieden werden? Fast immer ja Das Problem mit Arduino ist, dass sie Sie zu diesem Ansatz mit zwei Funktionen zwingen, bei dem sie Sie setup()
und Sie übernehmen loop()
. In diesem speziellen Fall haben Sie (wahrscheinlich main()
) keinen Zugriff auf den Umfang der Anruferfunktion dieser beiden Funktionen . Wenn Sie dies getan hätten, könnten Sie sich von allen Globalen befreien und stattdessen Einheimische verwenden.
Stellen Sie sich Folgendes vor:
int main() {
setup();
while (true) {
loop();
}
return 0;
}
Dies ist wahrscheinlich mehr oder weniger die Hauptfunktion eines Arduino-Programms. Variablen, die Sie sowohl in der setup()
als auch in der loop()
Funktion benötigen, werden dann vorzugsweise im Geltungsbereich der deklariertmain()
Funktionsbereichs und nicht des globalen Bereichs . Sie könnten dann den beiden anderen Funktionen zugänglich gemacht werden, indem sie als Argumente übergeben werden (ggf. unter Verwendung von Zeigern).
Beispielsweise:
int main() {
int myVariable = 0;
setup(&myVariable);
while (true) {
loop(&myVariable);
}
return 0;
}
Beachten Sie, dass Sie in diesem Fall auch die Signatur beider Funktionen ändern müssen.
Da dies möglicherweise weder machbar noch wünschenswert ist, sehe ich wirklich nur einen Weg, um die meisten globalen Elemente aus einem Arduino-Programm zu entfernen, ohne die erzwungene Programmstruktur zu ändern.
Wenn ich mich richtig erinnere, können Sie C ++ perfekt verwenden, während Sie für Arduino programmieren, anstatt C. Wenn Sie (noch) nicht mit OOP (Object Oriented Programming) vertraut sind oder C ++ , ist es möglicherweise gewöhnungsbedürftig lesen.
Mein Vorschlag wäre, eine Program-Klasse und eine einzelne globale Instanz dieser Klasse zu erstellen. Eine Klasse sollte als Blaupause für Objekte betrachtet werden.
Betrachten Sie das folgende Beispielprogramm:
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à, wir haben uns von fast allen Globalen befreit. Die Funktionen, in denen Sie beginnen würden, Ihre Anwendungslogik hinzuzufügen, wären die Funktionen Program::setup()
und Program::loop()
. Diese Funktionen haben Zugriff auf die Instanz bestimmten Elementvariablen myFirstSampleVariable
und mySecondSampleVariable
während der traditionellen setup()
und loop()
Funktionen haben keinen Zugriff , da diese Variablen Klasse privat markiert hat. Dieses Konzept wird als Datenkapselung oder Verstecken von Daten bezeichnet.
Das Unterrichten von OOP und / oder C ++ ist in der Beantwortung dieser Frage nicht ausreichend, daher höre ich hier auf.
Zusammenfassend lässt sich sagen, dass Globals vermieden werden sollten und es fast immer möglich ist, die Anzahl der Globals drastisch zu reduzieren. Auch wenn Sie für Arduino programmieren.
Vor allem hoffe ich, dass meine Antwort für Sie nützlich ist :)