Wie gibt eine Funktion zwei Werte aus?



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


Anmelden zum Antworten