2011-11-11 2 views
0

링크 된 입자 목록이 있습니다. 나는이 입자들을 하나씩 움직이게 만들고 싶다. 그러기 위해서는 연결된 목록의 모든 입자를 반복해야하며, 마지막 입자에 도달하면 첫 번째 입자로 돌아가고 싶습니다. 하지만 제 프로그램은 그렇게하지 않습니다.링크 된 목록이 제대로 루핑되지 않음

int particle_update(struct particle **head){ 
    struct particle *current = *head; 
    struct particle *next; 
    printf("particle_update\n"); 

    while(current != NULL){ 
     while(current != NULL && current->lifespan >=0){ 
      current->lifespan --; 

      current->pos.y = current->pos.y + (current->spd.y * current->dir.y); 
      current->pos.x = current->pos.x + (current->spd.x * current->dir.x); 
      current->pos.z = current->pos.z + (current->spd.z * current->dir.z); 

      current = current->next; 
      if (current == NULL) 
       current = *head; 
     } 
    } 

    particle_destroy(head); 
    return 0; 
} 
+2

그래서 여기에 수술을 처리하기위한 더 나은 대안이다. ** ** 무엇을하고 있습니까? 그리고 문제를 디버깅하기 위해 무엇을 했습니까? –

+0

나는 printf를 추가하여 루프가 멈추는 위치를 확인하고 lifespan = 1 일 때 멈추고 프로그램이 충돌합니다. 그것은 머리로 돌아 가지 않습니다. 이것은 if 문에 전혀 가지 않았 음을 의미합니다. – livelaughlove

+0

다음 단계는 왜 추락했는지 확인하는 것입니다. 디버거에서 이것을 실행하여 알아 내야합니다. –

답변

1

I있어 많은 문제가있다 느낌 ....

하나 ....이 이상하다 ... 그것이 있어야

while(current->lifespan >= 0 && current != NULL){ 

while(current != NULL && current->lifespan >= 0){

즉, null이 아닌 경우에만 먼저 null이 아닌지를 확인하고, 현재의 수명이 무엇인지 확인합니다. 당신이 가지고있는 방법, 그것은 충돌 가능성이 높습니다

또한, 나는 당신이 첫 번째로 다음으로 이동하려는 경우 확실하지 않아? 내 생각에 그것은 루프 내에서 마지막으로해야 할 일이라고 생각합니다.

외부 루프는 원하는대로 내부 루프를 얻으면 영원히 반복됩니다.

+0

그리고 끝에 대한 테스트 == NULL - 아마 다른 곳에서 더 유용 할 것입니다. –

+0

실제로 끝나면 끝까지 가야합니다. 나는 현재 = 현재 -> 다음이 바로 앞에 와야한다고 생각합니다. 그 체크 –

+0

나는 제안에 따라 코드를 약간 변경했다. 전에 ... 입자가 초기화되면 프로그램이 충돌합니다. 이제 입자가 전혀 초기화되지 않습니다 (검은 색 화면). 연결된 목록이 무한 루프됩니다. – livelaughlove

0

여기에 무슨 일이 일어나고있는지는 입자를 수정하기 전에 입자를 파괴하는 것이고,이 경우의 부적절한 처리가 당신을 트립하는 것입니다.

먼저 링크 된 목록의 마지막 노드에 도달하면 while 루프가 시작될 때 current = current -> next이라고 말하면서 끝내 호출해야합니다.

결과적으로 null이되어 null 포인터를 참조 해제 할 때 current->position을 호출 할 때 BAD_EXEC 오류가 발생합니다. 대신 while 루프 끝에서 현재 값을 증가시켜 널 포인터를 참조 해제하지 마십시오.

다음으로 머리에 전류를 가리키면 입자 만료를 제외하고는 결코 루프를 종료하지 않는다는 것을 의미합니다. 이는 내가 원하는 것과 다를 것이라고 추측합니다 (그렇지 않으면 while (1)을가집니다).

int particle_update(struct particle **head){ 

    struct particle * current = *head; 
    struct particle * prev = NULL; 

    while (current != NULL) { 
     // lifespan check 
     current->lifespan = (current -> lifespan > 0) ? current->lifespan-1:particle_destroy(&prev, &current); 

     // update position of current 
     ... 


     // increment counter at end of while loop 
     prev = current; 
     current = current -> next; //now current is always one node ahead of previous. 
    } 

    return 0; 
} 

는 그런 다음, 입자가 함수가 될 것이다 파괴 :

void particle_destroy(struct particle ** prev, struct particle ** current) { 
    if (*current = NULL) return; //nothing to do 

    struct particle * tmp = *current; 
    if (*prev != NULL) { /* need to modify previous node */ 
     (*prev) -> next = current -> next; 
    } else { /* head has expired, so change head ptr to next node */ 
     (*current) = (*current) -> next; 
    } 

    /* free resources */ 

    // do other clean-up, if necessary. 
    free(tmp); 

    return; 
} 
관련 문제