我正在编写一个程序,应该在640x480窗口的随机位置创建随机大小的绿色框。我运行以下代码时出现分段错误。问题出在两个" for"循环。段错误通常发生在嵌套" for"用startx循环。我怀疑缓冲区溢出,但不知道如何制作不那么庞大的代码。
//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;
}
有什么可能导致这种情况的想法?这里有任何明显的逻辑问题吗?提前谢谢。
答案 0 :(得分:1)
如何查看此问题假设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
和height
的边缘(因为我们基于0,所以减去1)
答案 1 :(得分:0)
当然,如果startx / y可以在0..width / height-1范围内,并且randEnd在1..100范围内,则endx / y可以很容易地溢出(例如startx = width-30和randEnd = 80)
答案 2 :(得分:0)
这是您的问题,如评论中所述。使用下面的代码,您只需填写缓冲区。
for(int y =0; y < randStartY ; y++) { // first y coordinate of box
for(int x = 0; x < randStartX; 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;
}
}
}
由于你只是在这里处理颜色,我认为这就是你所追求的。如果你要复制一个纹理,我们必须有点不同,有一些偏移和东西:)
好吧,我希望它有所帮助。
干杯