PDA

View Full Version : Aiuto istruzioni C/C++


GianFisa
17-02-2004, 18:19
Ciao! ho un problema, sto facendo un programma, ed ho bisogno che mentre è in esecuzione posso premere alcuni tasti e fare cambiare dei valori alle variabili senza aspettare l'invio come succede con il cin o con lo scanf...
sapete se c'è qualche istruzione adatta (uso il turbo C++ e sn un principiante)
devo simulare il funzionamento di un flip-flop JK...devo cambiare i valori di J e di K al volo mentre il clock sale e scende...
Grazie.
CIAO!

DanieleC88
17-02-2004, 20:17
....Spiegati meglio, con più calma.

GianFisa
17-02-2004, 21:08
Scusate se non mi sono spiegato bene...
Faccio un esempio: Faccio un programma con un ciclo for infinito che ad ogni ciclo mostra il valore di una variabile X. Io ho bisogno di cambiare il valore della variabile X mentre il programma è in esecuzione, senza interrompere il ciclo for...
In pratica devo fare questo...mi sono spiegato?
Grazie!

/\/\@®¢Ø
17-02-2004, 21:16
con il metodo get della classe istream puoi leggere un carattere alla volta.

GianFisa
18-02-2004, 15:41
mmm..grazie non e che potresti scrivermim una riga di codice di esempio... Grazie 1000!

/\/\@®¢Ø
18-02-2004, 16:51
con

char c = cin.get();

Ti prendi un solo carattere dall'input e quindi non attendi che l'utente "completi la riga" (se in input scrivi "ciao" la funzione ritorna 'c' dopo il primo tasto premuto).
Se inoltre vuoi solo controllare se siano stati premuti tasti, ed eventualmente continuare l'esecuzione in caso contrario puoi usare il metodo in_avail() ( o avail ? :confused: controlla..) piu' o meno nel modo seguente:

if ( cin.in_avail() )
{
// questa chiamata non blocca l'esecuzione
char c = cin.get();
/* bla bla */
}
else
{
// nessun input ! facciamo altro
}

xybercom
18-02-2004, 20:40
Originariamente inviato da /\/\@®¢Ø
con

char c = cin.get();

Ti prendi un solo carattere dall'input e quindi non attendi che l'utente "completi la riga" (se in input scrivi "ciao" la funzione ritorna 'c' dopo il primo tasto premuto).


A me con Linux non funziona, cin.get() legge sì un carattere alla volta ma "riceve" i caratteri solo dopo che ho premuto return.
Per usare in_avail mi sembra serva questa notazione

( cin.rdbuf() )->in_avail()

GianFisa
18-02-2004, 21:02
Grazie! appena riesco li provo... vi faccio sapere.

/\/\@®¢Ø
18-02-2004, 21:24
[QUOTE]Originariamente inviato da xybercom
A me con Linux non funziona, cin.get() legge sì un carattere alla volta ma "riceve" i caratteri solo dopo che ho premuto return.
[quote]
argh... hai ragione, sotto linux i terminali sono generalmente bufferizzati linea per linea. Ho paura che per leggerne uno alla volta bisogni impostare qualche parametro con tcsetattr (ma, tanto per cambiare, non ne sono sicuro :D).




( cin.rdbuf() )->in_avail()

ah si' e' giusto cosi', ricordavo male io.

xybercom
20-02-2004, 20:17
\/\@®¢Ø ho provato anche in ambiente Windows (XP) e il comportamento è lo stesso sia con mingw che con VC .NET.
Sotto Linux comunque ho risolto sbirciando un programma C del "maestro" Eric Raymond http://www.catb.org/~esr/ (showkey.c).
Il programma funzionante è questo:


/* Shows the keys pressed by a user
* Based on Eric Raymond 's showkey.c
*/

#include <iostream>
#include <termios.h>

using namespace std;

int main()
{
// Get the state of the tty
termios original;
tcgetattr( 0, &original );
// Make a copy we can mess with
termios raw = original;
// Turn off echoing, ->> linebuffering <<- , and special-character processing,
raw.c_lflag &= ~( ICANON | ECHO );
// set the new state
tcsetattr( 0, TCSANOW, &raw );

cout << "\nPress some keys..., 'q' to exit" << endl;
bool stop = false;
unsigned int counter = 0;
while ( !stop )
{
++counter;
char c = cin.get();
cout << "\nYou pressed \'" << c << "\'" << " ( " << static_cast<int> (c) << " ), total characters " << counter << endl;
stop = ( c == 'q' );
}

// restore the original state for the tty
tcsetattr( 0, TCSANOW, &original );
return 0;
}

alderighi
21-02-2004, 17:25
altrimenti usa la kbhit();

Kralizek
21-02-2004, 17:55
e per fare la stessa cosa in c (sempre ambiente windows?)

xybercom
21-02-2004, 19:30
Originariamente inviato da alderighi
altrimenti usa la kbhit();
?? non esiste in C\C++ !
E' solo per Borland (ciò non toglie che possa essere comoda... :) )

GianFisa
29-02-2004, 18:03
Ciao raga..ho provato e riprovato di tutto ma nn riesco...probabilemte sono limitato da quel cavolo di compilatore(turbo c++) alla fine mi hanno detto che dovrei usare la kbhit() e che esiste una specie di variabile o qlc del genere (forse un buffer), in cui è memorizzato l'ultimo tasto premuto dalla tastiera (in Ascii mi sembra)...e dovrei tirarlo fuori da li... qualche consiglio?
grazie cmq...

bak86
02-03-2004, 15:46
Mi hanno suggerito questa parte di codice:

#include <stdio.h>
#include <windows.h> /* utilizzando le API di Windows */

int main()
{

while(1)
{
if (GetKeyState (VK_LEFT) < 0)
printf("LEFT ") ;
if (GetKeyState (VK_RIGHT) < 0)
printf("RIGHT ");
if (GetKeyState (32) < 0)
printf("SPACE ");
if (GetKeyState (65) < 0)
printf("A ");

Sleep(100);
/* ANCHE se non premo un tasto, fai comunque qualcos'altro */
}

return 0;
}

... tuttavia non riesco a farci niente, mi manca la libreria windows.h, prova tu... :mc: