IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Bibliothèque standard C Discussion :

Parcours double d'une liste chainée


Sujet :

Bibliothèque standard C

  1. #1
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut Parcours double d'une liste chainée
    Bonjour,

    je recontre en ce moment un phénomène que je qualifierai de paranormal dans une fonction c. Cette fonction sert à gérer les collisions entre des rect sdl.

    ListeAnimal est une liste chainée (déclaré en pointeur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    typedef struct TCellAnimal {
        struct Animal ani;
        struct TCellAnimal *suc;
    }TypeCelluleAnimal;
     
    typedef TypeCelluleAnimal *ListeAnimal;
    Voici le code :

    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
    ListeAnimal chercheCollision(ListeAnimal la) {
        ListeAnimal tmp = la;
        ListeAnimal tmp2 = la;
        for (tmp ; tmp != NULL ; tmp=tmp->suc) {
            printf("tmp ext : %d\n",tmp->ani.numeroAnimal);
            for (tmp2 ; tmp2 != NULL ; tmp2=tmp2->suc) {
                printf("tmp int : %d\n",tmp->ani.numeroAnimal);
                printf("tmp2 : %d\n",tmp2->ani.numeroAnimal);
                if (tmp->ani.numeroAnimal != tmp2->ani.numeroAnimal) {
                    if (collisionEntreDeux(&tmp->ani,&tmp2->ani) == 1) {
                        printf("collision !\n");
                        if (strcmp(tmp->ani.espece,tmp2->ani.espece) == 0 ) {
     
                               //reste du code (assez long)
     
                        }
                    }
                }
            }
        }
        return la;
    }
    le soucis c'est que les printf donnent ceci :
    tmp ext : 9
    tmp ext : 8
    tmp ext : 7
    tmp ext : 4
    tmp ext : 6
    tmp ext : 5
    tmp ext : 3
    tmp ext : 2
    tmp ext : 1
    tmp ext : 10
    tmp int : 10
    tmp2 : 10
    tmp int : 10
    tmp2 : 9
    tmp int : 10
    tmp2 : 8
    collision !
    tmp int : 10
    tmp2 : 7
    tmp int : 10
    tmp2 : 4
    tmp int : 10
    tmp2 : 6
    tmp int : 10
    tmp2 : 5
    tmp int : 10
    tmp2 : 3
    collision !
    tmp int : 10
    tmp2 : 2
    tmp int : 10
    tmp2 : 1
    tmp ext : 9
    tmp ext : 8
    tmp ext : 7
    tmp ext : 4
    tmp ext : 6
    tmp ext : 5
    tmp ext : 3
    tmp ext : 2
    tmp ext : 1

    Le soucis c'est que le tmp reste le même à l'intérieur de la deuxième boucle ..
    j'ai essayé avec des while, même résultats.

    Alors soit c'est très bête et j'ai du mal avec mes yeux, soit c'est une histoire de pointeur un peu subtil!

    Merci

  2. #2
    Futur Membre du Club
    Inscrit en
    Mai 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Mai 2009
    Messages : 10
    Points : 9
    Points
    9
    Par défaut
    En fait je viens de trouver ..

    il suffit de ré initier tmp2 avant de rentrer dans la deuxième boucle;

    normale, le pointeur de tmp2 était sur le dernier chainon null ^ ^


  3. #3
    Membre habitué
    Profil pro
    Étudiant
    Inscrit en
    Avril 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Avril 2007
    Messages : 181
    Points : 199
    Points
    199
    Par défaut
    Si, comme ton code le laisse supposer, tu cherches à détecter toutes les paires de "struct Animal" qui sont superposées, tu peux optimiser ton parcours en remplaçant le deuxième for par :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for (tmp2 = tmp-suc ; tmp2 != NULL ; tmp2=tmp2->suc) {
    Chaque paire sera ainsi détecter qu'une seule fois : si A est en collision avec B, B est forcément en collision avec A

Discussions similaires

  1. Réponses: 8
    Dernier message: 21/01/2014, 19h21
  2. Réponses: 2
    Dernier message: 20/10/2012, 22h07
  3. Réponses: 2
    Dernier message: 22/05/2009, 15h06
  4. [Stratégie]Sauvegarde d'une liste chainée dans un fichier
    Par BernardT dans le forum Général Java
    Réponses: 17
    Dernier message: 25/07/2005, 17h04
  5. manipulation d'une liste chainé
    Par sorari dans le forum C++
    Réponses: 1
    Dernier message: 16/03/2005, 12h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo