Return Wert einer Funktion

Gast #2587811
Hi,
wie kann ich bei einer Funktion genau eine Varaible als Return 
festlegen:
in diesem Fall soll das Input als Return wiedergegeben werden:
1
//Min Max begrenzen
2
void MinMax (uint16_t Input, uint16_t Min , uint16_t Max)
3
{
4
 
5

6
            if (Input <= Min)
7
                Input = Min;
8
            
9

10
            if (Input >= Max)
11
                Input = Max;
12
            
13
      return;
14

15
}

So geht das ja leider nicht:
1
return Input;

Dann kommt diese Meldung:
main.h:288: warning: 'return' with a value, in function returning void

Und eine andere Idee habe ich nicht.
Bin über jeden Tipp dankbar...
Gast
such dir nen c tutorial. und lern englisch und die Fehlermeldungen zu 
verstehen.

da sagt dir jemand das eine ein Return mit einem Wert bei einer Fuktion 
die void erwartet nicht tut, bzw keinen Sinn macht. ist ja auch nur eine 
Warnung noch kein Fehler.

deine funktions deklaration erlaubt nur also void als return. tausch das 
durch das was du haben willst aus und o wunder es tut.

ach ja und beim aufruf der funktion naturlich den returnwert abholen.

uint16_t lelelu(uint16_t, uint16_t, uint16_t);

uint16_t a = lelelu(1,2,3);

geht natürlich auch anders. aber ich will dich mal nicht überfordern. 
(wild mit pointern um sich schiest)
Gast
Das gehört zu den C Grundlagen, du solltest also besser C mal richtig 
lernen, sonst wird es später schwierig.
Void vor dem Funktionsnamen gibt an, dass die Funktion keinen Wert 
zurückgibt. Wenn du einen Rückgabewert haben möchtest, musst du 
schreiben, welcher Typ zurückgegeben werden soll. In deinem Fall:
1
uint16_t MinMax (uint16_t Input, uint16_t Min , uint16_t Max)
weil Input vom Typ uint16_t ist.

> wie kann ich bei einer Funktion genau eine Varaible als Return
> festlegen:
Du kannst aus einer Funktion nur genau einen oder gar keinen Wert 
zurückgeben. Was von Anfängern öfter mal versucht wird, mehr als einen 
Wert zurückzugeben, geht in C und abgeleiteten Sprache nicht.

In einer void Funktion brauchst du auch kein return, weil die Funktion 
automatisch beendet wird. Du kannst es aber benutzen, um die Funktion 
früher zu beenden.
Gast
Du muust der Funktion den Typ desgewünschten Returnwertes geben und den 
Wert natürlich auch zuruckgeben:

uint16_t MinMax (uint16_t Input, uint16_t Min , uint16_t Max)
{
            if (Input <= Min)
                Input = Min;


            if (Input >= Max)
                Input = Max;

      return Input;
}

Das ist in dem Fall aber völliger Dummfug. Ich denke auch, du solltest 
dir mal die Grundlagen aneignen
Gast
Ulli N. schrieb:
> Das ist in dem Fall aber völliger Dummfug.

Warum das? Es ist nicht die eleganteste Lösung, aber die Funktion 
begrenzt den Wertebereich von Input. Und wenn er gerade die Grundlagen 
lernt, ist das schonmal ein ganz brauchbarer Ansatz.
Gast
Dussel schrieb:
> Warum das?

Ich benutze Rückgabewerte lieber dazu, ein durchgängiges Fehlerkonzept 
zu implementieren. Er braucht doch nur Input als Referenz zu übergeben, 
dann hat er das Ergebnis und kann über den Rückgabewert z.B anzeigen, 
daß mit Min oder Max etwas faul war, z.B. ausserhalb eines gültigen 
Wertebereiches.
Gast
Er scheint er Anfänger zu sein. Wenn er beim Returntyp noch Probleme 
hat, sollte er zuerst das verstehen, bevor man mit Referenzen oder 
Zeigern anfängt.
Außerdem beschränkt die Funktion den Wertebereich direkt, ohne dass man 
den Wert zuerst in der Funktion auswerten und dann später beschränken 
muss. Und ein return -1; als Fehlerangabe ist in so einer Funktion auch 
nicht besonders sinnvoll. Ich würde die Funktion so ähnlich auch 
verwenden, eventuell mit inline.
Gast
Dussel schrieb:
> Außerdem beschränkt die Funktion den Wertebereich direkt, ohne dass man
> den Wert zuerst in der Funktion auswerten und dann später beschränken
> muss. Und ein return -1; als Fehlerangabe ist in so einer Funktion auch
> nicht besonders sinnvoll. Ich würde die Funktion so ähnlich auch
> verwenden, eventuell mit inline.

Das ist in dem einfachen Fall natürlich richtig. Ich wollte ja nur einen 
Denkanstoß geben für weitergehende Konzepte. "Völliger Dummfug" war 
vielleicht etwas überspitzt formuliert.
(Firma: www.anju.de)
Fürs debuggen ganz nett - eine Ergebnisvariable:

 uint16_t MinMax (uint16_t Input, uint16_t Min , uint16_t Max)
  {
   uint16_t result = Input;

   if (Input <= Min)
     result = Min;

   else if (Input >= Max)
     result = Max;

   return result;
  }

aber ist hier doch etwas Overkill - kurz und knapp:

uint16_t MinMax (uint16_t Input, uint16_t Min , uint16_t Max)
 {
  return (Input <= Min)? Min
                       :((Input >= Max)? Max
                                       : Input);
 }

Andreas

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 14 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.