Newsgroup: it.comp.lang.c++
Titolo: cin (come farlo funzionare correttamente?)

Alcune volte mi capita che il programmma non si fermi ad un cin>>
In pratica il programma diventa ingestibile e mi va a finire anche il loop
perchč l'input lo richiedo in un ciclo (NOTA: il primo input funziona
correttamente, al secondo non me lo richiede piů e va in loop e guardando
dal debug si mantiene il primo valore inserito nel primo input)
Come posso fare per risolvere? Grazie :)

 dal debug si mantiene il primo valore inserito nel primo input)
Metti questa linea dopo il cin >>:
cin.get();
In questo modo togli il carattere di nuova linea da stdout.
Saluti
-- 
Per l'e-mail rimuovere la frase in maiuscolo e gli underscore.
E finalmente sono su Linux!

Intendi cosě?
cin  >> variabile;
cin.get();
Se intendi cosě, non mi funziona, fa come prima!!! :(
Hai un'altra idea?
"Zero" <fiqpgc@_SPAMMER_AL_CONFINO_IN_SIBERIA_tin.it> ha scritto nel
messaggio news:v6dna.22515$LB6.5...@news1.tin.it...


 Se intendi cosě, non mi funziona, fa come prima!!! :(
Potresti postare il codice incriminato?


>Potresti postare il codice incriminato?
Ti ho messo il codice incriminato in maniera pulita, ho levato molte cose
tanto il problema e sulla cin di select e di produrre
Produrre è una variabile globale di tipo unsigned long int
void main()
{
int select;
do
{
    cin >>select;
    switch(select)
    {
        case 1:
            priorita();
            break;
        case -1:
            break;
        default:
            cout << "Errore di digitazione: " << select << endl;
}
}
while (select!=-1);
}
void priorita()
{
try
{
    cin >> produrre;
    cprocessi();
}
catch(Controllo_output& c)
{
    c.errore();
}
}
void cprocessi()
{
    if (produrre > numeric_limits<unsigned long int>::max() || produrre <=
numeric_limits<unsigned long int>::min())
            throw Controllo_output_processi();
}
All'interno Controllo_output_processi() è una classe che contiene solo un
output su video:
class Controllo_output
{
   public:
    virtual void errore() const
    {
     cout<<"Errore di digitazione";
    }
};
class Controllo_output_processi : public Controllo_output
{
public:
 virtual void errore() const
 {
  cout<<"Hai digitato un numero di processi fuori dal range
consentito!"<<endl;
 }
};
Ad esempio mi va in loop quando metto un numero che eccede il limite max
degli unsigned long int
Guardando dal debug ho visto che se eccedo mi mette nella variabile il
valore zero.
Riferito al problema degli unsigned long int, sui loro limiti, ho postato
sopra un messaggio: "Eccezioni: controllo dei limiti". Se ci dai un'occhiata
mi fai un favore...non riesco ad andare avanti per queste due cose
stupide...uffa!
Scusa se mi sono dilungato troppo...
Ciao.

:
Main ritorna _sempre_ un int.

Figurati, mi hai dato una buona descrizione del problema.
Sai, mettere anche gli `#include' la prossima volta mi aiuterebbe a 
compilarlo...
A me non va in loop; stai usando MS Visual C++? Prova ad infilare un `cout 
<< produrre' in `cprocessi()' e a compilare senza le informazioni di debug; 
`produrre' non diventa sempre zero, ma viene arrotondato a forza dalla 
dimensione della variabile.
Poi, quel "controllo sul possibile overflow" che esegui sempre in 
`cprocessi' è inutile: `produrre' non potrà _mai_ contenere un numero 
maggiore del massimo (o minore del minimo) rappresentabile per il suo tipo, 
quindi l'`if' sarà sempre falso. Avevi mai notato che non veniva mai 
lanciata nessuna eccezione?
Spero di esserti stato utile.
Saluti.


 lanciata nessuna eccezione?
Se provi a mettere un valore superiore al max degli unsigned long int (ad
esempio 50000000000)
vedrai che viene zero e quindi è sollevata l'eccezione (almeno a me fa così)
perchè controllo che il valore inserito sia maggiore strettamente di zero...
Ciao

 zero...
E se qualcuno vuole un processo a priorità 0? ;-)
Però, a questo punto, invece di
"
 if (produrre > numeric_limits<unsigned long int>::max() || produrre <=
numeric_limits<unsigned long int>::min())
            throw Controllo_output_processi();
"
Scrivevi direttamente questo:
if(!produrre) throw Controllo_output_processi();
Ti pare? Tanto lo sforamento "verso l'alto" non si potrà mai 
rilevare, così come l'opposto; ho anche provato con cin.fail(), ma nulla.
Comunque, per scrupolo, provo a fare un po' di ricerche, anche se credo che 
non arriverò a capo di nulla. Poi ti faccio sapere.
Buon lavoro


 Buon lavoro
Buon lavoro anche a te.

 Sai come si fa a rendere nuovamente buono un canale corrotto?
cin.clear();
Non credo che funzioni: non ha funzionato fail(), che ti dice l'opposto di 
good().
Saluti


 good().
Invece la good() mi funziona...ho provato...
Ciao

 Invece la good() mi funziona...ho provato...
Beato te!
