Ich komme heute leider auf keinen grünen Zweig.
Ich möchte im Void loop gerne eine Funktion aufrufen welche eine Globale Variable ändert diese Globale Variable möchte ich dann im Void Loop weiterverarbeiten
Beispiel:
int X;
void Setup() {
}
void loop(){
funktion();
Serial.print(X);
}
int funktion(){
int X++;
}
Das X in funktion ist eine andere, lokale Variable.
Lass das int weg, dann verwendest du die bereits definierte globale Variable.
"Richtig" wäre es ohne globale Variable:
int funktion(int& x) { // Parameter als Referenz
// verändert x und liefert den Wert zurück
return ++x;
}
void setup () { Serial.begin(9600); }
void loop () {
static int x; // wird nur hier gebraucht, muss aber für den nächsten loop Aufruf erhalten bleiben, daher static
Serial.println (funktion(x));
delay(100); // Gemütlicher
}
Du definierst in der funktion die variable X mit dem int davor ein zweites mal.
Du hast dann eine globale variable, die in der loop verwendet wird, UND eine lokale variable in der funktion. daß die den gleichen namen haben, ist egal.
außerdem solltest Du X einen anfangswert zuweisen...
Wieso schreibst du hier nochmal "int" hin? Was meinst du was das bewirkt?
int X++;
Eine Funktion die int als Rückgabewert hat muss auch einen Wert zurückgeben. Entweder du du gibst nichts zurück (void) und änderst die Variable direkt. Oder du gibst den geänderten Wert zurück. Bei deinen Kenntnissen verwende lieber erst mal keinen Rückgabewert. Also so:
@Serenifly, versteh ich das richtig eine "void" funktion kann ich keine werte zurückgeben?
Korrekt. Rückgabe-Wert heißt aber das in #4. Mit return
Du willst einfach globale Variablen verändern. Das ist was anderes. Du kannst natürlich auch eine Funktion mit Rückgabe-Wert haben und damit eine globale Variable ändern. Da ist aber dann die Frage ob diese Variable wirklich global sein sollte.
@Serenifly, versteh ich das richtig eine "void" funktion kann ich keine werte zurückgeben?
@ Klaus, ja das sollte nur ein beispiel sein, aber warum schreibt du int funktion(int x) und return ergebniss hat bei mir jetzt auch ohne geklappt
Problem ist, dass du keinen Fehler um die Ohren gehauen bekommst, wenn du eine Funktion als int dklarierst, aber keinen Wert zurücklieferst. So lernst du es ja nie.
void func1() { } // liefert nichts (void) zurück
int func2 () { return -1; } // liefert ein int zurück
void setup() { } // setup selbst liefert (wem?) nichts zurück
void loop() {
int x = func2(); // x wird auf -1 gesetzt
func1(); // ok
func2(); // geht auch, das Ergebnis ist dem Aufrufer egal
}
Serenifly's Tip zu Tutorials soll das natürlich nicht ersetzen. War nur auch zu langsam...
Und wie gesagt um eine globale Variable zu ändern reicht sowas:
int x; //automatisch mit 0 initialisiert, da global
void func()
{
x++;
}
Man verzichtet aber normal auf globale Variablen soweit wie möglich (wird in der Arduino Programmierung oft etwas vernachlässigt). Dann muss man mit Parametern und Rückgabewerten arbeiten. Oder sehr oft schreibt man ja eine Funktion die nicht nur für eine bestimmte Variable, sondern die mit beliebigen Variablen umgehen kann. Und/oder man hat eine komplexe Berechnung in der Funktion die dann ein Ergebnis zurück liefert.