Newsgroup: it.comp.os.linux.development
Titolo: kbdhit

Ciao,
Facendo un search con google ho visto che l'argomento e' gia' stato 
trattato, pero' nel gruppo non
ne ho trovato traccia, quindi chiedo scusa se avete gia' discusso 
della cosa di recente.
Io ho bisogno di una funzione che mi segnali se e' stato premuto un 
tasto, avete il codice di un equivalente
di kbdhit ?
Da quello che ho potuto capire questa funzione e' presente in diversi 
C ma non nel GCC...
GetChar non mi va bene perche' non voglio che la funzione resti in 
attesa della pressione di un tasto,
ma solo che mi avvisi se ne e' stato premuto uno (e poi nel caso 
chiedo con getchar di quale tasto
si tratta).
Francesco
IACT Member.
http://frengo.dragonfire.net/

di kbdhit ?
man getch
(devi includere ncurses.h)
-- 
Saluti,
    Mardy
http://castellina.org/interlingua

 man getch
Non ce l'ho...
Mi serve qualche pacchetto particolare per avere queste cose nel man ?
(debian)
E sei sicuro che getch non rimanga in attesa della pressione di un 
tasto ?


tasto ?
Ha due comportamenti diversi, a seconda che sia chiamata in no-delay
(quello che serve a te) o meno.
Vedi anche "man nodelay".


 Vedi anche "man nodelay".
