ошибка целочисленного переполнения - PullRequest
3 голосов
/ 07 мая 2010

Это часть моего кода 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

Ответы [ 4 ]

13 голосов
/ 07 мая 2010

Попробуйте преобразовать RAND_MAX в число с плавающей точкой перед добавлением к нему .

curBall->x=((float)rand()/( ((float)RAND_MAX) +1))*(ww-1) +1;

и так далее.RAND_MAX часто равняется INT_MAX, наибольшему значению, которое может содержать целое число, таким образом добавляя к нему 1, в то время как все еще считается, что целое число выталкивает его за предел целого числа.

2 голосов
/ 07 мая 2010

Это может зависеть от вашего компилятора, если RAND_MAX == MAX_INT, тогда RAND_MAX + 1 переполнится.

2 голосов
/ 07 мая 2010

Я думаю, ваш RAND_MAX равен вашему INT_MAX, поэтому все ваши RAND_MAX+1 части переполнены. Поскольку обе эти константы, компилятор может обнаружить это во время компиляции.

2 голосов
/ 07 мая 2010

Это, вероятно, RAND_MAX + 1, что переполнено, поскольку RAND_MAX вполне может быть == INT_MAX.

...