나는 컴파일 타임에 타입을 알 수없는 배열 요소를 반복하는 순진한 사이클을 본다. 내 배열 이름은 mesh-> vertices이고 void에 대한 포인터입니다. mesh-> textured의 진리 값에 따라 배열을 다르게 고려할 필요가 있습니다. 덧붙여 말하자면 아래의 코드 세그먼트에서 if와 else의 코드는 비슷하지만 두 경우를 구별해야합니다.iPad 용 Xcode 4.3.3 Objective-C 프로젝트의 일부인 C 파일에서 C 포인터 산술 연산을 수행하려면 어떻게해야합니까?
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-에 반복처럼 보인다> 메모리를 손상되고, 그들을 캐스팅과 포인터 연산을하고, 요소를 정점. 내 문제는 ARC라고 생각하므로 here에 대해 설명했지만 행운은 없었습니다.
편집 :
위의 코드는 잘못, 콘래드 슐츠에 의해 지적; 다음은 올바른 :
ptr->position = MatrixPointMultiply3(t, &ptr->position);
ptr->normal = MatrixPointMultiply3(t, &ptr->normal);
ARC는 Objective-C 개체에만 영향을줍니다. 이 코드의 문제점은 무엇인지 모르겠지만 ARC가 아닙니다. – zpasternack
zpasternak, 고맙습니다. 그게 내 초기 추측 이었지만 의심스러워졌습니다. 나는 C 부분이 실제로 C라는 것을 듣게되어 기쁘다. – damix911