zwei Rückgabewerte bei einer Funktion



  • Hi,

    zuerst ein mal ein frohes neues Jahr 2008.
    Ich schreibe gerade ein Programm und habe eine Frage bezüglich einer Funktion. Wenn ich nur eine Funktion besitze, aber zwei Rückgabewerte habe, wie kann ich diese auf ein mal ausführen?
    Mein Programm(das ist nur zum Vorführen, nicht das Richtige Programm) besitzt eine Funktion berechnung, diese hat zwei Rückgabewerte (wert1 und wert2). In dem Main Programm will ich diese beiden Rückgabewerte anzeigen lassen.

    #include <stdio.h>
    
    int berechnung(int wert);
    
    int main()
    {
    	int wert, wert1, wert2;
    	printf("Bitte Wert eingeben:");
    	scanf("%d", &wert);
    
    	printf("Der Wert1 betraegt %d, der Wert2 betraegt %d", berechnung(wert), berechnung(wert));
    
    return 0;
    }
    
    int berechnung(int wert)
    {
    	int wert1, wert2;
    
    	wert1=wert*2;
    	wert2=wert*4;
    
    	return (wert1, wert2);
    }
    

    cu,
    shm



  • z.b. über pointer

    void berechnung (int wert, int *ret1, int *ret2)
    {
        *ret1 = wert*2;
        *ret2 = wert*4;
    }
    ...
    int wert, wert1, wert2;
    ...
    berechnung (wert, &wert1, &wert2);
    ...
    

    🙂



  • berechnung(wert) muss in jedem Fall das gleiche ergeben wie berechnung(wert), wenn sich die Randbedingungen nicht ändern.

    In C kann man nur "naive" Dinge zurückgeben, nicht aber sequentielle Dinge wie (wert1, wert2). Man kann auch on-the-fly keine Listen oder dgl. erzeugen.

    Als Ausweg bietet sich an, Zeiger zu verwenden, weil Zeiger in meinem Sinne naiv sind. Da bleiben grundlegend 2 Möglichkeiten:

    1.) Der Funktion gar keine Werte mitgeben, sondern nur Zeiger auf die Werte. Mit den Zeigern kann man den Speicherbereich der Werte verändern.

    2.) Ein "sequentielles" Ding (Array, Struktur udgl.) in der Funktion erzeugen und einen Zeiger darauf zurückgeben. (Wobei man darauf achten muss, dass der Speicherbereich reserviert bleibt).

    Variante im Sinne von 1.:

    int berechnung(int wert, int *wert1, int *wert2)
    {
        *wert1=wert*2;
        *wert2=wert*4;
        return 42;
    }
    

    Variante im Sinne von 2.:

    int *berechnung(int wert)
    {
        static int werte[2];
        werte[0] = wert*2;
        werte[1] = wert*4
        return werte;
    }
    


  • Als bessere Alternative bietet sich ein eigener Datentyp (Struktur) an:

    typedef struct
    {
      int wert1, wert2;
    } Daten;
    
    Daten berechnung(int wert)
    {
      Daten daten;
    
      daten.wert1 = 2*wert;
      daten.wert2 = 4*wert;
    
      return daten;
    }
    
    int main()
    {
      Daten daten = berechnung (42);
    
      printf("%d %d\n", daten.wert1, daten.wert2);
    }
    

    Edit: Besser so?



  • Th schrieb:

    Datas;

    mach das 's' wech.
    🙂



  • cheopz schrieb:

    int *berechnung(int wert)
    {
        static int werte[2];
        werte[0] = wert*2;
        werte[1] = wert*4
        return werte;
    }
    

    Das würde ich jetzt aber total ablehnen.
    Bei einem zweiten Aufruf von berechnung wird dadurch
    auch das Ergebnis eines ersten Aufrufs verändert.



  • und es ist außerdem nicht threadsicher. Eine static variable zu benutzen, sollte man nur in den seltensten Fällen tun. Am besten man bekommt das Array per Zeiger.



  • Hi !
    Für dein Beispiel brauchst du in deiner Funktion einfach nur einen Parameter mehr:

    int berechnung( int wert, int faktor )
    {
        return wert * faktor;
    }
    

    Der Aufruf in main ist dann z.B. entsprechend:

    printf("Der Wert1 betraegt %d, der Wert2 betraegt %d", berechnung(wert,2), berechnung(wert,4));
    

    🙂


Anmelden zum Antworten