Zwei Rückgabewerte in einer Funktion



  • Wow, so schnell solche Top-Antworten! Danke an alle!

    DirkB:

    Deine Idee ist natürlich sehr logisch, aber da ich noch einige andere Funktionen zum Programm hinzufügen will, fahre ich mit einer Eingabefunktion die ich in den cases aufrufe besser.

    Danke aber für den Tipp 🙂



  • Du solltest dir aber durchaus überlegen einen int Rückabewert zu nehmen.
    Dort kannst du anzeigen, ob der User überhaupt Werte eingegeben hat.
    Dazu kannst du den Rückgabewert von scanf auswerten.

    Wenn der User Fehleingaben macht (z.B. Buchstaben) musst du Eingabepuffer leeren.
    Dazu kannst du da schauen: http://www.c-plusplus.net/forum/p1146014#1146014



  • das ist eine gute Idee,

    heisst das, dass ich nach dem einlesen der beiden werte über if überprüfe ob es entweder end of file oder escape-sequenz beinhaltet?

    meine Eingabefunktion lautet:

    /* Werte einlesen */
    void werte_einlesen(double *a, double *b)
    {
        printf("Zahl1:\n");
        scanf("%lf", a);
        printf("Zahl2:\n");
        scanf("%lf", b);
    }   // end einlesen_ganz
    

    und es stimmt, bei den Operatoren (durch switch-case und default) wird natürlich eine fehlermeldung bei falscher eingabe zurückgeliefert, aber nicht bei den werten, also wenn da ein buchstabe kommt ist das programm nur verwirrt.



  • scanf liefert als Rückgabewert die Anzahl der gelesenen Parameter zurück.
    (scanf kann mehr als einen Wert auf einmal einlesen)

    if(1!=scanf(%lf",a) {  // Das ist eine Eins
      // Fehlerbehandlung
    }
    


  • das habe ich gerade rausgefunden 😃

    hab jetzt

    /* Werte einlesen */
    void werte_einlesen(double *a, double *b)
    {
        printf("Zahl1:\n");
        if (scanf("%lf", a) != 1)
        {
            printf("FEHLER!\n");
            exit(0);
        }
        printf("Zahl2:\n");
        if (scanf("%lf", b) != 1)
        {
            printf("FEHLER!\n");
            exit(0);
        }
    }   // end werte_einlesen
    

    wie kann ich implementieren, dass ich statt exit(0), also das programm bei falscher eingabe zu beenden, die werteabfrage einfach zu wiederholen? also z.b. bei der eingabe von a ist ja !=1 true, dann soll das programm den wert neu abfragen.



  • braco91 schrieb:

    wie kann ich implementieren, dass ich statt exit(0), also das programm bei falscher eingabe zu beenden, die werteabfrage einfach zu wiederholen? also z.b. bei der eingabe von a ist ja !=1 true, dann soll das programm den wert neu abfragen.

    Mit einer Schleife.



  • /* Funktion LeereEingabepuffer */
    void LeereEingabepuffer()
    {   while (getchar() != '\n');
    }   // end LeereEingabepuffer
    
    void werte_einlesen(double *a, double *b)
    {
    
        printf("Zwei Zahlen eingeben\n");
        if ((scanf("%lf", a) != 1) || (scanf("%lf", b) != 1))
        {
            LeereEingabepuffer();
            printf("FEHLER!\n");
            werte_einlesen(a,b);
    
        }
    }   // end werte_einlesen
    

    mit dieser Eingabefunktion wird jetzt überprüft, ob die beiden eingegebenen Zahlen auch Zahlen sind, wenn nein, dann tritt das if in erscheinung und leert erstmal dein eingabepuffer, gibt FEHLER aus und ruft die Funktion erneut auf, bis Zahlen eingegeben werden.

    TOP 🙂



  • braco91 schrieb:

    mit dieser Eingabefunktion wird jetzt überprüft, ob die beiden eingegebenen Zahlen auch Zahlen sind

    TOP 🙂

    Du überprüfst aber, ob die eingegebenen Zahlen ungleich 1 sind. d.H. du kannst nur 1 eingeben, ansonsten Fehler, oder seh ich das jetzt falsch? 😕



  • marvNN:

    Die Überprüfung mit !=1 überprüft, wenn ich das jetzt richtig verstanden habe nur, ob die Aussage

    ((scanf("%lf", a)
    

    richtig ist, also, ob ein Wert vom Typ %lf eingelesen wurde. Wenn z.b. 'a' eingegeben wird, ist das scanf ja Falsch (weil char -> %c), also im logischen Sinne !=1 bzw. == 0 und somit tritt dann meine Fehlermeldung auf.

    Also das Programm funktioniert einwandfrei, für alle Eingaben von double-Zahlen (%lf), wenn ich für a oder b ein char eingebe, springt er in die Fehlermeldung.



  • Will man mehrere Elemente durch eine Funktion zurückgeben lassen, kann man auch mit Strukturen arbeiten:

    typedef struct {double a,b;} Typ2D;
    
    Typ2D einlesen(void)
    {
      Typ2D x={0};
      printf("1.wert: ");scanf("%lf",&x.a);
      printf("2.wert: ");scanf("%lf",&x.b);
      while( '\n'!=getchar() );
      return x;
    }
    
    int main()
    {
      Typ2D x=einlesen();
      printf("%f %f",x.a,x.b);
      return 0;
    }
    


  • Dankeschön 🙂

    das Forum ist 👍


Anmelden zum Antworten