Wie gibt eine Funktion zwei Werte aus?



  • Moin allerseits!
    Ich habe für ein Programm eine Funktion geschrieben, die für gewisse Fälle (die ich durch if/else abgegrenzt habe) zwei Werte berechnen soll, die ich dann in der main-Funktion abrufen kann. Für einen Wert hatte ich bisher einfach die Schreibweise

    return (Formel etc.);
    

    Kann ich diesen Befehl nun bei zwei auszugebenden Werten einfach zwei mal untereinander schreiben und dann mit der jeweils richtigen Formel?

    Vielen Dank im Voraus!



  • Man mag mich engstirnig nennen, aber ich habe dein Problem nicht wirklich begriffen^^ Vielleicht erklärst du es noch mal etwas genauer für mich? 😃



  • Man kann innerhalb einer Funktion mehrfach ein return angeben. Direkt untereinander natürlich nicht, da das 2. return natürlich sonst nicht ausgeführt wird:

    // wird ausgefuehrt und beendet funktion
    return a+b;
    // wird nicht mehr ausgefuehrt
    return a*b;
    
    //ABER:
    if(...)
        return a+b;
    else
        return a*b;
    
    // Oder aber du speicherst das Ergebnis irgendwo zwischen und gibst immer dieses zurueck.
    


  • Wenn du doch eh schon zwei versch. Werte berechnest, dann gib die doch gleich zurück, also in dem if-else Konstrukt.

    Ansonsten halt so:

    if (blabla){
    
    return (fall1);
    
    } else {
    
    return (fall2);
    }
    


  • MGer schrieb:

    Kann ich diesen Befehl nun bei zwei auszugebenden Werten einfach zwei mal untereinander schreiben und dann mit der jeweils richtigen Formel?

    Nein, eine Funktion kann nicht mehr als einen Wert zurückgeben. Was Du machen kannst, ist Deine Ergebnisse in eine Struktur zu packen, und diese zurückzugeben:

    struct ergebnis
    {
    int wert1;
    int wert2;
    };

    ...

    struct ergebnis result;
    result.wert1 = 5;
    result.wert2 = 10;

    return result;



  • Alternativ:

    void bla(int* p1, int* p2)
    {
      // ..
      *p1 = /*ein Wert*/;
      *p2 = /*ein Wert*/;
    }
    


  • Ich will es mal der Übersichtlichkeit halber konkretisieren:

    double Formel (double a,double b,double c)
    {
    	double p,q;
    	if (a!=0)
    	{
    		p=b/a;
    		q=c/a;
    		if (q<=((p*p)/4))
    		{
    			return -(p/2)+(sqrt((p*p)/4)-q);
    			return -(p/2)-(sqrt((p*p)/4)-q);
    		}
    		else 
    		{
    			return -(p/2)+(sqrt(q-((p*p)/4)));
    			return -(p/2)-(sqrt(q-((p*p)/4)));
    		}
    	}
    	else
    	{
    		if (b!=0)
    		{
    			return -(c/b);
    		}
    		else
    		{
    			return x;
    		}
    	}
    }
    

    Also für den Fall, dass a ungleich 0 und q kleiner gleich p²/4, möchte ich z.B., dass er die Werte -(p/2)+(sqrt((p*p)/4)-q) und -(p/2)-(sqrt((p*p)/4)-q) herausgibt. Wenn es mit dem zweifach hintereinander geschriebenen return nicht funktioniert, ist es hier natürlich dann noch falsch im Code, aber ich denke, man sieht, was ich möchte 😉



  • Wie gesagt, Rückgabe von mehr als einem Wert geht nicht. Entweder Du packst die Ergebnisse in eine Struktur, siehe oben, oder Du definierst die Ergebnisvariablen in der aufrufenden Funktion, und übergibst Zeiger auf diese Variablen, siehe Post von Vicious Falcon.



  • Ich würde einen Pointer auf eine Struktur mit allen erforderlichen Ergebnissen und einen integer Rückgabewert der anzeigt wie die Ergebnisse in der Struktur zu interpretieren sind empfehlen.



  • Du kannst aber auch Call-by-Reference benutzen, also die Adresse der Variablen übergeben (so wie bei scanf).

    int Formel (double a,double b,double c, double *wert1, double *wert2)
    

    In der Funktion selber schreibst du dann statt dem return z.B.:

    *wert1 = -(p/2)+(sqrt((p*p)/4)-q);
    *wert2 = -(p/2)-(sqrt((p*p)/4)-q);
    return 0; // alles ok
    

    Mit return kannst du dann zurückgeben ob der Vorgang erfolgreich war oder nicht.



  • Dankeschön! Damit kann ich was anfangen 🙂



  • Hier stand mal C++ Code...



  • Ist das denn C99?

    int Formel (double a,double b,double c, double& Out_wert1, double& Out_wert2)
    

    (Ich habe gerade gesucht und keinen Hinweis gefunden 😕 )



  • DirkB schrieb:

    Ist das denn C99?

    Aber natürlich nicht. Weiss Gott, was das sein soll.



  • JaykopX schrieb:

    int Formel (double a,double b,double c, double& Out_wert1, double& Out_wert2)
    

    Was sehe ich da? Ich glaube mit diesem Code bist du hier falsch.



  • Japp war natürlich falsch :D. Kann ja mal vorkommen. Jetzt bitte kein C/C++ Krieg...


Log in to reply