Fehler von ganzzahligen Überlauf
-
04-10-2019 - |
Frage
Dies ist der Teil meines OpenGL-Code, erhalte ich einen Fehler für:
struct Ball {
float x;
float y;
float rot;
float dir;
bool rmv;
Ball* next;
};
Ball* curBall;
void addBall() {
if (balls==NULL) {
balls=new Ball;
balls->next=NULL;
curBall=balls;
} else {
curBall->next=new Ball;
curBall=curBall->next;
curBall->next=NULL;
}
curBall->x=((float)rand()/(float)(RAND_MAX+1))*(ww-1) +1;
curBall->y=((float)rand()/(float)(RAND_MAX+1))*(wh-1) +1;
curBall->dir=((float)rand()/(float)(RAND_MAX+1))*(2*PI-1) +1;
curBall->rot=((float)rand()/(float)(RAND_MAX+1))*(359) +1;
curBall->rmv=false;
}
error :
In function ‘void addBall()’:
file.cpp:120: warning: integer overflow in expression
file.cpp:121: warning: integer overflow in expression
file.cpp:122: warning: integer overflow in expression
file.cpp:123: warning: integer overflow in expression
Lösung
Versuchen RAND_MAX
mit einem Schwimmer Umwandlung vor ihm hinzufügen.
curBall->x=((float)rand()/( ((float)RAND_MAX) +1))*(ww-1) +1;
et cetera. RAND_MAX
ist oft gleich zu INT_MAX
, der größte Wert eine ganze Zahl halten konnte, also 1 zu ihm hinzufügen, während es noch einer ganzen Zahl drückt es über die ganze Zahl Grenze betrachtet wird.
Andere Tipps
Es ist wahrscheinlich RAND_MAX + 1
das ist überfüllt, da RAND_MAX gut == INT_MAX
sein kann.
Ich schätze Ihre RAND_MAX
auf Ihre INT_MAX
gleich ist, so dass alle Ihre RAND_MAX+1
Stücke sind überfüllt. Da diese beiden Konstanten sind, kann der Compiler bei der Kompilierung erkennen.
Es könnte auf Ihrem Compiler abhängen, ob RAND_MAX == MAX_INT dann RAND_MAX + 1 überlaufen wird.