2011-11-11 88 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来查看循环停止的位置,并在寿命= 1时停止,然后程序崩溃。它不回去头,这意味着它没有去if语句在所有 – livelaughlove

+0

下一步是建立为什么它坠毁。你应该在调试器中运行以查明。 –

回答

1

我有一种感觉,有一些问题....

一个....这是奇怪...

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

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

这意味着它将首先检查它不为空,并且只有当它不为空时,它才会尝试查看current-> lifes是什么。你有它的方式,它可能会崩溃

也,我不知道你是否想要移动到下一个作为第一件事?我认为这可能是你想要在循环中做的最后一件事情,当你得到内部循环做你想做的事时,外部循环将永远循环。

+0

并在最后的测试电流== NULL - 也许这应该是在其他地方更有用 –

+0

这就是实际上是说,如果我们已经走到了尽头,去年初,我认为当前=电流 - >接下来应该正确之前来检查 –

+0

我已经根据你的建议对代码进行了一些更改。之前...粒子得到初始化,然后程序崩溃。现在的颗粒不初始化所有(黑屏),和LinkedList的无限循环 – livelaughlove

0

我怀疑这里发生的是破坏你需要在它之前修改粒子的粒子,而对这种情况的不恰当处理是让你绊倒的原因。

首先,只要你打的最后一个节点的链表,你在你的while循环的开始叫current = current -> next而你应该在年底调用它。

因此,当前为空,所以当您在解除引用空指针时调用current->position时,您将遇到BAD_EXEC错误。相反,在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; 
}