2

地面の頂点を手動で組み立てることで、DirectX9 を使用していくつかの単純な地形に取り組んでいます。

ただし、インデックスを設定するコードの一部でエラーが発生します。

Windows は、test.exe でブレークポイントをトリガーしました。

これは、ヒープの破損が原因である可能性があります。これは、test.exe または読み込まれた DLL のバグを示しています。

これが問題を引き起こしているコードの一部であり、インデックスポインターにリンクされていることはほぼ100%確信していますが、終了したら削除します...だから、何が問題は。

int total = widthQuads * heightQuads * 6;
DWORD *indices = new DWORD[totalIdx];
for (int y = 0; y < heightQuads; y++)
{
    for (int x = 0; x < widthQuads; x++)
    { //Width of nine:
        int lowerLeft = x + y * 9;
        int lowerRight = (x + 1) + y * 9;
        int topLeft = x + (y + 1) * 9;
        int topRight = (x + 1) + (y + 1) * 9;
        //First triangle:
        indices[counter++] = topLeft;
        indices[counter++] = lowerRight;
        indices[counter++] = lowerLeft;
        //Second triangle:
        indices[counter++] = topLeft;
        indices[counter++] = topRight;
        indices[counter++] = lowerRight;
    }
}

d3dDevice->CreateIndexBuffer(sizeof(DWORD)* total, 0, D3DFMT_INDEX16, 
    D3DPOOL_MANAGED, &groundindex, 0);
void* mem = 0;
groundindex->Lock(0, 0, &mem, 0);
memcpy(mem, indices, total * sizeof (DWORD));
groundindex->Unlock();

delete[] indices;

このブロックを削除すると、プログラムは正常に実行されます。

4

2 に答える 2

2

あなたが与えたコードは問題ないように見えます - 1 つの注意点があります: の初期値はcounterコード自体にはありません。したがって、 から開始しないか、他のコードがバッファcounter = 0を踏みつけています。indices

これがヒープ破損の美点です。バグがコードの削除された部分にあるという保証はありません。コードの別の場所に存在するバグを単に隠している可能性があります。

于 2012-05-14T15:55:04.090 に答える
0
int total = widthQuads * heightQuads * 6;
DWORD *indices = new DWORD[totalIdx];

「new DWORD[total];」をしているはずではありませんか?ここ?

于 2012-05-14T16:09:48.453 に答える