2013-03-02 2 views
0

Je suis un peu nouveau à C et j'essaye d'écrire un remake de serpent simple. Vous pouvez voir la source sur github: https://github.com/blackwolf12333/Snakesegfault probablement à cause de problèmes de pointeur

Lors de la construction, il n'y a pas d'avertissement ou d'erreur dans la sortie. Mais quand j'exécute l'exécutable et que j'appuie sur Enter it exit avec "Segmentation fault (core dumped)". Je ne suis pas encore un pro avec des pointeurs, je viens de java, et en googlant j'ai trouvé que c'est probablement un problème avec les pointeurs. Je n'ai aucune idée de ce qui ne va pas parce que, pour autant que je sache, je fais les choses correctement. Le problème est quand j'essaye de faire une boucle dans le corps de mon serpent.

void print_snake() { 
     int i; 
     body_part *next = main_snake.head.next; 

     move(main_snake.head.pos.x, main_snake.head.pos.y); 
     addch('$'); 
     for(i = 0; i < main_snake.length; i++) { //TODO: segfaults when 'main_snake.length'(should be this) instead of 'main_snake.length - 1' 
      printf("1 part"); 
      print_body_part(next); 
      next = next->next; 
     } 
    } 

Cela provient du fichier snake.c dans le référentiel.

J'espère que vous les gars peuvent me aider, salutations blackwolf12333

Répondre

0

Si vous voulez parcourir une liste chaînée, n'utilisez pas une condition d'arrêt séparée. Votre variable i et main_snake.length ne sont pas nécessaires. Vous pouvez remplacer

for(i = 0; i < main_snake.length; i++) 

avec

body_part *next; 
for(next = main_snake.head.next; next->next != NULL; next=next->next){ 
    ... 
} 
+0

je vais essayer cette première chose demain :) – blackwolf12333

1

Avant d'aller en profondeur dans le code, il est évident que lorsque next devient nulle et next->next les causes de segmentation faute.

Dans la boucle vous commencez à un noeud à côté de la tête (main_snake.head.next). Par conséquent, dans une liste de 4 objets, vous ne traitez que 3 objets. Dans ce cas, les itérations doivent être de 3 au lieu de 4 car main_snake.length compte également la tête comme indiqué dans la fonction initialize_snake. C'est pourquoi vous obtenez une erreur de segmentation.

+0

Je me rends compte que, mais cela ne devrait pas se produire parce que la longueur ne doit jamais être plus grand que le montant de la prochaine de – blackwolf12333

+0

Permettez-moi de vérifier si tel est le problème, serait être vraiment stupide: P – blackwolf12333

+0

Je compte la tête comme partie aussi la longueur de 4 devrait être correcte. Aussi poussé un nouveau commit ... – blackwolf12333

Questions connexes