Go Down

Topic: Werte aus Funktionen übernehemen (Read 1 time) previous topic - next topic

DeBran

Hallo zusammen,

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:
Code: [Select]

int X;

void Setup() {
}

void loop(){
funktion();
Serial.print(X);
}

int funktion(){
int X++;
}


was genau mach ich falsch?

Gruss

michael_x

#1
Nov 28, 2016, 04:44 pm Last Edit: Nov 28, 2016, 04:52 pm by michael_x Reason: Mit Musterlösung
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:

Code: [Select]
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
}

Eisebaer

#2
Nov 28, 2016, 04:44 pm Last Edit: Nov 28, 2016, 04:45 pm by Eisebaer
hi,

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...

gruß stefan

17 sekunden zu spät, war ja klar...

Serenifly

#3
Nov 28, 2016, 04:45 pm Last Edit: Nov 28, 2016, 04:47 pm by Serenifly
Es gibt keine voids! Void ist ein Datentyp

Wieso schreibst du hier nochmal "int" hin? Was meinst du was das bewirkt?
Code: [Select]

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:
Code: [Select]

void funktion()
{
}

Klaus_ww

Setup groß geschrieben, Serial nicht initialisiert .. ach was solls, so geht's:

Code: [Select]

int x=0;

void setup()
{
  Serial.begin(9600);
}

void loop()
{
x = funktion(x);
Serial.println(x);
}

int funktion(int x)
{
int ergebnis = x+1;
return ergebnis;
}
Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

Klaus_ww

Freizeit-Programmierer mit moderatem Ehrgeiz besseren Code zu schreiben.

DeBran

Danke michael_x und Eisebaer

für eure Antwort hat mir sehr geholfen! war einfacher als ich dachte so Funktioniert das ganze :D

@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 :/

Serenifly

#7
Nov 28, 2016, 05:03 pm Last Edit: Nov 28, 2016, 05:11 pm by Serenifly
Quote
@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.

Lese mal ein paar Tutorials/Anleitungen über Funktionen in C++. z.B.:
https://de.wikibooks.org/wiki/C%2B%2B-Programmierung/_Weitere_Grundelemente/_Prozeduren_und_Funktionen
(nach call-by-reference kannst du aufhören)

michael_x

#8
Nov 28, 2016, 05:07 pm Last Edit: Nov 28, 2016, 05:09 pm by michael_x
@Klaus :
Quote
wegen der elenden Tipperei auf dem Tablet
:smiley-roll-blue:

Quote
@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.

Code: [Select]
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...

DeBran

Danke euch allen jetzt wird mir das ganze wieder etwas klarer werden mich jetzt erstmal mit dem Link von Serenifly beschäftigen :D

Serenifly

#10
Nov 28, 2016, 05:34 pm Last Edit: Nov 28, 2016, 05:35 pm by Serenifly
Und wie gesagt um eine globale Variable zu ändern reicht sowas:
Code: [Select]

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.

Go Up