10 Febbraio, 2012, 01:01:51 *
Benvenuto! Accedi o registrati.
Hai dimenticato l'e-mail di attivazione?

Accesso con nome utente, password e durata della sessione
Notizia: È uscito il numero 55 di Full Circle Magazine in italiano! Lo trovate a questo indirizzo.
 
   Indice   FAQ Aiuto Regolamento Ricerca Accedi Registrati  

Wiki
Programmazione   •   Editor di Testo   •   Linguaggio Bash
Pagine: [1]   Vai giù
  Stampa  
Autore Discussione: Pressione di un tasto in C  (Letto 1631 volte)
0 Utenti e 1 Utente non registrato stanno visualizzando questa discussione.
infovobis
Novello Novizio

Non Connesso Non Connesso

Messaggi: 34

Media messaggi


Mostra profilo WWW
« inserita: 07 Maggio, 2006, 01:00:59 »

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.
Registrato
ryuujin
Entusiasta Emergente
**
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 1.014

Media messaggi


GPG Key ID: 0x08467AFC


Mostra profilo WWW
« Risposta #1 inserita: 07 Maggio, 2006, 01:11:18 »

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!! Wink ).

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:
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/interfaccia/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) Tongue

Se ti serve una mano chiedi Wink
« Ultima modifica: 07 Maggio, 2006, 01:18:26 da ryuujin » Registrato

"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
infovobis
Novello Novizio

Non Connesso Non Connesso

Messaggi: 34

Media messaggi


Mostra profilo WWW
« Risposta #2 inserita: 07 Maggio, 2006, 01:27:50 »

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  Undecided
Registrato
ryuujin
Entusiasta Emergente
**
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 1014

Media messaggi


GPG Key ID: 0x08467AFC


Mostra profilo WWW
« Risposta #3 inserita: 07 Maggio, 2006, 01:48:57 »

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  Undecided
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...  Undecided

Cosa ti ha richiesto il professore?

ryuujin Cheesy
Registrato

"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
infovobis
Novello Novizio

Non Connesso Non Connesso

Messaggi: 34

Media messaggi


Mostra profilo WWW
« Risposta #4 inserita: 07 Maggio, 2006, 01:58:16 »

ho capito che all'esame farò a meno del menù Smiley
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 Smiley )
cmq sotto windows anche la getch() richiede l'invio
Registrato
ryuujin
Entusiasta Emergente
**
Non Connesso Non Connesso

Sesso: Maschio
Messaggi: 1014

Media messaggi


GPG Key ID: 0x08467AFC


Mostra profilo WWW
« Risposta #5 inserita: 07 Maggio, 2006, 02:01:11 »

Codice:
[quote author=infovobis link=topic=23162.msg93024#msg93024 date=1146963496]
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 Smiley

Ma proprio non puoi usare le ncurses? Smiley

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

beh, vado a nanna... notte  Wink
« Ultima modifica: 07 Maggio, 2006, 02:03:00 da ryuujin » Registrato

"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
infovobis
Novello Novizio

Non Connesso Non Connesso

Messaggi: 34

Media messaggi


Mostra profilo WWW
« Risposta #6 inserita: 07 Maggio, 2006, 02:15:23 »

comunque, un menu che attende la pressione di invio funge lo stesso Smiley

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 Smiley

Ma proprio non puoi usare le ncurses? Smiley

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 Smiley
Registrato
Pagine: [1]   Vai su
  Stampa  
 
Vai a: