Rückgabewerte



  • Hallo!

    Vornwet: ich bin Anfänger!
    Ich bin gerade dabei mich mit Funktionen und Referenzen auseinanderzusetzen.
    Ich möchte eine Funktion schreiben, die mir mehrere Werte zurück gibt. Ich habe gelesen, dass ich das mit Referenzen machen kann. Aber in allen Beispielen, die ich gefunden habe wird der zurückgegebene Wert bereits an die Funktion übergeben.
    Beispiel: ich möchte a und b als Rückgabewerte.
    funk(int &a, int&b)

    ich möchte mir die Werte aber erst in der Funktion berechnen und dann zurückgeben lassen. Also z.B. über gebe ich x und Y an die funktion und bekomme a und b zurück. Geht das?
    Ich hoffe das war einigermaßen versändlich 🙂



  • Eine Funktion mir nur einem Rückgabewert kannst du einfach ganz leicht mit return zurückgeben. Sobald du mehrere Werte zurückgeben willst gibts zwei Möglichkeiten. Entweder du gibst ein Object zurück oder du machst es über die Parameter. Also Referenz oder Pointer.



  • ich möchts mit Referenzen machen. Aber daher ja meine Frage: Muss ich die Werte, die ich zurückgeben lassen will auch an die Funktion übergeben??? Beispiel siehe oben.



  • Antwort: Ja.

    Wenn du weist was Referenzen sind sollte das aber auch klar sein wieso...

    Ausserdem kann einen C(++) Funktion nur einen Rückgabewert haben.



  • Du kannst immer nur ein Wert zurückgeben !!!

    Zu deinem Problem:

    int calc(int a,int b)
    {
      //irgendwelche berechnungen
      a = 34+75;
      b = a + 23;
    
     //dann würdest du gerne sicher sowas machen oder??
     return a;
     return b;
    
    }
    
    ...
    
    int x=45,y=56;
    calc(x,y);
    
    cout<<x<<" "<<y;
    

    Das geht aber nicht weil du schon bei return a_; zurück bist und nie zu retrun b; kommen wirst.

    Und zweitens x und y werden sich nicht ändern, weil du die Werte in a und b kopierst.

    Dein Compiler nimmt sich dann nur die WERTE von x und y und a und b haben dann nur diese Werte aber beziehen sich nicht in irgendeiner Weise auf x,y;

    Also gibst du die Adressen von x und y an calc() somit wissen a und b wo x und y "wohnen" 😃 also beziehen sie sich direkt auf diese Werte sie zeigen also auf den selber Speicherbereich 😉 nicht wie bei einer Kopie auf verschiedene Speicherbereiche...

    Das sieht dann mit Zeigern so aus...

    int calc(int *a,int *b)  // wenn du bei varibalen definitionen ein * hinmachst 
    {                        //können diese Variablen Adressen speichern, somit                               
                             //heißen sie Zeiger(Pointer)
    
     //dann wissen a und b aber nur wo x und y wohenen du musst jetzt aber ins Haus  //gelangen  
    
    //Das machst du dann mit den Sternchen vor den Variablen ;) 
      *a = 34+75;
      *b = *a + 23;
    
     //dann würdest du gerne sicher sowas machen oder??
     return *a;
     return *b;
    
    }
    
    ...
    
    int x=45,y=56;
    calc(&x,&y); // Damit a und b die Adressen von x und y bekommen musst du vor x  //und y ein & schreiben
    
    cout<<x<<" "<<y;
    

    Jetzt ist da aber noch ein Fehler calc() müsste dann so aussehen

    void calc(int *a,int *b)
    {
    
      *a = 34+75;
      *b = *a + 23;
    
     // Jetzt brauchst du nichts zurück zu geben weil a und b sich ja auf x,y beziehen.
    
    }
    

    Nun zu den referenzen:

    Eine refernz ist nur ein anderer Name für ein Variable, also eine Art implizierte Zeiger 😉

    void calc(int &a,int &b) // & vor variablenname in definition bedeutet das das eine Refernz ist
    {
    
      a = 34+75;
      b = a + 23; // Bei refernzen brauchst du keine * mehr und sie beziehen sich trotzdem auf x,y
    
    }
    
    //Du musst also auch keine Adressen mehr übergeben;)
    calc(x,y);
    

    👍



  • Danke für eure Hilfe!
    so ganz verstanden hab ich das ja noch nicht mit den Referenzen, aber ich denke das kommt noch. Hab ich das so richtig verstanden:
    Beispiel: ich habe eine funktion an die ich eigentlich nur zwei Werte übergebe (x und y). aus diesen zwei werten berechne ich mir dann a und b. also etwa so:

    funct(x,y)
    a=3+x;
    b=6*y;

    Wenn ich jetzt aber a und b brauche zum weiterrechnen, kann ich das dann wie folgt lösen?

    funct(&a, &b, x, y)
    ...



  • Ja, wenn du die Werte von x und y nach der Funktion noch brauchst.


Anmelden zum Antworten