好的,所以我正在开发一个小程序,使用递归函数随机生成单张地形,在四个给定点之间进行细分,并且地形由四边形组成。在每次递归时找到的中心点给出一个随机高度值,然后将所有顶点保存到一个数组中,然后在绘制时循环。
最初,我正在定义用于在堆栈上存储顶点的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类抛出。谁能在这里看到任何错误?
答案 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数组,第一个维度是浮点指针的数组。这就是固定代码分配的内容。