Forum: Mikrocontroller und Digitale Elektronik Return Wert einer Funktion


von Sebastian (Gast)


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

von abc (Gast)


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)

von Dussel (Gast)


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.

von Ulli N. (Gast)


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

von Dussel (Gast)


Lesenswert?

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.

von Wolke7 (Gast)


Lesenswert?

Merci....

von Ulli N. (Gast)


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.

von Dussel (Gast)


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.

von Ulli N. (Gast)


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.

von Andreas J. (Firma: www.anju.de) (anju_)


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

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.