Return Wert einer Funktion

Gast #2587811
Lesenswert?

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 #2587826
Lesenswert?

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 #2587842
Lesenswert?

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 #2587844
Lesenswert?

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 #2587863
Lesenswert?

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 #2587872
Lesenswert?

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 #2587880
Lesenswert?

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) #2588642
Lesenswert?

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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren