在我看来,我有一个无辜的循环,它迭代在编译时类型未知的数组元素;我的数组名为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);