Rückgabewerte als Zeiger



  • hallo,

    ich soll ein Programm schreiben, das in der main-Funktion drei Werte einliest. Diese Werte sollen an eine 2. Funktion als Wertparameter übergeben werden.Das Ergebnis sind zwei Werte die dann als Adressparameter zurückgeliefert werden sollen. Mein Problem liegt jetzt darin, das ich keine ahnung habe wie man diese zwei parameter in der main weiter verabeiten kann. Kann mir da jemand helfen. Danke und Gruss Erik



  • Ganz normal wie immer, wo ist das Problem? Du übergibst 3 Wertparameter und die beiden Adressen der Ergebnisparameter, also insgesamt 5 Argumente an Deine Funktion. Dort schreibst Du per Zeigerdereferenzierung die Ergebnisse in die beiden Adressparameter, und voila, in main kannst Du dann ganz normal damit arbeiten.



  • Also ich habe 3 Werte die in der main eingelsen werden und direkt übergeben werden . und erst in der 2.funktion wird mit den werten gerechnet, so das ich als ergebnis der rechnung 2 adressparameter an die main zurückgebe. und wie kann ich dann diese zwei adressparameter über die main als werte asugeben?



  • Hier mal das Programm soweit ich gekommen bin.

    Bei den Fragezeichen hab ich keine ahnung wie ich weiter machen soll.

    #include <stdio.h>
    #include <conio.h>
    #include <math.h>

    double* gleichung(double a,double b,double c);

    double x1=0.0,x2=0.0;

    main()
    {
    double x=0.0,y=0.0,z=0.0;
    double *p;
    double *q;

    printf("Bitte geben Sie drei Zahlen zur Berechnung ein:");
    scanf("%lf %lf %lf", &x,&y,&z);

    ?????=gleichung(x,y,z);

    printf("Das Ergebis fuer x1 und x2 lautet: %.5lf %.5lf \n",*p,*q);
    _getch();

    }

    double* gleichung(double a,double b,double c)
    {
    x1 = (-b+sqrt(pow(b,2.0)- 4.0*a*c))/(2.0*a);

    x2 = (-b-sqrt(pow(b,2.0)- 4.0*a*c))/(2.0*a);

    return &x1;
    return &x2;
    }



  • du kannst nicht 2 werte mit return zurückgeben.
    ich würde eine void draus machen.

    und zwar:

    *p = &x1;
    *q = &x2;
    

    und deine globalen x1 und x2 würde ich ändern auf die pointer *p und *q.
    wobei noch ein kleiner denkfehler meinerseits drinn ist weil du x1 und x2 auch wieder als referenz hast....

    bitte korrigiert mich wenn ich schwachsinn erzähle. so gut bin ich auch nicht. :xmas2:



  • Also ich hab eben mein Programm abgeändert und es funktioniert soweit. Bloß bin ich mir nicht sicher ob das auch die Aufgabenstellung wirklich erfüllt.
    Aber das man mehrere Rückgabewerte zurück liefern kann, bin ich mir fast sicher. Fehlermeldung gab es bezüglich der returns nicht



  • Kane1805 schrieb:

    Aber das man mehrere Rückgabewerte zurück liefern kann, bin ich mir fast sicher.

    aber nicht so wie du's machst. zwei returns direkt hintereinander bewirken, dass das zweite return niemals ausgeführt wird. übrigens noch ein problem: du gibst adressen von lokalen objekten zurück. das compiliert zwar manchmal, funzt aber auch nicht, weil solche objekte nach dem verlassen der funktion keine gültigkeit mehr haben. ihr speicher wird anderweitig wiederverwendet und dein zeiger zeigt plötzlich auf etwas, womit du nie gerechnet hast.

    Kane1805 schrieb:

    Fehlermeldung gab es bezüglich der returns nicht

    schlechter compiler. irgendwas wie 'unreachable code' o.ä. sollte ein guter compiler dabei zu bemängeln haben.
    🙂



  • Die adressen x1 und x2 sind doch global! Oder irr ich mich da?

    Bezüglich der returns geb ich dir recht, das kann nicht funktionieren.



  • Kane1805 schrieb:

    Die adressen x1 und x2 sind doch global! Oder irr ich mich da?

    stimmt, da war ich wohl etwas blind. aber weil's so ist, dann brauchste garnix zurückzugeben.
    🙂



  • Um mehrere Rückgabewerte zu ermöglichen kannst du einen Zeiger auf eine Struktur zurückgeben.

    #include <stdio.h>
    #include <stdlib.h>
    #include <math.h>
    #include <conio.h>
    
    struct Ergebnis
    {
      double x1, x2;
    };
    
    struct Ergebnis *gleichung(double a, double b, double c)
    {
      static struct Ergebnis *ptr = NULL;
      ptr = (struct Ergebnis*) malloc(sizeof(struct Ergebnis));
      ptr->x1 = (-b+sqrt(pow(b,2.0)- 4.0*a*c)) / (2.0*a);
      ptr->x2 = (-b-sqrt(pow(b,2.0)- 4.0*a*c)) / (2.0*a);
      return ptr;
    }
    
    int main(void)
    {
      double x, y, z;
      printf("1. Zahl zum berechnen: ");
      scanf("%lf",&x);
      printf("2. Zahl zum berechnen: ");
      scanf("%lf",&y);
      printf("3. Zahl zum berechnen: ");	
      scanf("%lf",&z);
      struct Ergebnis *erg = gleichung(x,y,z);
      printf("Ergebnis: x1 = %.5lf, x2 = %.5lf\n",erg->x1,erg->x2);
      free(erg);
      erg = NULL;
      getch();
      return EXIT_SUCCESS;	
    }
    

    PS: ALlerdings kommen bei deiner Rechnung keine Zahlen raus... 😕



  • er kann ja auch die 2 zeiger p und q auch global machen und somit die 2te funktion void setzen.
    fakt ist das er bei "call by value" nur einen return hat! somit hat er die möglichkeit es so wie raven es meint mit struct zu machen oder er macht reines reference draus mit globalen zeigern.

    mischformen gehn auch.

    wenn mich wer fragt ist die angabe schlecht formuliert.


Anmelden zum Antworten