error de desbordamiento de entero
-
04-10-2019 - |
Pregunta
Esta parte de mi código OpenGL, estoy consiguiendo un error para:
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
Solución
Trate de convertir RAND_MAX
a un flotador antes añadiendo a la misma.
curBall->x=((float)rand()/( ((float)RAND_MAX) +1))*(ww-1) +1;
etcétera. RAND_MAX
es a menudo igual a INT_MAX
, el valor más grande un número entero podría contener, añadiendo así 1 a ella mientras se sigue considerando un número entero lo empuja sobre el límite de número entero.
Otros consejos
Es probablemente RAND_MAX + 1
que se desborde, ya que RAND_MAX bien puede ser == INT_MAX
.
Yo diría que su RAND_MAX
es igual a su INT_MAX
, por lo que todas sus piezas RAND_MAX+1
se desbordan. Ya que esos son dos constantes, el compilador puede detectar en tiempo de compilación.
Se podría depender de su compilador si RAND_MAX == MAX_INT continuación RAND_MAX + 1 se desbordará.