2012-08-03 3 views
0

나는 컴파일 타임에 타입을 알 수없는 배열 요소를 반복하는 순진한 사이클을 본다. 내 배열 이름은 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); 
+2

ARC는 Objective-C 개체에만 영향을줍니다. 이 코드의 문제점은 무엇인지 모르겠지만 ARC가 아닙니다. – zpasternack

+0

zpasternak, 고맙습니다. 그게 내 초기 추측 이었지만 의심스러워졌습니다. 나는 C 부분이 실제로 C라는 것을 듣게되어 기쁘다. – damix911

답변

2

나는 심각하게 ARC이와 아무 상관이 의심 - ARC는 목표 - C 객체를 관리합니다. (핵심 기초 유형을 처리하는 방법조차 모르기 때문에 __bridge... 키워드를 사용해야합니다.)

코드를 이해하는 데 어려움을 겪고 있습니다. 시피, 나는 똑바로 C 프로그래밍을 많이하지는 않지만, iptr에 추가하여 수행하려는 작업을 얻지는 못합니다. 이는 아마도 여러분이 말하는 포인터 연산 일 것입니다.

istruct TexturedVertexmesh->vertices에 액세스하려고합니까? 그렇다면 작성한대로 ptr[i] 구문을 사용하십시오. 당신은 당신이 istruct TexturedVertex 과거 i 요소를 읽고 ptr[i]에 액세스하여, ptristruct TexturedVertex를 가리키는 끝하도록 계산을하고있는 것처럼

그것은 나에게 보인다. nVerticesvertices의 수를 나타낼 경우 (이름 및 C 배열 규칙이 주어지면 논리적으로 보일 수 있음)끝에서 과거의 버퍼 오버플로 오류 인 EXC_BAD_ACCESS 및 기타 모든 종류의 오류가 발생합니다. 재미있는 오류.

+0

Conrad Schultz 당신은 위버권이다. 나는 iPad에서 이상한 행동을하기 때문에 ptr [i] 스타일과 ptr + i 스타일 사이를 몇 번 바꿨다. (검은 화면, 왜 그런지 모르겠다) 결국 코드는 두 번 똑같은 일을 끝냈다. 실제로 2 * nVertices 요소에 액세스했다. 에뮬레이터로 전환했을 때 EXC_BAD_ACCESS 오류가 발생했지만 이상한 점은 내 "잘못된"함수에서 발생하지 않았지만 나중에 코드의 다른 부분에서 발생한 것입니다. 이제 모든 것이 잘 작동합니다. 감사합니다. – damix911

+0

@ damix911 다행 이군. 이것은 메모리 버그에 대한 불쾌한 점입니다. 배열의 끝에서 뭔가를 얻을 수 있습니다. 컴파일러는 여러분이 생각한대로 행복하게 캐스팅합니다. 언젠가 길을 따라 가면 그 가짜 데이터를 사용하고 모든 것이 폭발합니다. 그들은 까다 롭습니다. –

관련 문제