c,c++ - intercettare i caratteri dalla tastiera

Forum dedicato alla programmazione.

Moderatore: Staff

Regole del forum
1) Citare in modo preciso il linguaggio di programmazione usato.
2) Se possibile portare un esempio del risultato atteso.
3) Leggere attentamente le risposte ricevute.
4) Scrivere i messaggi con il colore di default, evitare altri colori.
5) Scrivere in Italiano o in Inglese, se possibile grammaticalmente corretto, evitate stili di scrittura poco chiari, quindi nessuna abbreviazione tipo telegramma o scrittura stile SMS o CHAT.
6) Appena registrati è consigliato presentarsi nel forum dedicato.

La non osservanza delle regole porta a provvedimenti di vari tipo da parte dello staff, in particolare la non osservanza della regola 5 porta alla cancellazione del post e alla segnalazione dell'utente. In caso di recidività l'utente rischia il ban temporaneo.
Rispondi
Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

c,c++ - intercettare i caratteri dalla tastiera

Messaggio da ccts2002 »

inaguro, per quanto mi riguarda, questa sezione....
domandona c o c++...
come si fa, o cosa dovrei leggere, per poter creare un programma che legga i caratteri da tastiera, ma non li scriva sul monitor? per capirci, un qualcosa tipo quando digitiamo la password da shell, che la password viene letta, ma non scritta sul terminale...
e anche...come si fa a leggere i caratteri man mano che vengono scritti e non solo dopo aver digitato invio? in windows mi pare ci sia il comando getch...della libreria conio.h...in linux?
grazie mille!!!

ciaooo

Avatar utente
JohnnyMnemonic
Staff
Staff
Messaggi: 2733
Iscritto il: dom 5 set 2004, 0:00
Nome Cognome: Giuseppe Palmiotto
Slackware: 14.0
Kernel: 3.5.5-thanatos
Località: Bologna
Contatta:

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da JohnnyMnemonic »

Puoi avere le prime indicazioni dalla pagine di man, prova con

Codice: Seleziona tutto

man getc
o

Codice: Seleziona tutto

man getch
Opportunamente combinati con un while puoi fare tutto quello che ti serve

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da Blizzard »

grossa come cosa!

la getch mi sta comodissima nello sviluppo di un gioco!!!!!!!
Prima quando ero su Winpoz utilizzavo la GetAsyncKeyState per fetchare le informazioni dei tasti premuti... e da li mi creavo la classe di gestione dell'input ecc! ma su linux tu pensa che non avevo trovato ancora una funzione sostitutiva e in alcuni forum si sfociava addirittura nell'assembly :P

ciao
Gio

Avatar utente
gallows
Staff
Staff
Messaggi: 3470
Iscritto il: lun 20 set 2004, 0:00
Slackware: 64-current
Kernel: 5.10.7
Località: ~/
Contatta:

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da gallows »

Non c'è bisogno di scomodare le ncurses.
Ecco come puoi fare:

Codice: Seleziona tutto

#include <termios.h>

char* f(void)
{
    struct termios tty;
    tcflag_t old;
    /* etc... */

    tcgetattr(STDIN_FILENO, &tty);
    old = tty.c_lflag;
    tty.c_lflag &= ~ECHO;
    tcsetattr(STDIN_FILENO, TCSANOW, &tty);                                                 

/* ... prendi la stringa dallo stdin ...*/

    tty.c_lflag = old;
    tcsetattr(STDIN_FILENO, TCSANOW, &tty);

   return s;
}
Dai un'occhiata a `man termios.h'

Per leggere "un carattere alla volta" è un po' più laborioso senza ncurses, ma si può fare.

Avatar utente
nuitari
Linux 3.x
Linux 3.x
Messaggi: 777
Iscritto il: dom 14 ott 2007, 12:51
Slackware: 12.0
Località: San Colombano al Lambro
Contatta:

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da nuitari »

Ma per quanto riguarda lo sviluppo dei videogames, le SDL non avevano qualcosa di apposito?

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da Blizzard »

si! infatti avevo visto che le sdl avevano funzioni simili... tuttavia lavorando con irrlicht di base non avevo bisogno di SDL, quindi avrei dovuto utilizzarle solo per quello scopo e il gestore di input di irr non mi piaceva molto.
Penso che ncurses sia comunque più diffusa e rapidamente utilizzabile delle SDL... altrimenti avrei utilizzato quelle.
Sto pensando in questi giorni di realizzare uno di quei picchiaduro a scorrimento orizzontale... (è solo una bozza di idea... ma va sempre più concretizzandosi)... quindi volevo creare di base codice portabile... ora irrlicht è perfettamente portabile... e SDL se non sbaglio pure.
Anche se adesso vorrei valutare anche l'alternativa ncurses per quanto riguarda la versione linux.
In questo caso rimanderei a delle define il compito di compilare con le funzioni ncurses o con le funzioni di windows.h
Devo decidere bene il da farsi

