|
|
|
![]() |
|
Strumenti |
![]() |
#1 |
Member
Iscritto dal: Sep 2001
Città: Firenze
Messaggi: 216
|
[C++] Problema con windows.h e numeric_limits
Ho un problema in C++ che non riesco a spiegarmi...
![]() 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 ![]() |
![]() |
![]() |
![]() |
#2 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
#include <windows.h>
#ifdef min #undef min #endif
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#3 | |
Member
Iscritto dal: Sep 2001
Città: Firenze
Messaggi: 216
|
Quote:
Però voglio capire: si fa l'undef perchè dentro la windows.h c'è una #DEFINE min ... ? |
|
![]() |
![]() |
![]() |
#4 |
Senior Member
Iscritto dal: Apr 2000
Città: Roma
Messaggi: 15625
|
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 ![]()
__________________
0: or %edi, %ecx; adc %eax, (%edx); popf; je 0b-22; pop %ebx; fadds 0x56(%ecx); lds 0x56(%ebx), %esp; mov %al, %al andeqs pc, r1, #147456; blpl 0xff8dd280; ldrgtb r4, [r6, #-472]; addgt r5, r8, r3, ror #12 |
![]() |
![]() |
![]() |
#5 | |
Member
Iscritto dal: Sep 2001
Città: Firenze
Messaggi: 216
|
Posso farti un'altra domanda?
Quote:
![]() 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 ![]() |
|
![]() |
![]() |
![]() |
#6 | |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
Re: Posso farti un'altra domanda?
Quote:
|
|
![]() |
![]() |
![]() |
#7 | |
Member
Iscritto dal: Sep 2001
Città: Firenze
Messaggi: 216
|
Quote:
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... |
|
![]() |
![]() |
![]() |
#8 |
Bannato
Iscritto dal: Jul 2000
Città: Malo (VI)
Messaggi: 1000
|
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. |
![]() |
![]() |
![]() |
Strumenti | |
|
|
Tutti gli orari sono GMT +1. Ora sono le: 10:56.