While-Schleifen Problem

Manda

Erfahrenes Mitglied
Hallo Leute...Meine while schleife tut nicht wirklich das, was sie tun sollte.
Hier der Code:
C++:
void menu(FILE *out, test_t *ptr)
{
    char auswahl;
    int check = 0;

    do
    {
        system("cls");
        printf("---------- T --------\n");
        printf("\nA - Anzeige");
        printf("\nB - Werte");
        printf("\nC - Schritte");
        printf("\nD - Sonstiges");
        printf("\n\n");
        printf("------------------------------------------");
        printf("\nQ - Beenden des Programms");  
        printf("\n\n");
        printf("------------------------------------------");
        printf("\n\nAuswahl: ");
        fflush(stdin);
        check = scanf("%c", &auswahl);
       
        if(check == 0)
        {
            printf("Falsche Auswahl!\n");
            system("pause");
            system("cls");
        }

        switch(tolower(auswahl))
        {
        case 'a':
                system("cls");
                afunktion(out, ptr);
            break;  
        case 'b':
                system("cls");
                bfunktion(out, ptr);
            break;
        case 'c':
                system("cls");
                cfunktion(out, ptr);
            break;
        case 'd':
                system("cls");
                dfunktion(out, ptr);
            break;
        }
    }
    while(auswahl != 'q');
}

Beschreibung:
Wenn ich das Programm starte, dann auf "q" drücke, wird es richtig beendet.
Gehe ich aber in eine andere Funktion mit "a" und komme anschließend wieder zurück ins Menü, dann muss ich 2x "q" drücken um das Programm beenden zu können.
Wenn ich dann in 2 Funktionen gehe, dann muss ich 3x "q" drücken um es zu beenden, irgendwie komisch.
Ich weis nicht woran das liegt. Vielleicht könnt ihr mir ja helfen.

In den anderen Funktionen, gebe ich erstmal nur etwas aus, drücke dann eine taste (weil ich da ein getch() ) habe und komme anschließend wieder ins menü() zurück.
Dann habe ich eine Funktion wo ich etwas berechne und auch eingaben habe. Auch dort habe ich überall vor einem scanf() ein fflush(stdin) stehen.

Aber ist immer noch dasselbe problem. Beim erstenmal beendet es sofort. Nur wenn ich in eine andere Funktion gehe, dann wieder ins menü() komme, muss ich 2-3x "q" drücken.

Liegt es sonst am getch()?
Danke.

Gruß
Manda
 
Moin Manda,

so auf den ersten Blick fällt mir eigentlich nichts auf!

Hast Du schon mal versucht, das Programm zu debuggen? Das ist immer sehr hilfreich - hier vor allem, was den Wert von "auswahl" angeht! Er scheint ja irgendwie durch Deine Funktionsaufrufe geändert/überschrieben zu werden!

Gruß
Klaus
 
Hi.

Es scheint das sich mit der Zeit der Eingabepuffer füllt.

fflush auf einem Eingabestream aufzurufen ist übrigens undefiniert.

Du könntest aber z.B. erstmal die ganzen Leerzeichen ignorieren:
C:
scanf(" %c", &auswahl);
Gruß
 
Hallo zusammen,

ich rufe in den aufrufenden Funktionen (afunktion usw) menu(..,..) auf, damit versuche ich eigentlich wieder zurück ins menü() zu kommen.
Nehme ich diesen Aufruf raus, dann klappt das beenden ganz normal.
Bsp.:
C++:
void afunktion(FILE *out, test_t *kreis)
{
    kreis->r = 100.00;
    kreis->l = 0.01500000;
    kreis->c = 0.00000180;
    kreis->fmin = 100.00;
    kreis->fmax = 1000.00;
    kreis->schritte = 21;
    out             = stdout;
       
    system("cls");
    fprintf(out, "+++++++++++++++++++++++++++++++++++++++++++++++");
    fprintf(out, "\nSchwingkreisparameter:");
    fprintf(out, "\n+++++++++++++++++++++++++++++++++++++++++++++++");
    fprintf(out, "\nW-wert             : %.2lf", kreis->r);
    fprintf(out, "\nI-wert             : %lf", kreis->l);
    fprintf(out, "\nK-wert             : %lf", kreis->c);
    fprintf(out, "\nUGrenze: %.2lf", kreis->fmin);
    fprintf(out, "\nOGrenze: %.2lf", kreis->fmax);
    fprintf(out, "\nSchritte         : %d", kreis->schritte);   
    fprintf(out, "\n+++++++++++++++++++++++++++++++++++++++++++++++");
   
    getch();
    menu(out, kreis);//HIER KOMME ICH INS MENÜ ZURÜCK       
}

Nehme ich hier dann die letzte Zeile raus, dann klappts. Ich glaub es lag daran.
Aber danke für die Hinweise!

Gruß
Manda
 
Moin Manda,

jau, das ist sein!
Du erstellst ja durch den Aufruf ein neues 'Menü'-Objekt ! ! !

Wie Du schon schreibst: einfach die Zeile rausnehmen, da sollte es klappen, weil Du dadurch an die aufrufende Stelle in Deinem Menü zurückkehrst! Du kommst also zu dem entsprechenden BREAK in Deiner "switch"-Anweisung, beendest dies dadurch und im neuen Durchlauf der while-Schleife kannst Du dann ganz normal die Eingabe 'q' abarbeiten !

[EDIT] Durch deinen erneuten Aufruf erstellst Du quasi ein neues Menü, da mit dem ersten 'q' beendet wird und erst dann beendet das zweite 'q' das ursprüngliche Menü ....

Gruß
Klaus
 
Zuletzt bearbeitet:
Zurück