我正在编写一个程序,该程序应在640x480窗口中的任意位置创建随机大小的绿色框。运行以下代码时出现分段错误。问题出在两个“ for”循环中。段错误通常发生在带有startx的嵌套“ for”循环中。我怀疑缓冲区溢出,但是不知道如何减少笨重的代码。
//Globals
int width, height;
int endx, endy, starty, startx, randEnd, randStartX, randStartY;
unsigned char *pixmap;
void setPixels(){
for (int j = 1; j<100; j++) { // j == j-1 # of boxes
randStartX = rand() % width; // random # btw 0 and width
randStartY = rand() % height; // random # btw 0 and height
randEnd = 1 + (rand() % 100); // random # btw 0 - 100, not allowing box > 100.
startx = randStartX;
starty = randStartY;
endx = startx + randEnd;
endy = starty + randEnd;
for(int y = starty; y < endy; y++) { // first y coordinate of box
for(int x = startx; x < endx; x++) { // first x coordinate of box
cout << "endx = " << endx << endl;
int i = (y * width + x) * 3; // movement upwards for each pixel
pixmap[i++] = 0x00; //Increments i by one to move to the next part of pixel.
pixmap[i++] = 0xFF;
pixmap[i] = 0x00;
}
}
}
}
int main(int argc, char *argv[])
{
//initialize the global variables
srand (time(0));
width = 640;
height = 480;
pixmap = new unsigned char[width * height * 3];
setPixels(); // write code like ./pr01 red, etc.
glutInit(&argc, argv);
glutInitWindowPosition(100, 100); // Where the window will display on-screen.
glutInitWindowSize(width, height);
glutInitDisplayMode(GLUT_RGB | GLUT_SINGLE);
glutCreateWindow("Assignment 01");
init();
glutReshapeFunc(windowResize);
glutDisplayFunc(windowDisplay);
glutMouseFunc(handleButton);
glutMainLoop();
return 0;
}
知道是什么原因造成的吗?这里有任何公然的逻辑问题吗?提前致谢。
如何看待这个问题是假设randStartX
设置为639和randStartY
479。现在,您说找到一个随机数来确定盒子的大小(最大100)。如果从右下角开始,则无法创建超出数组范围的任何框。randEnd
添加到randStartX
和时,您的代码必须考虑超出范围的盒子randStartY
。randEnd需要被约束,或者在您的2 for循环中,您需要确保将书写限制在显示区域(pixmap)的边缘之外。
最好的方法是约束endx
和约束endy
。您可以执行此操作并通过替换来修复错误
endx = startx + randEnd;
endy = starty + randEnd;
和:
endx = min(startx + randEnd, width-1);
endy = min(starty + randEnd, height-1);
使用min
函数限制框,使其不超出width
and的边缘height
(由于我们从0开始,所以减去1)
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句