Oppure

Loading
12/06/09 14:02
VoV
B.Giorno a tutti...sto cercando di creare un semplice cronometro e direi che lo scorrere del tempo non è un problema...il problema si tratta nel fermarlo :(
infatti essendo un ciclo infinito pensavo che per uscirne servisse la funzione break; ma a quanto pare non è così
qualcuno saprebbe dirmi esattamente perchè non funzioni e eventualmente se ha una soluzione per stoppare il tempo?
il source è questo
#include <windows.h>
#include <stdlib.h>
#include <stdio.h>

#define spazio 32
#define PREMUTO -32767

int main()
{
	int ore = 0;
    int minuti = 0;
    int secondi = 0;
    
    printf("\n");
	for(;;){
            if(GetAsyncKeyState(spazio)==PREMUTO){
                  break;
                  }
                  else{
                       do
                       {
                         do
                         {
                          printf("\r Cronometro %02d:%02d:%02d ", ore, minuti, secondi);
                          Sleep(1000);
                          secondi++;
                          }
                  while(secondi < 60);
                  secondi = 0;
                  minuti++;
                  }
		while(minuti < 60);
		minuti = 0;
		ore++;
        }
	}                                      
}
ho provato anche a far si che venga rilevato il tasto premuto perchè non avevo idea di come fermarlo (anche se comunque non sembra servi a qualcosa), ma sarebbe comunque una soluzione scomoda

grazie per le risposte ^^
aaa
12/06/09 14:23
penso che il tuo problema sia questa riga di codice

if(GetAsyncKeyState(spazio)==PREMUTO)


io non ho mai usato questa funzione ma le msdn dicono questo

SHORT GetAsyncKeyState(      
    int vKey
);


e sul valore di return specifica:

If the function succeeds, the return value specifies whether the key was pressed since the last call to GetAsyncKeyState, and whether the key is currently up or down. If the most significant bit is set, the key is down, and if the least significant bit is set, the key was pressed after the previous call to GetAsyncKeyState. However, you should not rely on this last behavior; for more information, see the Remarks.

in poche parole il bit più significativo del numero ritornato dalla funzione ti dice se il tasto è premuto o meno; il bit meno significativo ti dice invece se il tasto è stato premuto o meno dall'ultima chiamata.

Quindi non capisco perchè fai il test con -32767...non esce dal ciclo perchè la funzione non assumerà mai quel valore.
12/06/09 14:27
VoV
sisi, infatti, so che la parte sbagliata è quella o meglio io ho preso quella parte da un keylogger perchè era proprio l'ultima spiaggia visto che non sapevo come farlo uscire dal ciclo ho posto la condizione che se si preme il tasto "spazio" dovrebbe uscire dal ciclo, ma ho notato che non è così e non saprei come sistemarlo
aaa
12/06/09 14:41
prova a fare il test col valore 1, la documentazione dice che il bit è settato se il tasto è premuto

EDIT: cavolata!
prova a non farlo proprio il test.

scrivi solo if(getblabla(spazio))
Ultima modifica effettuata da 12/06/09 14:44
12/06/09 15:14
theprogrammer
Una applicazione console (in finestra DOS) tratta in modo diverso da una applicazione GUI il flusso dei messaggi provenienti dalla tastiera. La API in questione non potra' mai ottenere i tasti pressati perche' saranno intercettati dalla "message pump" che viene creata da Windows per la console stessa.

Puoi usare le "vecchie" funzioni kbhit/getch (includendo l'header conio.h) anche se non standard ... Il codice puo' essere riscritto cosi'

#include <windows.h> 
#include <stdlib.h> 
#include <stdio.h> 
#include <conio.h> 

void crono()
{
    int ore = 0; 
    int minuti = 0; 
    int secondi = 0; 

     
    printf("\n"); 

	for(;;)
	{
		do 
		{ 
			do 
			{ 
				if(kbhit()) 
					if(getch()==32)
						return;

				printf("\r Cronometro %02d:%02d:%02d ", ore, minuti, secondi); 
				
				Sleep(1000); 
				secondi++; 
			} while(secondi < 60); 

			secondi = 0; 
			minuti++; 
		} while(minuti < 60); 

		minuti = 0; 
		ore++; 
	}                                       
}

int main() 
{
	crono();

	return 0;
}

aaa
12/06/09 16:10
VoV
la funzione kbhit() non l'avevo mai sentita...ora mi informo

grazie mille per le risposte ^^
aaa