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

C Discussion :

Problème avec les listes chaînées


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 4
    Points
    4
    Par défaut Problème avec les listes chaînées
    Bonsoir,

    Je viens vous appeler à l'aide après avoir essayé de résoudre mon problème pendant des heures, sans succès.

    Je dois faire un freecell (oui, le jeu) en C pour un projet de ma fac.
    Problème: j'ai voulu faire le malin en utilisant des listes chaînées, mais je n'arrive pas à m'en sortir.

    j'arrive à déplacer les cartes une par une, mais j'ai du mal à en déplacer plusieurs d'un coup.


    J'ai en variables globales les tableau représentant les piles de cartes du jeu


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    dblist depart[NB_PILES]; // les cartes, telles qu'elles sont disposées au départ (7 piles)
    dblist libre[4];
    dblist win[4];

    Tout se passe bien pour sélectionner plusieurs cartes, j'ai également une fonction chargée de vérifier si le déplacement est autorisé.

    J'effectue un popback (supprimer dernier élément) dans la liste source, et je fais un pushfront (pousser une carte en première place) dans une pile temporaire.

    Si le déplacement n'est pas autorisé, je remets les cartes où elles étaient.

    Et c'est bien là le problème, j'ai beau faire mon pushback, ma liste de départ ne change jamais.

    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
    void deposeListeCartesSansVerif(dblist source, char destination,int longueur)
    {
        int i;
        int laCase;
     
        carte carteTmp;
     
     
        printf("il faut remettre les cartes en places...\n");
     
     
     
        for(i=0;i<longueur;i++)
        {
     
            if(destination>='0' && destination<='7')
            {
                laCase=destination-'0';
                printf("la case: %d",laCase);
                carteTmp = PopBack(&source);
                printf("\n WHILE: Carte popee: %c%c\n",carteTmp.numero,carteTmp.motif);
                PushBack(&depart[laCase],carteTmp);
                View(depart[laCase]);
                printf(" %d\n",i);
            }
            else if(destination>='A' && destination<='D')
            {
                laCase=destination-'A';
                carteTmp = PopBack(&source);
                printf("\n WHILE: Carte popee: %c%c\n",carteTmp.numero,carteTmp.motif);
                PushBack(&libre[laCase],carteTmp);
                printf("%d\n",i);
            }
     
            printf(" - %d",i);
        }
     
     
     
    }
    J'ai effectué plein de tests pour voir d'où venait le problème, c'est pour ça que le code n'est plus très présentable. Veuillez m'en excuser.
    Tout se passe bien jusqu'au popback final, puis le pushback ne se fait pas et je perds mes cartes dans la matrice...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    PushBack(&libre[laCase],carteTmp);

    Autres infos:
    La fonction Pushback (normalement 100% fiable puisque provenant d'ici)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void PushBack(dblist *l, carte val)
    {
       elem *nouv = malloc(sizeof(elem));
       if(!nouv) exit(EXIT_FAILURE);
       nouv->value = val;
       nouv->prev = l->last;
       nouv->next = NULL;
       if(l->last) l->last->next = nouv;
       else l->first = nouv;
       l->last = nouv;
    }

    Mes types dblist et carte

    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
    typedef char type;
            typedef char figure;
            typedef struct str_carte
            {
                type numero;
                figure motif;
     
            }carte;
     
     /*  Structure représantant un élément de la liste. */
     
            typedef struct elem
            {
                    carte value;
                    struct elem *prev;
                    struct elem *next;
            } elem ;
     
     /*  Structure d'accés à la liste. */
     
            typedef struct
            {
              elem *first;
              elem *last;
            }dblist;
    Pour le code complet, c'est ici http://dl.dropbox.com/u/1872008/lchain%20-%20Double.rar

    Merci d'avance !

  2. #2
    Expert éminent sénior
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Points : 13 926
    Points
    13 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    carteTmp = PopBack(&source);
    Extrait bien la dernière carte de la dblist source et met à jour les pointeurs de la dblist source.
    L'ennui est que la dblist source n'est qu'une copie de la dblist d'origine qui elle est inchangée, notamment son pointeur last (et first) qui maintenant est dans les décors.

    On devrait avoir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    void deposeListeCartesSansVerif(dblist *source, char destination,int longueur)
    ....
    carteTmp = PopBack(source);
    Remarque accessoire :
    freecell.h : Il ne faut pas définir de variables (jeu) dans un .h. On peut les déclarer en extern.

  3. #3
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 7
    Points : 4
    Points
    4
    Par défaut
    Merci pour cette réponse, en effet c'était bien un problème de pointeur.

    J'essaierai de faire attention la prochaine fois !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. problème avec les listes chaînées : suite
    Par ChPr dans le forum Langage
    Réponses: 11
    Dernier message: 18/09/2013, 10h08
  2. problème avec les listes chaînées.
    Par ChPr dans le forum Langage
    Réponses: 3
    Dernier message: 12/09/2013, 15h54
  3. Problème avec les listes chaînées
    Par yous18 dans le forum C
    Réponses: 38
    Dernier message: 25/10/2007, 22h30
  4. [TP 7] Problème avec les listes chaînées (error 202)
    Par thelinekioubeur dans le forum Turbo Pascal
    Réponses: 4
    Dernier message: 06/12/2006, 23h15

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