0

在我看来,我有一个无辜的循环,它迭代在编译时类型未知的数组元素;我的数组名为mesh->vertices,是一个指向void的指针。根据网格->纹理的真值,我需要以不同的方式考虑数组。顺便说一句,下面代码段中的 if 和 else 中的代码是相似的,但我确实需要区分两种情况。

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);

看起来像迭代网格->顶点元素,铸造它们并进行指针运算,正在破坏内存。我认为我的问题是 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 编程,但我没有得到你想要通过添加ito来做的事情ptr,这大概是你所说的指针算法。

您是否只想访问ith struct TexturedVertexin mesh->vertices?如果是这样,只需使用您ptr[i]所写的构造。

在我看来,您正在做算术运算,ptr最终指向ith struct TexturedVertex,然后通过访问ptr[i]您正在读取th之后的i元素。如果指的是(看起来合乎逻辑,给定名称和 C 数组约定)的计数,那么您正在阅读的结尾是一个经典的缓冲区溢出错误,这毫不奇怪会导致 EXC_BAD_ACCESS 和各种其他有趣的错误。istruct TexturedVertexnVerticesverticesvertices

于 2012-08-03T00:52:54.900 回答