Funktion mit Rückgabewert schneller/vorzeitig verlassen - Wie?

Hallo,

eine allgemeine Frage. Man kann doch eine Funktion ohne Rückgabewert mit einfachen return vorzeitig verlassen. Nur wenn man eine Funktion mit Rückgabewert vorzeitig verlassen möchte, funktioniert ein einfaches return nicht. Wie macht man das wenn man zu dem Zeitpunkt kein Wert zurückliefern kann und auch nicht möchte? Sonst würde ja Datenmüll geliefert. Gibt es noch einen anderen Befehl oder eine mir unbekannte Option für return? Oder muß ich meine Funktion in 2 Funktionen aufteilen?

float Funktionsname ()    
{
  Variablen definieren ...
    
  if ( dies gleich das? )
    {
     irgendwas sinnvolles machen
     Serial.println("info"); 
    }
   else {
           return;  }   

  .... usw.
}

Wenn man nur positive Zahlen hat ist -1 ein gern verwendeter Rückgabewert für den Fall das etwas schief gelaufen ist oder nichts gemacht wurde. Oder -1.0 in deinem Fall. Ansonsten besteht noch die Möglichkeit einen Zeiger auf eine Variable als Parameter zu übergeben. Damit kann man mehrere Werte an eine aufrufende Funktion übergeben.

avr gcc aber sehr gnädig und erlaubt auch Code-Pfade ohne Rückgabe-Wert. Und die Arduino Software unterdrückt sogar die Warnung. Das hier läuft problemlos:

float func()
{
  int test = 3;
  
  if(test > 10)
  {
    return 2.0;
  }  
}

Die Frage ist ob die aufrufende Funktion diesen Fall mitbekommen muss.

Hallo,

also kann man sich das else { return; } komplett sparen. Die Funktion wird ohne Rückgabewert verlassen. Würde mir momentan reichen.

Vielen Dank.

Serenifly: avr gcc aber sehr gnädig und erlaubt auch Code-Pfade ohne Rückgabe-Wert. Und die Arduino Software unterdrückt sogar die Warnung. Das hier läuft problemlos:

Hallo,

da scheint der Warn-Level sehr "liberal" eingestellt zu sein. Frage ist natürlich, was macht die aufrufende Funktion, wenn sie sich darauf verlässt, einen Wert zu erhalten und dann kommt nichts? IMHO nicht sehr sinnvoll, im Fehlerfall sollte man z.B. -1 zurückgeben.

VC++ sagt übrigens zu Deiner Funktion:

warning C4715: "func": Nicht alle Steuerelementpfade geben einen Wert zurück.

Gruß, Ralf

Hallo,

-1 oder so kann ich nicht verwenden, weil die Funktion positive und negative Werte zurück liefert. Ich könnte aber irgendeinen hohen positiven bzw. negativen Wert vorzeitig zurückliefern der garantiert im Normalfall nicht zurückkommt. Fällt mir gerade ein. Dieses dann in loop zusätzlich abfragen und alles verwerfen. Das wäre dann bestimmt Regel konform.

Ja, das geht.

Man könnte wie gesagt auch sowas machen:

void loop()
{
    float value;
    if(func(&value) == true)
    {
          ...
    }
}

boolean func(float* retValue)
{
   int test = 3;
  
   if(test > 10)
   {
      *retValue = 2.0;
      return true;
   } 
   else
      return false;
}

Dann gibt der Rückgabewert an ob etwas gemacht wurde und man hat den eigentlichen Wert als Parameter

Doc_Arduino: -1 oder so kann ich nicht verwenden, weil die Funktion positive und negative Werte zurück liefert. Ich könnte aber irgendeinen hohen positiven bzw. negativen Wert vorzeitig zurückliefern der garantiert im Normalfall nicht zurückkommt. Fällt mir gerade ein. Dieses dann in loop zusätzlich abfragen und alles verwerfen. Das wäre dann bestimmt Regel konform.

Bei Gleitkommazahlen gibt es zwei Spezialwerte, die in der "Math" library definiert sind und über Makro ansprechbar sind: NAN ==> Das steht für "Not a number" INFINITY ==> Das steht für "unendlich"

Das sind beides ganz "normale" Rückgabewerte, die auch von der Math-Library zurückgeliefert werden können, z.B. bei der Division durch Null. Diese Rückgabewerte kannst Du als float-Werte auch ganz normal in eigenen Funktionen zurückliefern.

return NAN;
return INFINITY;

Du kannst nach dem Aufruf einer Funktion, die solche Rückgabewerte geliefert hat, auch auf diese Rückgabewerte testen.

Beim Prüfen auf den Rückgabewert INFINITY ganz normal mit == vergleichen:

 float f= MeineFloatFunktion(input);
 if (f==INFINITY) Serial.println("Unendlich");

Nur beim Prüfen auf den Rückgabewert NAN ist es anders, denn NAN ist keine Zahl und daher auch mit keiner anderen Zahl gleich, nicht einmal mit sich selbst. Daher testest Du auf den Rückgabewert NAN wie folgt:

 float f= MeineFloatFunktion(input);
 if (f!=f) Serial.println("Not a Number");

Vielleicht gibt Dir das ja ein paar Anregungen, wie Du es machen kannst. Die Math-Library macht es jedenfalls so mit diesen beiden Rückgabewerten, wenn irgendwas nicht ausgerechnet werden kann, z.B. eine Division durch Null, den Logarithmus von Null oder die Quadratwurzel aus einer negativen Zahl, dass dann entweder NAN oder INFINITY von der aufgerufenen Math-Funktion zurückgeliefert wird.

Hallo,

Danke Euch allen.

Da mein Code eh schon recht verschachtelt ist, habe ich mich nun für INFINITY entschieden. Ich denke das ist für das lesen des Codes übersichtlicher. Meine vorherige Abfrage auf Pseudo Fehlercode >999998.0 (Rückgabewert 999999.9) funktionierte zwar auch, naja was solls, es gibt hier mehrere Möglichkeiten, viele wurden aufgezeigt, für eins muß man sich entscheiden ... ;)