Ошибка целочисленного переполнения
-
04-10-2019 - |
Вопрос
Это часть моего кода OpenGL, я получаю ошибку для:
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
Решение
Попробуйте преобразование RAND_MAX
поплавок до добавление к нему.
curBall->x=((float)rand()/( ((float)RAND_MAX) +1))*(ww-1) +1;
ET CETERA. RAND_MAX
часто равен INT_MAX
, самое большое значение, которое может удержаться целое число, что добавляет 1 к нему, пока он все еще считается целым числом, толкает его на целочисленное ограничение.
Другие советы
Это, вероятно RAND_MAX + 1
это переполнено, так как Rand_max вполне может быть == INT_MAX
.
Я думаю, твой RAND_MAX
равно вашим INT_MAX
, Так что все ваши RAND_MAX+1
кусочки переполнены. Поскольку это оба константа, компилятор может обнаружить его во время компиляции.
Он может зависеть от вашего компилятора, если Rand_max == max_int тогда rand_max + 1 будет переполнен.
Не связан с StackOverflow