While-Schleifen Problem



  • Hallo Leute...Meine while schleife tut nicht wirklich das, was sie tun sollte.
    Hier der Code:

    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.

    Danke.

    Gruß
    Manda



  • Wenn du deine Funktionen (afunktion usw.) nicht aufrufst, klappt es jedenfalls. Was also passiert in diesen Funktionen?



  • das liegt eventuell daran das q mit scanf abgefragt wird und while das erst am ende überprüft ob q gedrückt worden is, deswegen die verzögerung eventuell.



  • aXYZn schrieb:

    das liegt eventuell daran das q mit scanf abgefragt wird und while das erst am ende überprüft ob q gedrückt worden is, deswegen die verzögerung eventuell.

    Wieso? Die Eingabe findet statt, und im Anschluss wird (im Fuß der Schleife) die Abbruchbedingung geprüft. Fußgesteuert ist natürlich auch sinnvoll, da vor der ersten Überprüfung schließlich erstmal eine Eingabe stattfinden muss. Das passt schon...



  • machmal richtig puffer leer nach jedem scanf.



  • lkklk schrieb:

    machmal richtig puffer leer nach jedem scanf.

    Hab ich direkt am Anfang gesagt, irgendein lustiger Mod hat's aber gelöscht... 🙄 😕



  • Also 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 erstmal 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()?



  • MandaJohn schrieb:

    ... dort habe ich überall vor einem scanf() ein fflush(stdin) stehen.

    ich meine richtig leer machen. nicht dieses fflush undefiniert-verhalten ding!



  • Kannst du mir das "richtig leer machen " mal erklären? Also ich kenn das nur mit fflush(stdin).
    Kannst du mir deine andere Variante mal sagen?



  • fflush(stdin) sollte man nicht nehmen. Warum das so ist und eine Möglichkeit zum Puffer leeren, steht hier :
    http://www.c-plusplus.net/forum/viewtopic-var-t-is-39349.html

    Wurde jedoch noch kein Zeichen eingegeben, geht die dort gepostete while-Schleife in eine Endlosschleife über!

    Meine Lieblingsvariante zum Pufferleeren ist die hier:

    // clear buffer
    void cb() 
    {
    	setvbuf(stdin,NULL,_IONBF,0);
        setvbuf(stdin,NULL,_IOFBF,BUFSIZ);
    }
    

    Gruß,
    B.B.



  • Rufst Du vielleicht "menu ()" aus den anderen Funktionen direkt auf ?



  • Wenn ich menü aufrufe gebe ich schon zwei parameter mit, oder hab ich deine Frage falsch verstanden?

    EDIT: @B.B du meinst sicherlich, dass ich vor jedem scanf() die folgenden zeilen einfüge oder?

    setvbuf(stdin,NULL,_IONBF,0);
    setvbuf(stdin,NULL,_IOFBF,BUFSIZ);



  • MandaJohn schrieb:

    Nur wenn ich in eine andere Funktion gehe, dann wieder ins menü() komme, muss ich 2-3x "q" drücken.

    Poste mal die Stelle, wie Du aus der anderen Funktion zurück ins Menu kommst. Es darf kein direkter Aufruf sein.



  • 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, schwingkreis);//HIER KOMME ICH INS MENÜ ZURÜCK		
    }
    


  • afunktion wurde bereits von menu aufgerufen. Wenn Du innerhalb der afunktion menu noch einmal aufrufst, dann brauchst Du 2x'q' um da wieder rauszukommen. Streiche den Aufruf von menu in der afunktion.



  • Ah jetzt gehts. Danke für den Hinweis!
    Ich hab das zurückkehren ins menü() auch in anderen Funktionen, deswegen gings wahrscheinlich nicht.
    Ich nehme es mal raus.

    Danke!

    Gruß
    Manda


Anmelden zum Antworten