Woher soll man das denn wissen? ...
Bei meinen ersten Gehversuchen mit dem Arduino gleich so eine Falle.
Taster 1 soll den Wert inkrementieren, Taster 2 dekrementieren. Die
beiden Taster funktionieren perfekt und sind einwandfrei entprellt, die
Datrentypen sind auch ok. Trotzdem funktioniert es nicht.
Ihr sehr bestimmt auf Anhieb, warum es nicht geht?
Sonst liefere ich gleich die Lösung.
Ich wußte, dass ihr gut und schnell seid :-)
Die Bezeichnung 'Loop' suggeriert eine Schleife. Tatsächlich ist es aber
natürlich eine Funktion. Mit 'static' ging's. Erstmal habe ich aber
gerätselt :D
Roth schrieb:> Das wäre eine Schleife .
void loop() macht in etwa das, was du da beschreibst. Nur weiß die arme
Arduino-IDE nicht, wo deine Initialisierung aufhört und die main-loop
anfängt. Daher gibt es für sowas void setup().
In deinem Fall also folgendermaßen:
Auch wenn ich mich mit Arduino nicht wirklich auskenne, eigentlich sogar
überhaupt nicht. Aber, daß die in Setup() deklarierten lokalen Variablen
in Loop() bekannt sind, kannst du deiner Oma erzählen.
Hallo,
naja, fast. Prinzipiell sieht die Arduino main so aus:
1
int main(void)
2
{
3
init();
4
5
setup();
6
7
for (;;)
8
loop();
9
10
return 0;
11
}
loop() wird in einer Endlosschleife als Funktion ständig aufgerufen.
int myVal = 0; innerhalb setup() gilt nur innerhalb setup...
Wenn, dann müßte sie global angelegt werden, also
1
int myVal = 0;
2
3
setup();
4
5
loop();
Es gibt aber keinen Grund, eine variable, die nur innerhalb der Funktion
loop() benutzt wird, global anzulegen. Damit sie ihren Wert bei erneutem
Aufruf von loop() behält gibt es static.
Gruß aus Berlin
Michael
Thomas E. schrieb:> Auch wenn ich mich mit Arduino nicht wirklich auskenne, eigentlich> sogar> überhaupt nicht. Aber, daß die in Setup() deklarierten lokalen Variablen> in Loop() bekannt sind, kannst du deiner Oma erzählen.
Ich glaube, nicht mal die Oma frisst das.
@ Roth
Ich fürchte, diese "Entdeckung" hat lange nicht die Bedeutung, die Du
ihr zumisst.
Der Funktionsheader void loop() ist "eindeutig" und ohne Rätselraten
einfach ein Funktionsheader. Nicht mehr und nicht weniger.
C kennt keine Funktionen, die, falls sie "loop" heissen, ohne weiteres
immer wieder aufgerufen werden.
An Deinen Fehlern aus Unkenntnis bin ich - und ich vermute die meisten
hier -, nicht interessiert. Dazu haben wir schon genug eigene Fehler
dieser Art gemacht.
Also übertreib mal nicht. Das Du diesen Fehler gemacht hast, ist absolut
nichts Besonderes.
Theor schrieb:> Der Funktionsheader void loop() ist "eindeutig" und ohne Rätselraten> einfach ein Funktionsheader. Nicht mehr und nicht weniger.
Das Entscheidende hier ist die Arduino IDE an dieser Stelle, denn die
macht aus der Funktion loop() eine echte Schleife - Michael hat es
beschrieben wie intern abläuft.
Bei Arduino ist die Reihenfolge so vorgesehen:
1. Variable definieren
2. setup() //alle Initialisierungen
3. loop() // das was immer wiederholt werden soll
Wer mag kann hier
https://www.arduino.cc/reference/en/language/structure/sketch/setup/
nachlesen.
Ja nach außen hin ist loop() eine ganz normale Funktion. Intern wird es
aber von der Arduino IDE anders gehandhabt. Man könnte das Ganze auch
mit einem anderen Compiler kompilieren aber das Kompilat wird nicht wie
gewünscht funktionieren. Aber sehr wahrscheinlich wird es nicht
durchlaufen weil der Compiler die fehlende main() anmeckern wird.
Für einen anderen Compiler, z.B. GCC, müßte man es so implementieren wie
Michael es beschrieben hat.
Zeno schrieb:> Ja nach außen hin ist loop() eine ganz normale Funktion. Intern wird es> aber von der Arduino IDE anders gehandhabt. Man könnte das Ganze auch> mit einem anderen Compiler kompilieren aber das Kompilat wird nicht wie> gewünscht funktionieren. Aber sehr wahrscheinlich wird es nicht> durchlaufen weil der Compiler die fehlende main() anmeckern wird.> Für einen anderen Compiler, z.B. GCC, müßte man es so implementieren wie> Michael es beschrieben hat.
Ich glaube du bist etwas verwirrt.
1: Das ist alles ganz normales C++
2. loop() ist eine ganz normale Funktion
3. Arduino nutzt den gleichen Gcc, wie das Atmel Studio
Richtig. Denke er verwechselt Compiler mit IDE, denn die Arduino IDE ist
es die besagte main Funktion welches loop() tatsächlich aks loop
aufruft, im Hintergrund hinzufügt.