簡體   English   中英

OpenGL:Glut.h訪問沖突

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM