0

コンパイル時に型が不明な配列の要素を反復処理する無害なサイクルに見えるものがあります。私の配列は mesh->vertices という名前で、void へのポインタです。mesh->textured の真の値に応じて、配列を別の方法で考慮する必要があります。ちなみに、以下のコード セグメントの if と else のコードは似ていますが、2 つのケースを区別する必要があります。

void TransformMesh(struct Mesh *mesh, struct Matrix4 *t)
{
    for (int i = 0; i < mesh->nVertices; ++i)
    {
        if (mesh->textured)
        {
            struct TexturedVertex *ptr = ((struct TexturedVertex *)mesh->vertices) + i;

            ptr[i].position = MatrixPointMultiply3(t, &ptr->position);
            ptr[i].normal = MatrixPointMultiply3(t, &ptr->normal);
        }
        else
        {
            struct Vertex *ptr = ((struct Vertex *)mesh->vertices) + i;

            ptr[i].position = MatrixPointMultiply3(t, &ptr->position);
            ptr[i].normal = MatrixPointMultiply3(t, &ptr->normal);
        }
    }
}

自動参照カウント オプションを付けてプロジェクトを作成し、C コードには影響しないと思っていたのですが、今では間違っているように感じます (ちなみに、どのオプションを選択したかを確認するにはどうすればよいでしょうか?)。

この関数は、別の配列 (mesh->triangles と呼ばれる) で何か問題を起こしているようで、おそらくそれを解放しています。ベクターを使用しようとすると、EXC_BAD_ACCESS エラーが発生します。

glDrawElements(GL_TRIANGLES, mesh->nTriangles * 3, GL_UNSIGNED_INT, mesh->triangles);

mesh->vertices 要素を反復し、それらをキャストしてポインター演算を実行すると、メモリが破損しているようです。私の問題は ARC だと思うので、ここで説明したことを実行しようとしましたが、うまくいきませんでした。

編集:

Conrad Shultz が指摘したように、上記のコードは間違っていました。以下は正しいです。

            ptr->position = MatrixPointMultiply3(t, &ptr->position);
            ptr->normal = MatrixPointMultiply3(t, &ptr->normal);
4

1 に答える 1

2

私は、ARC がこれと関係があることを真剣に疑っています。ARC は Objective-C オブジェクトのみを管理します。(Core Foundation 型の処理方法さえ知らないため、__bridge...キーワードを使用する必要があります。)

あなたのコードを理解するのに苦労しています。確かに、私はストレートな C プログラミングをあまり行っていませんが、おそらくあなたが話しているポインター演算である に追加iすることによって、あなたがやろうとしていることを理解できません。ptr

iのthstruct TexturedVertexにアクセスしようとしていますmesh->verticesか? その場合は、記述どおりに構成を使用してくださいptr[i]

thptrを指すことになるような算術演算を行っているように見えます。アクセスすることで、 thを超えた要素を読み取っています。のカウントを参照する場合(名前と C 配列の規則を考えると、論理的に見えるように)、 の末尾を超えて読み取ります。これは、当然のことながら、EXC_BAD_ACCESS やその他のあらゆる種類の楽しいエラーにつながる、古典的なバッファー オーバーフロー エラーです。istruct TexturedVertexptr[i]iistruct TexturedVertexnVerticesverticesvertices

于 2012-08-03T00:52:54.900 に答える