ciao
Gio

Avatar utente
nuitari
Linux 3.x
Linux 3.x
Messaggi: 777
Iscritto il: dom 14 ott 2007, 12:51
Slackware: 12.0
Località: San Colombano al Lambro
Contatta:

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da nuitari »

Vai di SDL, promuoviamolo. Tutti ad impazzire dietro a ste DirectX..

Avatar utente
Blizzard
Master
Master
Messaggi: 1509
Iscritto il: mar 2 gen 2007, 22:53
Nome Cognome: Giovanni Santostefano
Slackware: 12.2
Kernel: 2.6.27.7-smp
Desktop: Fluxbox
Contatta:

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da Blizzard »

ciao...
forse hai ragione! Comunque per quello che mi riguarda... anche se ho sempre ritenuto le DX un buon prodotto uscito da quella bettola ho sempre sostenuto la superiorità delle OpenGL (sono anche più divertenti da usare :badgrin: )
e chiamo il testimone a deporre:
"Fate entrare John Carmack!" :badgrin: :badgrin: :badgrin:

Comunque a parte gli scherzi ho sempre pensato di documentarmi un po più seriamente sulle SDL... anche perchè oltre a fornire un ottimo binding tra il window handler e il device context delle OGL contiene anche un ottimo sistema di renderig... e dato che per il prossimo gioco si parla di 2D :-k forse è la volta buona!

ciao
Gio

Avatar utente
ccts2002
Linux 1.x
Linux 1.x
Messaggi: 155
Iscritto il: gio 9 nov 2006, 23:20
Località: milano - trieste - catania
Contatta:

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da ccts2002 »

ciao,
vi spiego meglio quello che mi interessa...forse dovevo farlo prima...
ho un programmino in c++, e come interfaccia da riga di comando un serie di domande del tipo:

Codice: Seleziona tutto

se vuoi A premi 1;
se vuoi B premi 2;
...
volevo modificare un pò la cosa inserendo nel programma una piccola shell...del tipo gnuplot, octave, etc...in modo da rendere la cosa più "figa" (ma anche per vedere come si fa...) e magari inserire anche l'utilizzo del tab, in modo che con la pressione del tab si completi il comando.
creare una "shell" che interpreti il comando, non è difficile, basta una serie di if (la cosa più semplice, poi la si può migliorare...), il problema mi si è posto con il tab...riesco a fargli completare il comando, ma solo dopo aver premuto invio...in più resta a schermo il carattere di tabulazione e la fine del comando risulta su un'altra riga...
la soluzione è intercettare il tasto premuto, non stamparlo a video subito, analizzarlo e vedere se è un tab o qualcos'altro e casomai stamparlo...per questo chiedevo come si fa a non stampare il carattere a video e a leggere un carattere alla volta prima del newline...
non ho ancora avuto la possibilità di provare quello che mi avete suggerito, ma spero di farlo al più presto.
ogni aggiunta in più sarà ben accetta!!!

grazie mille!! :D :D :D :D

Avatar utente
gallows
Staff
Staff
Messaggi: 3470
Iscritto il: lun 20 set 2004, 0:00
Slackware: 64-current
Kernel: 5.10.7
Località: ~/
Contatta:

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da gallows »

Se devi fare una shell allora sì, usa le ncurses. Non a caso tutte le shell sono linkate ad essa.

Avatar utente
Calzo
Linux 1.x
Linux 1.x
Messaggi: 112
Iscritto il: sab 6 ott 2007, 22:21
Slackware: 10.2 | 13
Desktop: Fluxbox | KDE
Località: MN

Re: c,c++ - intercettare i caratteri dalla tastiera

Messaggio da Calzo »

nuitari ha scritto:Ma per quanto riguarda lo sviluppo dei videogames, le SDL non avevano qualcosa di apposito?
Si. Notavo infatti questo pdf e in generale tutto il documento presente in http://sisinflab.poliba.it/coppi/graphics/

In engine2.pdf viene descritto proprio come rilevare l'evento (anche multiplo) di pressione di più tasti in modo non interruttivo. Cosa che è diversa dall'uso della sola funzione getch() o getchar() (che sono invece interruttive).

Ad ogni modo mi pareva che ci fosse un modo per rilevare la pressione dei tasti in modo non interruttivo senza scomodare le SDL... forse con curses.h, ma purtroppo non riesco ne a ricordare ne a trovare degli esempi che mi ero scritto :(

(...Comunque per fare quello che vuole ccts2002, forse questo non serve :| ).

Rispondi