[Risolto][C] Bug del Terminale

Linguaggi di programmazione: php, perl, python, C, bash e tutti gli altri.
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [Risolto][C] Bug del Terminale

Messaggio da vbextreme »

@zoff, proprio perché ho capito il contesto ho suggerito una "formulina"
output
flush
input
flush
In modo che si ottenga l'output/input voluto.
Con la speranza che tra qualche giorno, quando la scanf fallirà o l'output non sarà uscito si ricordi delle mie parole.

Al mio piccolo gli ho spiegato la differenza del 2 e 4 tempi prima di salire sulla sua "mini" cross, bisogna sapere le differenze se non si vuole cadere!
Poi naturalmente non si seguono sempre i consigli e durante un salto la moto è andata a sinistra e lui a destra a "volo d'angelo".
Easy framework per il linguaggio C.
vbextreme hack your life
Avatar utente
M_A_W_ 1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 856
Iscrizione: venerdì 15 febbraio 2013, 3:57
Desktop: KDE
Distribuzione: SuSE
Sesso: Maschile
Località: Un luogo geometrico
Contatti:

Re: [Risolto][C] Bug del Terminale

Messaggio da M_A_W_ 1968 »

Il nostro Zoff ha fatto delle osservazioni corrette e pregnanti.

Visto l'andamento generale dei forum, alcuni utenti più preparati o più curiosi covano da molto tempo un senso di insoddisfazione e incompletezza. Mancano stimoli interessanti, quelli che a loro volta motivano la partecipazione ai forum e attirano i "risponditori" in grado di risolvere i problemi posti, piccoli e grandi che siano - incluso ovviamente il sottoscritto, che si annoia terribilmente rispetto ai tempi gloriosi di FIDOnet. Questo sicuramente spiega, in buona parte, alcuni recenti eccessi di entusiasmo e la tendenza a generare approfondimenti più o meno OT (di cui assumo appieno la mia parte di responsabilità).

Purtroppo però a volte occorre discernere: se un esercizio banale o una domanda anche semplice posta da utenti più avanzati può stimolare un utile dibattito e creare un OT che alla fine arricchisce il forum, in altri casi l'OP proprio non ha i mezzi per capire più del 10% di quello che viene trattato, e allora non gli stiamo facendo un favore. E' una questione di sensibilità didattica.
D'altro canto, spesso nella discussione che ne scaturisce vengono fornite risposte parziali o non corrette, e quindi in questo modo si richiamano a caduta altre risposte e precisazioni (di solito il sottoscritto interviene proprio a questo punto) destinate più ad altri utenti che all'OP.
Riflettendo, credo che dal punto di vista dell'ordine del forum sarebbe preferibile, in questi casi, gemmare un thread separato quando ci si rende conto che la discussione è andata in orbita rispetto alle capacità di comprensione dell'OP. Questo per non lasciare in giro troppe risposte erronee o incomplete, nell'interesse della qualità del forum e dei futuri lettori, pur senza subissare di informazioni gli OP meno scafati.
Sì, un blog ce l'ho perfino io: gli è che mi manca il tempo...

"...in una società che sembra sempre più spaventata dai problemi troppo articolati e che rigetta come un corpo estraneo ogni elemento di complessità, sapremo ancora come utilizzare il parere degli esperti?"
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Risolto][C] Bug del Terminale

Messaggio da gila75 »

Sul mio manuale è scritto chiaramente che flush(stdin) produce un comportamento indefinito ed è da evitare.
Poi sul fatto che scanf() sià insidiosa, nulla da dire.
Concordo anche sul fatto che l'OP conosce quello, non fgets, non getchar() ecc.. quindi non confondiamogli le idee.
Sono curioso però del flush(stdin)
Avatar utente
vbextreme
Entusiasta Emergente
Entusiasta Emergente
Messaggi: 1214
Iscrizione: domenica 12 gennaio 2014, 14:06
Desktop: lxde
Distribuzione: xubuntu 14.10

