Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - Bloccare un ciclo infinito
Forum - C/C++ - Bloccare un ciclo infinito

Avatar
Roberto94 (Normal User)
Newbie


Messaggi: 1
Iscritto: 19/12/2009

Segnala al moderatore
Postato alle 19:16
Mercoledì, 06/04/2011
Dovrei interrompere un ciclo infinito premendo un tasto da tastiera per esempio "f" in modo da poter effettuare altre operazioni.

Come posso fare?
Ciao e grazie.

PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
2
Down
V
Segnala al moderatore
Postato alle 22:05
Giovedì, 14/04/2011
Codice sorgente - presumibilmente C/C++

  1. #include<iostream>
  2. #include<windows.h>
  3. using namespace std;
  4. int main()
  5. {
  6.     while(!GetAsyncKeyState(0x46))
  7.     {
  8.         cout<<"Premi F per interrompere"<<endl;
  9.     }
  10.     system("pause");
  11. }


GetAsyncKeyState determina se il tasto passato come parametro è premuto o meno al momento del richiamo della funzione http://msdn.microsoft.com/it-it/library/ms646293.aspx
il parametro da passare si determina da questa tabella: http://msdn.microsoft.com/it-it/library/dd375731.aspx

PM
Avatar
Alex (Ex-Member)
Expert


Messaggi: 441
Iscritto: 15/08/2005

Up
2
Down
V
Segnala al moderatore
Postato alle 19:22
Mercoledì, 06/04/2011
Codice sorgente - presumibilmente C/C++

  1. char c;
  2.  
  3. while((c=getchar())!='f'){
  4.    .
  5.    .
  6.    .
  7. }


mentre se vuoi un ciclo infinito puoi usare l'istruzione break:

Codice sorgente - presumibilmente C/C++

  1. char c;
  2. for(;;){
  3.    c=getchar();
  4.    .
  5.    .
  6.    .
  7.    if(c=='f')
  8.         break;
  9. }


Ultima modifica effettuata da Alex il 06/04/2011 alle 19:24
ho provato sia con il while che con il for, ma il ciclo nn si interrompe quando premo 'f' - Roberto94 - 07/04/11 14:41
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 9:40
Domenica, 10/04/2011
Se il tuo interesse è interrompere un ciclo solo e soltanto alla pressione di un tasto ben specifico, allora puoi usare un ciclo simile a quello che ti ha proposto Alex. Un solo aggiustamento, non usare getchar(). Usa, invece, cin.get() (oppure usa direttamente cin con una variabile char), che è standard del C++ (getchar() proviene dal C). In pratica, una soluzione del genere andrebbe bene (l'ho provato, e funziona):

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2.  
  3. using namespace std;
  4.  
  5. int main()
  6. {
  7.     cout << "Insert a value => ";
  8.     char chr;
  9.     cin >> chr;
  10.     while (chr != 'f')
  11.     {
  12.         cout << "Insert another value for chr => ";
  13.         cin >> chr;
  14.     }
  15.     cin.get();
  16.     cin.get();
  17.     return 0;
  18. }





Se, però, ti interessa interrompere il ciclo all'immissione di un particolare tipo di valore (es. un numero negativo o una lettera), puoi usare le funzioni della libreria <cctipe> (in C-style, <ctype.h>), che presenta, tra le altre, le seguenti funzioni:

isalnum() -> ha come risultato true se l'argomento è alfanumerico
isalpha() -> ha come risultato true se l'argomento è una lettera
iscntrl() -> ha come risultato true se l'argomento è una sequenza di    controllo
isgraph() -> ha come risultato true se l'argomento è un qualunque carattere diverso dallo spazio
isdigit() -> ha come risultato true se l'argomento è un numero in base decimale. Per i numeri esadecimali, si usa isxdigit()

Ora, ti suggerirei di procedere inserendo una di queste funzioni come condizione di verifica del ciclo. Per esemplificare, ho scritto (in 2 minuti, quindi non è che sia il massimo, ma rende l'idea) un semplice programma:

Codice sorgente - presumibilmente C++

  1. #include <iostream>
  2. #include <cctype>
  3.  
  4. using namespace std;
  5.  
  6. int main()
  7. {
  8.     cout << "Insert a value => ";
  9.     char chr;
  10.     cin >> chr;
  11.     while(isalpha(chr))
  12.     {
  13.         cout << "Insert a new chr value => ";
  14.         cin >> chr;
  15.     }
  16.     cin.get();
  17.     cin.get();
  18.     return 0;
  19. }



Provandolo, potrai notare che il ciclo proseguirà finchè tu non inserirai un numero o un qualunque altro carattere che non sia alfabetico.

Ultima modifica effettuata da il 10/04/2011 alle 9:51
PM
Avatar
()
Newbie


Messaggi:
Iscritto:

Up
0
Down
V
Segnala al moderatore
Postato alle 7:13
Venerdì, 15/04/2011
Anthony, la tua soluzione, personalmente, mi piace molto. È sicuramente molto più precisa della mia. Ho solo un dubbio: non sarebbe meglio utilizzare il C++ standard, piuttosto che usufruire di funzioni C??

Per esempio, sei a conoscenza di funzioni standard del C++ che permettano una verifica di precisione quantomeno simile a quella della funzione proposta da te???

ma se il getasyncstate è delle api di windows poi il programma perde la portabilità! - Alex - 16/04/11 20:28
PM