OpenGL:Glut.h访问冲突

时间:2012-10-27 14:35:44

标签: c++ opengl glut

好的,所以我正在开发一个小程序,使用递归函数随机生成单张地形,在四个给定点之间进行细分,并且地形由四边形组成。在每次递归时找到的中心点给出一个随机高度值,然后将所有顶点保存到一个数组中,然后在绘制时循环。

最初,我正在定义用于在堆栈上存储顶点的2D数组,但是根据细分的数量,这可能变得非常大。深度为3例如产生256个顶点。所以,我决定在堆上定义这个数组,对于更大的地形片段,可能会更有效。在Terrain类中,我定义了以下浮点指针数组。

float* vertices[]; 

然后,在这个类的构造函数中,我执行以下操作来初始化它在堆上的大小。 4给定细分数加上1得幂256,以及创建的顶点数。

int vertexCount = pow(4.0, subdivisions+1);
*vertices = new float[vertexCount];

然后,每个指针指向堆中的浮点值数组,定义如下。

for(int i = 0; i<vertexCount + 1; i++)
{
    float* temp = new float[3];
    vertices[i] = temp;
    delete temp;
    temp = 0;
}

用于创建地形的递归函数如下所示:

void Terrain::Subdivide(float* a, float* b, float* c, float* d, int subdivisions, float      maxHeight)
{
if(subdivisions>0)
{
    float e[3];
    float f[3];
    float g[3];
    float h[3];
    float centre[3];
    int i = 0;

    srand(time(NULL));

    for(i = 0; i<3; i++) if(i!= 1) e[i] = (a[i]+b[i])/2;
    for(i = 0; i<3; i++) if(i!= 1) f[i] = (b[i]+c[i])/2;
    for(i = 0; i<3; i++) if(i!= 1) g[i] = (c[i]+d[i])/2;
    for(i = 0; i<3; i++) if(i!= 1) h[i] = (d[i]+a[i])/2;

    centre[0] = (h[0]+f[0])/2;
    centre[2] = (e[2]+g[2])/2;

    e[1] = 0;
    f[1] = 0;
    g[1] = 0;
    h[1] = 0;
    centre[1] = (float)rand()/((float)RAND_MAX/maxHeight);

    Subdivide(a, e, centre, h, subdivisions-1 , maxHeight);
    Subdivide(e, b, f, centre, subdivisions-1, maxHeight);
    Subdivide(centre, f, c, g, subdivisions-1, maxHeight);
    Subdivide(h, centre, g, d, subdivisions-1, maxHeight);
}
else
{
    int i = 0;
    for(i = 0; i<3; i++) {vertices[vertexCounter][i] = a[i];} vertexCounter++;
    for(i = 0; i<3; i++) {vertices[vertexCounter][i] = b[i];} vertexCounter++;
    for(i = 0; i<3; i++) {vertices[vertexCounter][i] = c[i];} vertexCounter++;
    for(i = 0; i<3; i++) {vertices[vertexCounter][i] = d[i];} vertexCounter++;
}

}

当我简单地将顶点定义为堆栈上的2D数组(其他地方有一些更改)时,代码似乎有效,但是当我在main函数中调用glutInit时,这段代码在下一行的Glut.h中产生一个未处理的异常:(第486行)

static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) {     __glutInitWithExit(argcp, argv, exit); }

我已经多次查看过这段代码了,我无法看到问题出在哪里,更奇怪的是异常应该从Glut.h而不是Terrain类抛出。谁能在这里看到任何错误?

1 个答案:

答案 0 :(得分:1)

这是一个错误

for(int i = 0; i<vertexCount + 1; i++)

应该是

for(int i = 0; i<vertexCount; i++)

我们将数组从零开始计算的原因是您不必添加数组。

这是另一个错误

for(int i = 0; i<vertexCount; i++)
{
    float* temp = new float[3];
    vertices[i] = temp;
    delete temp;
    temp = 0;
}

应该是

for(int i = 0; i<vertexCount; i++)
{
    vertices[i] = new float[3];
}

由于某种原因,您分配内存,立即再次释放它,但继续使用顶点数组中释放的内存。那会很快崩溃。

第三个(希望是最后的)错误是

*vertices = new float[vertexCount];

应该是

vertices = new float*[vertexCount];

要模拟2D数组,第一个维度是浮点指针的数组。这就是固定代码分配的内容。