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.
vBulletin® v3.6.4, Copyright ©2000-2025, Jelsoft Enterprises Ltd.