[英]OpenGL: Glut.h Access Violation
好的,所以我正在開發一個小程序,該程序使用遞歸函數在四個給定點之間進行細分,從而隨機生成一張地形圖,並且該地形由四邊形組成。 在每次遞歸中找到的中心點都被賦予一個隨機的高度值,然后所有的頂點被保存到一個數組中,然后在繪制時循環遍歷。
最初,我定義的是用於將頂點存儲在堆棧上的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數組(其他地方有一些更改)時,該代碼似乎可以工作,但是當在主函數中調用glutInit時,此代碼在下一行的Glut.h中產生未處理的異常: 486)
static void APIENTRY glutInit_ATEXIT_HACK(int *argcp, char **argv) { __glutInitWithExit(argcp, argv, exit); }
我已經看過代碼很多次了,但我看不出問題出在哪里,更奇怪的是應該從Glut.h而不是Terrain類拋出異常。 有人可以在這里看到任何錯誤嗎?
這是一個錯誤
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數組,第一維是浮點指針的數組。 這就是固定代碼分配的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.