Ci ho provato :-(


getch e nodelay :-((((
Scusa, è vero: dovrebbe essere in libncurses-dev (libncurses5-dev o
libncurses4-dev).


 libncurses4-dev).
Esiste qualcosa di analogo anche per la libreria del c++ ??
-- 
  _  _  >>Now at work<<  _     || ICQ number.................Non lo uso
 | \| |___ _____ ___ ___|_|___ || Home-Page ................Non ce l'ho
 | .` | -_|     | -_|_ -| |_ -||| E-Mail................Non l'avrai mai
 |_|\_|___|_|_|_|___|___|_|___||| Un Nemesis che ha pochi e-contatti ;)

Esiste qualcosa di analogo anche per la libreria del c++ ??
Non lo so, facendo una rapida ricerca ho trovato
/usr/lib/libncurses++.a
e il file /usr/include/cursesapp.h, che contiene codice C++.


 e il file /usr/include/cursesapp.h, che contiene codice C++.
Forse mi sono spiegato male, inendevo le manpages della libreria 
standard del C++, la stl. Mi hanno consigliato il pacchetto (uso Debian)
stl-manual che pero' aggiunge una sorta di reference in html invece
a me piacerebbe avere le manpages come quelle di manpages-dev


a me piacerebbe avere le manpages come quelle di manpages-dev
Nella mia Debian (potato) non ci sono, prova magari a cercare sul sito
della SGI.


 libncurses4-dev).
Ok, il manuale l'ho trovato :-)
Pero' forse mi manca qualcosa, usando getch() il compilatore mi
segnala :
undefined reference to stdscr
undefined reference to wgetch
stdscr non so cosa sia (no man page)...
Il codice era :
int tastopremuto;
tastopremuto = getch();


 undefined reference to wgetch
Se compili con le ncurses linka le ncurses
-lncurses
--
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.mascanc.net
    **ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
  -<! Drink To Your Brothers Who Are Never To Fall, We Are Brothers Of Metal
  		Here In The Hall! !>-
  			Manowar - Brothers Of Metal PT1

undefined reference to wgetch
man ncurses
(devi usare -lncurses con gcc)


 -lncurses
Funziona, ma perche' in questo caso non basta l'include ?
E comunque, ho fatto un po' di tentativi e poiche' sono falliti :)
ho provato a copiare un esempio dal mio manuale C (kernighan) :
	noecho;
	cbreak;
	raw;
 
	tasto = getchar();
	while (tasto != *"1")
	{
		putchar(tasto);
		tasto =getchar();
	}
In teoria dovrebbe semplicemente scrivere a video i caratteri 
premuti, ma in realta' aspetta sempre che prema return per
farmi il putchar e se ne frega dei tre comandi precedenti :
noecho;  cbreak; raw;
L'esempio originale non li aveva e aveva EOF al posto di 1, ma
cosi' il loop era infinito e comunque on funzionava come dovrebbe.
Ora , dato che il codice di esempio e' giusto deve esserci impostato
qualche parametro che modifica il comportamento del buffer 
(immagino),  pero' secondo man cbreak e raw dovrebbero
forzare il sistema a non aspettare il carattere new line...


della SGI.
OK, proverň
Grazie.
-- 
  _  _ >>Now on Linux<<  _     || ICQ number.................Non lo uso


 raw;
queste tre righe non fanno quello che ti aspetti; tu vorresti chiamare le 
funzioni, mentre in realta' le nomini soltanto; sostituisci con:
noecho();
cbreak();
raw();
ciao Anto
-- 
Antonio Cuni, 19 anni, studente
Brainbench C++ Master: 4.6, higher than 98% of all previous test takers.
C Language: 3.32, higher than 79% of all previous test takers.
Guida C/C++ di Programmazione.it: 
http://cpp.programmazione.it

 (immagino),  pero' secondo man cbreak e raw dovrebbero
Mi sa proprio che devi usare aut cbreak() aut raw(). Controlla bene il
manuale delle ncurses.
-- 
  Giuseppe "Cowo" Corbelli \/\ My software: 
http://cowo.mascanc.net
	**ANTI-SPAM** -- **Substitute IHATESPAM with cowo to reply by mail**
 -<! Woe to you, oh Earth and Sea, for the Devil sends the Beast with
        wrath, because He knows the time is short... !>-
                Revelations, XIII - 18

 funzioni, mentre in realta' le nomini soltanto; sostituisci con:
E cosa vuol dire nominarle ? Cioe' cosa comporta visto che non
le richiama effettivamente... Mi sarebbe sembrato piu' logico un
messaggio di errore...


 >> -lncurses
Il manuale mi e' stato di aiuto, ora riesco a barcamenarmi tra i vari
comandi , pero' come si ripristina la shell ?
Una volta terminata l'esecuzione del programma la shell e'
sputtanata e devo lanciare reset per rimetterla a posto.
Non c'e' un equivalente nelle funzioni di ncurses ?
Ovviamente ho rimesso a posto nocbreak e echo a fine programma.


 messaggio di errore...
La grammatica del C prevede il concetto di espressione; e' definita 
espressione qualsiasi cosa da cui puo' essere ricavato un valore di ritorno 
(in realta' non e' proprio cosi', ci sono delle eccezioni, ma prendila per 
buona). Il fatto che, incidentalmente, con alcune espressioni si ottengono 
anche degli effetti collaterali e' secondario (dal punto di vista 
sintattico; ovviamente cio' e' vitale per poter programmare). Ecco alcuni 
esempi di espressioni lecite:
  a = 3; // e' una espressione che restituisce 3; incidentalmente, tale 
valore e' anche assegnato alla variabile 'a'
  a++; // restituisce 'a'; incidentalmente, a viene incrementato
  a; // restituisce 'a'; nessun effetto collaterale
  3; // nessun effetto collaterale; restituisce 3
  2+1; // idem come sopra
  mia_funzione(); // restituisce il valore restituito dalla funzione che, 
incidentalmente, e' chiamata
Tra le espressioni ammesse c'e' proprio quella che ti ha tratto in inganno:
  mia_funzione; // restituisce l'indirizzo di 'mia_funzione'; nessun 
effetto collaterale


 Non c'e' un equivalente nelle funzioni di ncurses ?
non ne ho la piu' pallida idea; non ho mai usato le ncurses...


 effetto collaterale
Hmm, non mi viene in mente un possibile utilizzo, ma ho capito il
ragionamento. Thanks


 ragionamento. Thanks
non ho capito: non ti viene in mente un possibile utilizzo dell'indirizzo 
della funzione oppure del fatto che e' possibile valutare una espressione 
senza considerare il risultato?
Nel primo caso immagino che tu non sappia ancora cosa siano i puntatori a 
funzione.
Nel secondo caso invece e' una caratteristica vitale: se non fosse 
possibile scrivere
        3;
        2-1;
        mia_funzione;
non sarebbe possibile scrivere neppure
        mia_funzione();
ma dovresti scrivere qualcosa del tipo
        int tmp = mia_funzione();
(ammesso che il tipo di ritorno sia int).
ciao Anot


 funzione.
Era il primo caso, ed infatti non so cosa siano i puntatori a funzioni
:-))))


 tasto
select(2)



Questo sito contiene una ottima guida alle ncurses
almeno sotto il mio ppunto di vista :)
http://www.linuxdoc.org/LDP/lpg/index.html
Ti chiarirà di sicuro molti dubbi, in quanto i comandi sono ordinati per 
utilità, non per difficoltà come succede spesso.
Ad esempio andando nella sezione NCurses - Initializing si trova
proprio quello che chiedi tu :)
int endwin()  
endwin() will do the cleanup, restore the terminal modes in the state they had 
before calling initscr() and move the cursor to the lower left corner.
Don't forget to close all opened windows before you call endwin() to exit your program. 

 almeno sotto il mio ppunto di vista :)
Grazie per le due dritte, la guida (che vado subito a studiare) ed
il comando !
