Notizia:
  • Rilasciata Precise Pangolin 12.04. Per ottenerla, visitate questa pagina, oppure provate il tour dal vivo con un browser web moderno.
  • Nuovo forum di Ubuntu-it, l'annuncio. È consigliato aggiornare il proprio profilo e controllare la sezione Gruppo Forum per problemi noti.
  • Rilasciata la versione italiana di Precise Pangolin 12.04. Per maggiori informazioni, consultare questa discussione.
  • Il vincitore del Concorso desktop del mese di aprile è Jerico. L'elenco dei precedenti vincitori è qui.
  • È uscito il numero 17 della Newsletter italiana di Ubuntu. Lo trovate a questo indirizzo.
  • È uscito il numero 59 di Full Circle Magazine in italiano. Lo trovate a questo indirizzo.

Pressione di un tasto in C

Linguaggi di programmazione: php, perl, python, C, bash, ecc.

Pressione di un tasto in C

Messaggioda infovobis » domenica 7 maggio 2006, 2:00

Qualcuno di voi sa come capire quando viene premuto un tasto?
l'unica cosa che ho trovato è il comando getchar
che cmq non fa quello che mi interessa perchè non esegue i comandi fino a quando non do invio.
infovobis
Prode Principiante
 
Messaggi: 34
Iscrizione: maggio 2006

Re: Pressione di un tasto in C

Messaggioda ryuujin » domenica 7 maggio 2006, 2:11

infovobis ha scritto:Qualcuno di voi sa come capire quando viene premuto un tasto?
l'unica cosa che ho trovato è il comando getchar
che cmq non fa quello che mi interessa perchè non esegue i comandi fino a quando non do invio.

getchar della libreria stdio.h come hai detto attende la pressione di invio. Questo in parte dipende dalle impostazioni del terminale (cbreak=true).

Ci sono due modi per ottenere quello che vuoi tu: o utilizzando la libreria termios cambi le impostazioni del terminale oppure utilizzi le librerie ncurses (metodo consigliato!! ;) ).

La libreria termios ti permette di cambiare gli attributi del terminale. Per la prima soluzione (abbastanza intricata):
http://www.lilik.it/~mirko/gapil/gapilsu163.html
http://linux.about.com/library/cmd/blcmdl3_termios.htm
Questa libreria introduce una struct con gli attributi del terminale:
01: struct termios {
02:    tcflag_t c_iflag;      /* input modes */
03:    tcflag_t c_oflag;      /* output modes */
04:    tcflag_t c_cflag;      /* control modes */
05:    tcflag_t c_lflag;      /* local modes */
06:    cc_t c_cc[NCCS];      /* control characters */
07:    cc_t c_line;          /* line discipline */
08:    speed_t c_ispeed;      /* input speed */
09:    speed_t c_ospeed;      /* output speed */
10: };
Nel tuo caso gli attributi da modificare sono quelli indicati come input modes

Io ti consiglio di utilizzare le ncurses:
http://www.itis.mn.it/linux/quarta/interfaccia/index.htm ha scritto:Ncurses è la libreria che permette di

    * Usare l'intero schermo come si preferisce.
    * Creare e gestire finestre. Usare 8 colori diversi.
    * Aggiungere il supporto per il mouse ai programmi.
    * Usare i tasti funzione della tastiera.
    * Funzionare su un grande numero di terminali diversi, anche attraverso la rete, fornendo un'interfaccia indipendente dal terminale.



Per una breve guida introduttiva: http://www.itis.mn.it/linux/quarta/inte ... /index.htm

Le ncurses ti permettono di creare interfacce pseudografiche ai tuoi programmi con menu e finestre. Hai presente minicom, kismet, menuconfig del kernel, muse (eheheh modestamente) :P

Se ti serve una mano chiedi ;)
Ultima modifica di ryuujin il domenica 7 maggio 2006, 2:18, modificato 1 volta in totale.
"Chi riceve un'idea da me, ricava conoscenza senza diminuire la mia; come chi accende la sua candela con la mia, riceve luce senza lasciarmi
al buio". - Thomas Jefferson
Avatar utente
ryuujin
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1015
Iscrizione: aprile 2006
Località: Pescara

Re: Pressione di un tasto in C

Messaggioda infovobis » domenica 7 maggio 2006, 2:27

ma non si può fare con le librerie standard dell'ansi c?
anche perchè poi devo dare un esame e nell'esame sono valide solo quelle  :-\
infovobis
Prode Principiante
 
