Bonjour,

Je dois faire un projet en C pour mon école d'ingénieur. Je programme une sorte de shoot-em up. Or, lors de mes tests de collisions j'ai de temps en temps un fonctionnement innatendu de ma fonction,c'est à dire qu'elle se transforeme en boucle infinie...

J'utilise le code suivant :

(list représente une liste simplement chainée).

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
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
 
void Update_CheckCollision(PlayData* Data)
{
    list PlanesPrev = NULL;
    list MissilePrev = NULL;
    list MissileCurr= Data->missiles;
    list PlanesCurr = Data->planes;
    list tmp;
 
    while (MissileCurr!=NULL)
    {
        list PlanesCurr = Data->planes;
 
        while (PlanesCurr != NULL)
        {
            if(((Missile*)MissileCurr->data)->position.x > ((Plane*)PlanesCurr->data)->position.x - ((Plane*)PlanesCurr->data)->size.x/2  &&
                ((Missile*)MissileCurr->data)->position.x < ((Plane*)PlanesCurr->data)->position.x + ((Plane*)PlanesCurr->data)->size.x/2  &&
                ((Missile*)MissileCurr->data)->position.y > ((Plane*)PlanesCurr->data)->position.y - ((Plane*)PlanesCurr->data)->size.y/2  &&
                ((Missile*)MissileCurr->data)->position.y < ((Plane*)PlanesCurr->data)->position.y + ((Plane*)PlanesCurr->data)->size.y/2)
            {
                if(MissilePrev == NULL)
                {
                    tmp = Data->missiles;
                    if (Data->missiles->next != NULL)
                        Data->missiles = Data->missiles->next;
                    MissileCurr = Data->missiles;
                    free(tmp);
                }
                else
                {
                    MissilePrev->next = MissileCurr->next;
                    free(MissileCurr);
                    MissileCurr = MissilePrev;
                }
                if (--(((Plane*)PlanesCurr->data)->life) <= 0)
                {
                    if (PlanesPrev == NULL)
                        {
                        tmp = Data->planes;
                        if (Data->planes->next != NULL)
                                Data->planes = Data->planes->next;
                            PlanesCurr = Data->planes;
                            free(tmp);
                        }
                    else
                    {
                        PlanesPrev->next = PlanesCurr->next;
                        free(PlanesCurr);
                        PlanesCurr = PlanesPrev;
                    }
                }
            } 
            //printf("%i\t%i\n", PlanesCurr, PlanesCurr->next);
            PlanesPrev = PlanesCurr;
            PlanesCurr = PlanesCurr->next;
        }
        MissilePrev = MissileCurr;
        MissileCurr = MissileCurr->next;
    }
    printf("Done");
}
Si je décommente le printf (printf("%i\t%i\n", PlanesCurr, PlanesCurr->next), j'obtient :

Nom : Values.png
Affichages : 1822
Taille : 12,4 Ko

Je me retrouve avec des liste pseudo-circulaires alors que ce sont des listes génériques simples.

Si vous avez une idée d'où pourrait venir mon problème, je suis tout ouïe

Merci d'avance de votre aide !