Bonjour, dans mon jeu j'ai créer une liste simplement chainé qui contient les données des mes balles il y a :
Ensuite j'ai une autre struct ou une des variables pointe sur la struct dataImg la voici :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 typedef struct dataImg dataImg; struct dataImg { int x, y; /*position dans la SDL */ int vx, vy; /*vecteur vitesse*/ int count; /*un conteur qui dit quand la balle a été touché 4 fois elle disparait */ char ScrPos; /*L'écran est divisé en 4 partie, la valeur ScrPos vaut soit 0 1 2 3 en fonction de sa position dans une des4 partie de l'écran*/ SDL_Rect ImgSpr; /*contient les coordonnées de l'image dans le sprite*/ dataImg* next; };
Donc voilà mon problème il ce situe au niveau du partage de l'écran je vous explique : j'ai une fonction qui récolte les positions de chaque balle a l'écran si une ball est dans le coin inférieur (je me base sur les origines de la SDL) droit je met PosScr à 0, si la balle est dans coin supérieur droit je mets 1 si on est dans le coin supérieur gauche je mets 2 et si je suis dans le coin inférieur gauche je mets 3.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10 typedef struct dataImageScr { dataImg* ball; /*C'est le pointeur qui pointe sur ma liste*/ dataImg ship; dataImg shoot; dataImg flashShipL; dataImg flashShipR; int NbBallScr; int count0,count1,count2,count3;/*Nb ball in each of 4 section of screen */ }dataImageScr;
Et donc ensuite ce que je souhaite c'est comparé toutes les coordonnées des balles qui ont un ScrPos identique pour faire mes collisions.
Et donc comme dans ma liste les ScrPos ne sont pas dans l'ordre je souhaitais trié ma liste dans l'ordre croissant avant de faire mes test de collisions et c'est la que l'on arrive au fond du problème c'est que j'ai un seg fault quand je fait mon tri.
Pourriez-vous m'aider à trouver l'erreur ; dans mon code le problème ce situe quand je fait C=C->next
car quand ensuite je fait mon if donc :
dans C->next->ScrPos C->next vaut NULL alors que le tri n'est pas terminé comme si j'étais arrivé a la fin alors que je ne suis pas arrivé a la fin de ma liste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part if(C->ScrPos > C->next->ScrPos)
Pour mon tri je changes les adresses. J'utilise le tri a bulle qui est conseillé pour des tris de moins de 20 valeurs.
Voici ma fonction de tri :
Sinon si je ne veut pas modifié les pointeurs de mes cellules je suis obligé de transférer toutes les donné de la cellule dans l'autre, en fonction de ScrPos ce que je trouve reloud je préfère changer la dispositions des cellules de ma liste.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34 void clash_sortBallSplitScr(dataImageScr* D) { dataImg* C=NULL; dataImg* F=NULL; int i,j; int nb=D->NbBallScr-1; int nb1=nb; for(j=0;j<nb;j++) { C=D->ball; F=D->ball; /*while(C->next!=NULL)*/ for(i=0;i<nb1;i++) { if(C->ScrPos>C->next->ScrPos) /*sa plante au niveau de C->next qui vaut NULL alors que la boucle n'a pas fini de s'exécuter*/ { if(i==0) D->ball=C->next; /*pour toujours garder l'adresse de la tête */ F->next=C->next; F=C->next; C->next=C->next->next; F->next=C; C=F; } C=C->next; /*l'erreur est ici et se matérialise au if*/ } nb1--; } }
Ou bien de créer une autre liste et de copié dans celle-ci les donné de la cellule en mettant dans l'ordre croissant en me basant sur ScrPos.
Partager