Messaggi: 34
Iscrizione: maggio 2006

Re: Pressione di un tasto in C

Messaggioda ryuujin » domenica 7 maggio 2006, 2:48

infovobis ha scritto:ma non si può fare con le librerie standard dell'ansi c?
anche perchè poi devo dare un esame e nell'esame sono valide solo quelle  :-\

Quello che ti serve, è un comportamento che dipende dall'archietettura dove gira il programma e non penso che tu riesca a risolverslo con gli header standard (segue elenco in basso). Se non erro, in ambiente DOS/WIN la funzione getch() dell'header stdio.h fa al caso tuo, non richiedendo la pressione del tasto invio.

Ma come vedi, tale comportamento non si presenta su altri ambienti. Il C (ANSI) ha una gestione troppo ad alto livello dell'I/O.

Per rendere tale comportamento anche su sistmei POSIX (Linux, ...) l'unica soluzione, a meno che utilizzare librerie come le ncurses, è impostare stdin non bloccante e disabilitare l'eco via termios. La soluzoine non sarà portabile (a meno che nel source non metti degli #ifdef) e richiederà header non standard...  :-\

Cosa ti ha richiesto il professore?

ryuujin :D
"Chi riceve un'idea da me, ricava conoscenza senza diminuire la mia; come chi accende la sua candela con la mia, riceve luce senza lasciarmi
al buio". - Thomas Jefferson
Avatar utente
ryuujin
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1015
Iscrizione: aprile 2006
Località: Pescara

Re: Pressione di un tasto in C

Messaggioda infovobis » domenica 7 maggio 2006, 2:58

ho capito che all'esame farò a meno del menù :)
e che anni fa li facevo con il pascal e pensavo di farli anche con il c ma mi sa che è meglio lasciare stare, anche perchè il tempo è quello che è per svolgere l'esame...
grazie della dritta, sicuramente proverò a realizzarlo qui in locale per motivi di testardagine mia (ormai mi sono impuntato :) )
cmq sotto windows anche la getch() richiede l'invio
infovobis
Prode Principiante
 
Messaggi: 34
Iscrizione: maggio 2006

Re: Pressione di un tasto in C

Messaggioda ryuujin » domenica 7 maggio 2006, 3:01

Codice: Seleziona tutto
[quote="infovobis"]
ho capito che all'esame farò a meno del menù :)
e che anni fa li facevo con il pascal e pensavo di farli anche con il c ma mi sa che è meglio
lasciare stare, anche perchè il tempo è quello che è per svolgere l'esame...

nel pascal immagino che utilizzavi la libreria conio. In parte è identica alle ncurses.
comunque, un menu che attende la pressione di invio funge lo stesso :)

Ma proprio non puoi usare le ncurses? :)

grazie della dritta, sicuramente proverò a realizzarlo qui in locale per motivi di testardagine mia (ormai mi sono impuntato :) )
cmq sotto windows anche la getch() richiede l'invio

ah, ;) ricordavo male

beh, vado a nanna... notte  ;)
Ultima modifica di ryuujin il domenica 7 maggio 2006, 3:03, modificato 1 volta in totale.
"Chi riceve un'idea da me, ricava conoscenza senza diminuire la mia; come chi accende la sua candela con la mia, riceve luce senza lasciarmi
al buio". - Thomas Jefferson
Avatar utente
ryuujin
Entusiasta Emergente
Entusiasta Emergente
 
Messaggi: 1015
Iscrizione: aprile 2006
Località: Pescara

Re: Pressione di un tasto in C

Messaggioda infovobis » domenica 7 maggio 2006, 3:15

ryuujin ha scritto:comunque, un menu che attende la pressione di invio funge lo stesso :)


No il menù come lo voglio fare io funziona solo se alla pressione di un tasto corrisponde una determinata azione istantanea,
praticamente selezioni con le freccete su e giu la voce del menu che vuoi attivare e poi con invio confermi :)

ryuujin ha scritto:Ma proprio non puoi usare le ncurses? :)


No perchè all'esame posso usare solo le librerie standard, ma come ti ho già detto per i fatti miei le userò sicuramente, certo però ci doveva essere uno come te che mi indicava la via erchè io non avevo trovato nulla :)
infovobis
Prode Principiante
 
Messaggi: 34
Iscrizione: maggio 2006


Torna a Programmazione

Chi c’è in linea

Visualizzano questa pagina: Google Feedfetcher e 3 ospiti