Visualizzazione dei risultati da 1 a 10 su 17

Hybrid View

  1. #1
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Per la pulizia del buffer occorre quindi un idioma specifico, come il seguente.

    codice:
    void kbd_clean(void)
    {
        register char ch;
        do 
        {
            ch = getchar();
        } while (('\n' != ch) && (EOF != ch));
        /* 
        ** Alternativamente, piu' in sintesi: 
        ** while ((ch = getchar() != '\n') && (ch != EOF));
        */
    }
    Le funzioni unbuffered, come getch(), non hanno questo genere di problemi e restituiscono direttamente il primo tasto premuto.
    Non accedono ad alcun buffer interno e non richiedono la pressione di tasti specifici. Nulla di particolarmente esotico.
    Quindi se ho capito bene quando questo codice viene eseguito e si arriva sulla getchar il controllo passa al sistema operativo e non ritorna fintanco che non premiamo enter, una volta premuto enter la getchar preleva a uno a uno i caratteri dal buffer e li inserisce nella variabile ch.
    Però quello che non capisco è:
    Tratto da Programmare in c:
    Alcune funzioni dispongono di un buffer dove il sistema operativo memorizza tutti i caratteri finchè l'utente non preme invio per inviarli al flusso stdin. Altre sono prive di buffer, quindi ogni carattere è inviato a stdin non appena viene premuto il tasto corrispondente.

    Che significa inviare al flusso di stdin,cioè dal buffer passano al flusso di stdin e dopo vengono letti dal programma?

  2. #2
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    Però quello che non capisco è:
    Tratto da Programmare in c:
    Alcune funzioni dispongono di un buffer dove il sistema operativo memorizza tutti i caratteri finchè l'utente non preme invio per inviarli al flusso stdin. Altre sono prive di buffer, quindi ogni carattere è inviato a stdin non appena viene premuto il tasto corrispondente.

    Che significa inviare al flusso di stdin,cioè dal buffer passano al flusso di stdin e dopo vengono letti dal programma?
    La scelta fraseologica di codesto testo (probabilmente tradotto) lascia davvero a desiderare. Ciò che avviene, molto grossolanamente, si può descrivere nel modo seguente: il flusso di tasti che costituisce lo stdin viene "travasato" nel buffer di cui sopra, e da lì - alla pressione di ENTER - viene poi reso disponibile a funzioni come getchar().

    In realtà qui dovremmo anche sviscerare il concetto nativo di unix, e quindi del C originale, secondo cui "everything is a file", ma ritengo realmente inutile complicare la trattazione in questo momento.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  3. #3
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    La scelta fraseologica di codesto testo (probabilmente tradotto) lascia davvero a desiderare. Ciò che avviene, molto grossolanamente, si può descrivere nel modo seguente: il flusso di tasti che costituisce lo stdin viene "travasato" nel buffer di cui sopra, e da lì - alla pressione di ENTER - viene poi reso disponibile a funzioni come getchar().

    In realtà qui dovremmo anche sviscerare il concetto nativo di unix, e quindi del C originale, secondo cui "everything is a file", ma ritengo realmente inutile complicare la trattazione in questo momento.
    in poche paroler il contenuto del buffer non viene spostato nello stdin ma il contrario?

  4. #4
    Quote Originariamente inviata da linux_r Visualizza il messaggio
    in poche paroler il contenuto del buffer non viene spostato nello stdin ma il contrario?
    Il banale concetto sotteso è che le funzioni come getchar() prelevano il loro input dal buffer e lo mettono a disposizione del programma. Tutto qui...
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  5. #5
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Il banale concetto sotteso è che le funzioni come getchar() prelevano il loro input dal buffer e lo mettono a disposizione del programma. Tutto qui...
    mmmm ok pero cosi comunque non mi resta chiara la frase del libro . inoltre in una slide fa vedere proprio che dal buffer i dati vengono inseriti nel flusso collegato allo stdin


    Qui le slide di cui ti parlavo
    Ultima modifica di linux_r; 10-05-2014 a 00:05

  6. #6
    Codesto testo (Deitel?) finisce per confonderti solo le idee, specialmente a causa della traduzione piuttosto approssimativa.

    Il buffer al quale si riferiscono le slide che hai referenziato è il buffer di tastiera gestito dal BIOS (nei PC standard trattasi di una coda circolare gestita tramite due puntatori nell'area dati del BIOS) che sta a monte dello standard input, in quella lunga catena della quale si accennava sopra.

    Viceversa, il buffer della getchar() è un buffer interno alla libreria di runtime: come ogni buffer di tale categoria, è qualcosa che si frappone tra il file di input (in questo caso stdin, che è comunque un "file" per il sistema operativo e per il linguaggio C) e il programma stesso. In definitiva, si parla di due distinti buffer, con meccanismi di gestione diversi, a carico di entità ben distinte.

    Ribadisco, per maggior chiarezza: quando si parla di buffered input per le funzioni di libreria come getchar(), ci si riferisce al buffer interno alla libreria e in particolare alla necessità di terminare ciascun input con ENTER.
    • Un plauso a Grisha Perelman, raro esempio di genuino anticonformismo umano e scientifico.

  7. #7
    Utente di HTML.it
    Registrato dal
    Jan 2014
    Messaggi
    305
    Quote Originariamente inviata da M.A.W. 1968 Visualizza il messaggio
    Codesto testo (Deitel?) finisce per confonderti solo le idee, specialmente a causa della traduzione piuttosto approssimativa.

    Il buffer al quale si riferiscono le slide che hai referenziato è il buffer di tastiera gestito dal BIOS (nei PC standard trattasi di una coda circolare gestita tramite due puntatori nell'area dati del BIOS) che sta a monte dello standard input, in quella lunga catena della quale si accennava sopra.

    Viceversa, il buffer della getchar() è un buffer interno alla libreria di runtime: come ogni buffer di tale categoria, è qualcosa che si frappone tra il file di input (in questo caso stdin, che è comunque un "file" per il sistema operativo e per il linguaggio C) e il programma stesso. In definitiva, si parla di due distinti buffer, con meccanismi di gestione diversi, a carico di entità ben distinte.

    Ribadisco, per maggior chiarezza: quando si parla di buffered input per le funzioni di libreria come getchar(), ci si riferisce al buffer interno alla libreria e in particolare alla necessità di terminare ciascun input con ENTER.
    ok almeno questo mi é chiaro. ma in breve quello che succede e che il progrAmma si sospende quando invoco getchar, i tastinpremuti vengono caricati dal buffer della tastiera(quello doppia coda circolar) allo stdin e dallo stdin la getchar li legge e li mette nel proprio buffer e li fornisce al programma??
    potresti spoegarmi a grosse linee il procedimento ? grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2026 vBulletin Solutions, Inc. All rights reserved.