سؤال

هذا الجزء من رمز 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 سوف يتدفق.

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top