Re: [Risolto][C] Bug del Terminale

Messaggio da vbextreme »

come già ripetuto per ben due volte fflush(stdin) funziona solo su windows, su freebsd dovrebbe essere fpurge() e su GNU te la scrivi...
Il libro si ferma sicuramente allo standard senza esporre nient'altro.
Easy framework per il linguaggio C.
vbextreme hack your life
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Risolto][C] Bug del Terminale

Messaggio da gila75 »

come già ripetuto per ben due volte fflush(stdin) funziona solo su windows,
Mi sembrava la proponessi anche per GNU, anche in altri programmi, ma magari mia svista :)
Avatar utente
M_A_W_ 1968
Scoppiettante Seguace
Scoppiettante Seguace
Messaggi: 856
Iscrizione: venerdì 15 febbraio 2013, 3:57
Desktop: KDE
Distribuzione: SuSE
Sesso: Maschile
Località: Un luogo geometrico
Contatti:

Re: [Risolto][C] Bug del Terminale

Messaggio da M_A_W_ 1968 »

gila75 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4819584#p4819584][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
come già ripetuto per ben due volte fflush(stdin) funziona solo su windows,
Mi sembrava la proponessi anche per GNU, anche in altri programmi, ma magari mia svista :)

Codice: Seleziona tutto

void ClearKeyboardBuffer(void) 
{
    register char ch;
    do 
    {
        ch = getchar();
    } while (('\n' != ch) && (EOF != ch));
    /* versione sintetica: while ((ch = getchar() != '\n') && (ch != EOF)); */
}
Questa è l'unica versione "portable" che funziona decentemente un po' su tutti i sistemi PC-alike e con tutti i compilatori mainstream. Ovviamente la register viene semplicemente ignorata sui compilatori "moderni", mentre resta importante con quelli più datati.
Sì, un blog ce l'ho perfino io: gli è che mi manca il tempo...

"...in una società che sembra sempre più spaventata dai problemi troppo articolati e che rigetta come un corpo estraneo ogni elemento di complessità, sapremo ancora come utilizzare il parere degli esperti?"
gila75
Imperturbabile Insigne
Imperturbabile Insigne
Messaggi: 2739
Iscrizione: mercoledì 16 gennaio 2013, 17:28
Desktop: ubuntu-2d
Distribuzione: Ubuntu 12.04.2 LTS i686
Località: Airuno(Lecco)

Re: [Risolto][C] Bug del Terminale

Messaggio da gila75 »

M_A_W_ 1968 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4820018#p4820018][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
gila75 [url=http://forum.ubuntu-it.org/viewtopic.php?p=4819584#p4819584][img]http://forum.ubuntu-it.org/images/icons/icona-cita.gif[/img][/url] ha scritto:
come già ripetuto per ben due volte fflush(stdin) funziona solo su windows,
Mi sembrava la proponessi anche per GNU, anche in altri programmi, ma magari mia svista :)

Codice: Seleziona tutto

void ClearKeyboardBuffer(void) 
{
    register char ch;
    do 
    {
        ch = getchar();
    } while (('\n' != ch) && (EOF != ch));
    /* versione sintetica: while ((ch = getchar() != '\n') && (ch != EOF)); */
}
Questa è l'unica versione "portable" che funziona decentemente un po' su tutti i sistemi PC-alike e con tutti i compilatori mainstream. Ovviamente la register viene semplicemente ignorata sui compilatori "moderni", mentre resta importante con quelli più datati.
Infatti MAW conoscevo anche io quella versione, ma mi pareva, (ripeto pareva) che venisse proposto fflush anche per l'input.
Vero anche per tornare un passo indietro che usando fgets() o getchar e componendo a mano l'input questi problemi diventano molto più rari.
Scrivi risposta

Ritorna a “Programmazione”

Chi c’è in linea

Visualizzano questa sezione: UbuNuovo e 10 ospiti