-4

こんにちは、最近 DirectX9 を使用していて、このエラーに遭遇しました。DirectXとは関係ありませんが。これが私が持っているものです。

struct D3DVertex
{
    float x, y, z;
    DWORD Color;
};


int main()
{
    D3DVertex *TestShape = new D3DVertex();

        TestShape[0].x = 0.0f;
        TestShape[0].y = 2.0f;
        TestShape[0].z = 0.5f;
        TestShape[0].Color = 0xffffffff;

        TestShape[1].x = -2.0f;
        TestShape[1].y = -2.0f;
        TestShape[1].z = 0.5f;
        TestShape[1].Color = 0xffffffff;

        TestShape[2].x = 2.0f;
        TestShape[2].y = -2.0f;
        TestShape[2].z = 0.5f;
        TestShape[2].Color = 0xffffffff;

return 0;
}

これを実行すると、これを示す実行時エラーが発生します。

Windows has triggered a breakpoint in x.exe.

This may be due to a corruption of the heap, which indicates a bug in x.exe or any of the DLLs it has loaded.

This may also be due to the user pressing F12 while x.exe has focus.

The output window may have more diagnostic information.

しかし、この行を削除TestShape[2].z = 0.5f;すると、エラーはなくなります。なぜこれが起こるのか、どうすれば修正できますか。助けてください。

4

1 に答える 1

4

メモリ内に単一のオブジェクトを作成しています:

D3DVertex *TestShape = new D3DVertex();

そして、配列のようにアクセスしています

TestShape[x] ...

それが問題です。配列がありません。オブジェクトは 1 つです。

配列を作成します。

D3DVertex *TestShape = new D3DVertex[3];

これで、タイプ の 3 つのオブジェクトができD3DVertexました。

覚えておくべき重要な点は、ポインターは配列ではないということです。ポインターを取得するのは、関数に引数として渡したときに配列がポインターに崩壊したときだけです。次に、配列の最初の要素へのポインターを取得します。

さらに良いのは、 a を使用し、std::vector<D3DVertex> TestShape;ポインターの処理について心配しないことです。

D3DVertex foo; //create object.

TestShape.push_back(foo); //add it to your vector.

operator[]チェックされていないアクセスまたはat(index)境界チェックされたアクセスを使用して、ベクトルにアクセスできます

D3DVertex f = TestShape[0]; //Get element zero from TestShape. 

ベクトルを調べて各要素を見たい場合:

for (std::vector<D3DVector>::iterator it = TestShape.begin(); it != TestShape.end(); ++it) // loop through all elements of TestShape.
{
     D3DVector vec = *it; //contents of iterator are accessed by dereferencing it
     (*it).f = 0; //assign to contents of element in vector.
}
于 2013-03-10T12:42:35.480 に答える