PDA

View Full Version : [C++] Problema con windows.h e numeric_limits


miondere
16-04-2003, 11:19
Ho un problema in C++ che non riesco a spiegarmi... :( Necessito del vostro aiuto, perchè non riesco ad andare avanti...
Se provo a compilare il codice sottostante il compilatore mi da:

F:\provadacancellaresubito.cpp(21) : warning C4003: not enough actual parameters for macro 'min'
F:\provadacancellaresubito.cpp(21) : error C2589: '(' : illegal token on right side of '::'
F:\provadacancellaresubito.cpp(21) : error C2059: syntax error : '::'


Il codice è questo:

#include <windows.h>
#include <iostream>
#include <limits>


using namespace std;


void main()

{
cout << " 2 The minimum value for int is " <<
numeric_limits<int>::min() << endl;
}


Ma se tolgo #include <windows.h> il compilatore non da più errori!!! Perchè?!?
Come posso fare dato che la <windows.h> mi servirà nel mio programma?

Ciao :)

ilsensine
16-04-2003, 11:25
#include <windows.h>
#ifdef min
#undef min
#endif

miondere
16-04-2003, 14:23
Originally posted by "ilsensine"

#include <windows.h>
#ifdef min
#undef min
#endif

Ora funziona! Grazie...
Però voglio capire: si fa l'undef perchè dentro la windows.h c'è una #DEFINE min ... ?

ilsensine
16-04-2003, 14:38
ja
Tieni conto che il mio è uno stupido hack, nulla a che vedere con la purezza del c++.
Una soluzione migliore sarebbe non utilizzare windows.h (o non utilizzare windows affatto :D )

miondere
16-04-2003, 18:09
Originally posted by "ilsensine"


Una soluzione migliore sarebbe non utilizzare windows.h (o non utilizzare windows affatto :D )

In effetti nelle prox settimane mi metto su anche Linux... ;)

Ti posso fare un'altra domanda? Non voglio aprire un altro thread:
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 :)

/\/\@®¢Ø
16-04-2003, 19:00
Originally posted by "miondere"



In effetti nelle prox settimane mi metto su anche Linux... ;)

Ti posso fare un'altra domanda? Non voglio aprire un altro thread:
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 :)
Puo' succedere quando il canale va in uno stato corrotto, ad esempio quando cerchi di leggere un intero ed inserisci una stringa; prova a controllare se il canale e' in buono stato prima di riutilizzarlo.

miondere
16-04-2003, 21:09
Originally posted by "/\/\@®¢Ø"


Puo' succedere quando il canale va in uno stato corrotto, ad esempio quando cerchi di leggere un intero ed inserisci una stringa; prova a controllare se il canale e' in buono stato prima di riutilizzarlo.


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:

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

Che posso fare? Scusami se mi sono dilugato troppo...

/\/\@®¢Ø
16-04-2003, 22:36
E' un caso analogo a quel che ti dicevo sopra: l'operazione di lettura fallisce e il canale entra in uno stato invalido. Dopo una lettura (e prima di arrischiare la successiva) dovresti controllare se il canale e' ok ( con cin.good() ad esempio ), oppure impostare la libreria affinche' lanci un'eccezione in caso di errore ( con cin.exceptions( ... ) ), anche se molte librerie non recentissime non la implementano.
Per riportare lo stato alla situazione originale non ho idea sinceramente; forse basta forzare il canale a "good" con cin.setstate( std::ios_base::goodbit ), e ignorare tuti i caratteri fino al successivo spazio/ritorno a capo, ma non ho mai provato.