Pufferspeicher ? ? ? ?



  • Ich möchte bei einem Programm in C eine Eingabe auf die Zeit einbinden.
    Dazu folgende Überlegung (Pseudocode):

    ...
    sleep(1000);
    
    if(Puffer != leer){
         scanf("%c",&var);
         fflush(stdin);
    }
    
    else{
         var = ' ';
    }
    ...
    

    Also wenn im Puffer etwas steht soll das Programm die Eingabe ausführen, wenn nicht nicht.

    Wenn diese Variante nicht möglich ist hoffe ich auf andere Lösungsmöglichkeiten.

    Heeelft mir! 😞 😞 😞
    Danke im voraus 😉



  • Ich versuche mal zu verstehen.

    Du möchtest, dass der Benutzer eine gewisse Zeit für eine Eingabe hat.
    Wenn die Zeit verstrichen ist, soll das Programm weiter laufen und eine vorhandene Eingabe auswerten.

    Soweit richtig?



  • Ja...genau so.. 👍



  • junkerjoerg schrieb:

    Ja...genau so.. 👍

    Dann sag das doch.

    Es ist besser dein eigentliches Problem zu lösen, als das Problem mit deiner Lösung.

    Das geht mit Standard-C nicht und ist somit Systemabhängig.

    Wenn du uns dein System nennst, verschiebt evtl. ein Moderator den Thread ins entsprechende Unterforum.
    Dort kann dir besser geholfen werden (ich kann es leider nicht).



  • [Vermutung]
    Kommt mir grad so bekannt vor.
    Wann lernen Lehrer endlich in ihren Aufgaben keine Vorgaben zu machen die man nicht sinnvoll mit Standardmitteln umsetzen kann? *grumpf*
    [/Vermutung]

    @junkerjoerg
    Geht leider nicht. Nicht mit C Standardmitteln. Wenn du eine Lösung suchst die unter Linux funktioniert kannst du mal hier gucken:

    http://stackoverflow.com/questions/3317740/checking-data-availability-before-calling-stdgetline
    (Die Variante mit poll und STDIN_FILENO ).

    Wobei es mich nicht wundern würde wenn selbst diese nicht portierbare Lösung noch problematisch wäre.

    Für Windows kann man ähnliches mit WaitForSingleObject machen. Nur dummerweise funktioniert das dann nicht mehr sobald der Input-Stream z.B. in ein File umgeleitet wurde.



  • hustbaer schrieb:

    Für Windows ...

    siehe hier:
    https://www.c-plusplus.net/forum/337498



  • Ja, danke, hab den Thread nicht mehr gefunden.
    Ist aber eben wie erwähnt nicht unproblematisch.

    ps: Dürfen stdin/stdout eigentlich gepuffert sein? Dann gäbe es nämlich gleich das nächste Problem...



  • "Pufferspeicher" - reduntant?!



  • Wenn der Input-Stream aus einem File kommt, macht das Vorgehen ja nicht wirklich Sinn. Es ist doch meiner Meinung nach konkret auf das manuelle Arbeiten an einer Konsole zugeschnitten?!



  • hustbaer schrieb:

    [Vermutung]
    Kommt mir grad so bekannt vor.
    Wann lernen Lehrer endlich in ihren Aufgaben keine Vorgaben zu machen die man nicht sinnvoll mit Standardmitteln umsetzen kann? *grumpf*
    [/Vermutung]

    @junkerjoerg
    Geht leider nicht. Nicht mit C Standardmitteln. Wenn du eine Lösung suchst die unter Linux funktioniert kannst du mal hier gucken:

    http://stackoverflow.com/questions/3317740/checking-data-availability-before-calling-stdgetline
    (Die Variante mit poll und STDIN_FILENO ).

    Wobei es mich nicht wundern würde wenn selbst diese nicht portierbare Lösung noch problematisch wäre.

    Für Windows kann man ähnliches mit WaitForSingleObject machen. Nur dummerweise funktioniert das dann nicht mehr sobald der Input-Stream z.B. in ein File umgeleitet wurde.

    Poste doch mal was funktioniert. Und labere nicht solches halbwissen raus...


  • Mod

    grumpf schrieb:

    Poste doch mal was funktioniert. Und labere nicht solches halbwissen raus...

    Du bist lustig. Er hat doch gerade gesagt, dass es nicht geht, die (vermutlichen) Vorgaben aus der Aufgabe umzusetzen, weswegen die Aufgabe dumm gestellt ist (sofern sie wie vermutet lautet).



  • Wie kommt dieser Thread auf > 6.000 Klicks?



  • Ist scheinbar ne große Klasse...



  • ich mach dir mal nen non-standard ansatz kumpel
    ist als anregung gedacht
    guckst du hier:

    #include <conio.h>
    #include <stdio.h>
    #include <time.h>
    int eingabe_erfolgt = 0;
    double zeit_fuer_eingabe = 60; // 60 Sekunden Zeit für Eingabe vom us0r
    time_t start_t, end_t;
    time(&start_t);
    
    do
    {
        if(eingabe_erfolgt = _kbhit())
            break;
        time(&end_t);    
    
    }while(zeit_fuer_eingabe < difftime(end_t, start_t))
    
    if(eingabe_erfolgt)
    {
    // a-haaaaaahh, es wurde was eingegeben
    }
    

    die verstrichene zeit kannsu mit difftime ermitteln
    http://www.tutorialspoint.com/c_standard_library/c_function_difftime.htm
    hier noch ein paar infos zu kbhit
    https://msdn.microsoft.com/de-de/library/58w7c94c.aspx
    🙂


Log in to reply