سؤال
هذا الجزء من رمز 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;
إلى آخره. 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