分段故障11 redux

时间:2014-09-20 20:07:56

标签: c++ opengl segmentation-fault glut

我正在编写一个程序,应该在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; 
}

有什么可能导致这种情况的想法?这里有任何明显的逻辑问题吗?提前谢谢。

3 个答案:

答案 0 :(得分:1)

如何查看此问题假设randStartX设置为639而randStartY设置为479.现在您要找一个随机数来确定框的大小(最大100)。如果从右下角开始,则无法在数组边界之外创建任何框。添加到randEndrandStartX时,您的randStartY代码必须考虑超出界限的框。 randEnd需要被约束,或者在你的2 for循环中,你需要确保限制写入超出显示区域的边缘(pixmap)。

最好的方法是约束endxendy。您可以通过替换

来执行此操作并修复您的错误
endx = startx + randEnd;
endy = starty + randEnd;

使用:

endx = min(startx + randEnd, width-1);
endy = min(starty + randEnd, height-1);

使用min功能限制框,使其不会超出widthheight的边缘(因为我们基于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; 
        }
    }
}

由于你只是在这里处理颜色,我认为这就是你所追求的。如果你要复制一个纹理,我们必须有点不同,有一些偏移和东西:)

好吧,我希望它有所帮助。

干杯