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

Dev-C++ Discussion :

[Dev-C++]Problème avec une file ...


Sujet :

Dev-C++

  1. #1
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut [Dev-C++]Problème avec une file ...
    bonjour!

    je vous expose mon petit probleme. je suis en train de programmer un petit jeu d'echecs, et je me retrouve face a un curieux phenomene.

    pour tester la validite du coup entre par l'adversaire, je genere la liste des coups possibles, que je stocke sous forme de file ( FIFO, mais peu importe ), puis je parcours la liste pour verifier que le coup entre s'y trouve bien. or, pour une raison que je n'explique pas, le programme ne considere pas le dernier element de la liste. il le saute simplement. ( en clair, si ma fonction qui genere les coups trouve 12 coups, ce qui est confirme par l'attribut nbElt de ma file, et que j'essaie de jouer le 12e ( celui qui a ete trouve en dernier ), le programme me repond qu'il s'agit d'un coup illegal, en d'autre terme lorsque je parcours ma liste pour y verifier la presence dudit coup, je ne regarde que les 11 premiers )

    ce qui est etrange c'est qu'avant d'arriver a trouver ca, j'ai fait une petite fonction qui affiche cette liste de coup a l'ecran, et celle ci fonctionne tres bien, alors qu'elle repose exactement sur le meme principe. de plus, lorsque je tente un debug, dev-c++ me signale une segmentation fault des le 2e element de la liste, alors que quand je ne suis pas en mode debug ca fonctionne ( en plus, quand il signale la segmentation fault, les pointeurs incrimines sont tous non NULL ). 3 jours que je seche, alors votre aide serait la bienvenue. Au risque de faire un peu long, je vous libre 2 3 bouts de codes :

    La fonction qui affiche la liste de coup : cette boucle while va afficher 12 coups

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    void dbg_listeCoup(int couleur)
    {
        char out[8];
        fileCoups dbg_f=trouveCoups(couleur);
     
        while(!dbg_f.isEmpty())
        {
            san_export (dbg_f.pop(),out);
            cout << out << endl;
        }
    }
    La portion qui teste la validite du coup : cette boucle while n'en voit que 11 alors que current_f.nbElt vaut bien 12

    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
     
     int valide=0;
                    cin >> buf ;
                    coup temp=san_import(buf);
     
                    while(!current_f.isEmpty())
                    {
     
                        if(temp == current_f.pop())
                        {
                            valide=1;
                            break;
                        }
                    }
                     if(valide)
                     {           
                        fait_coup(temp);
                        joue();
     
                    }else{
     
     
                        cout << "illegal move" << endl;
                        current_f=trouveCoups(yourColor);
                    }
    et (pardon ca va faire long ) le code de ma file :
    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
     
    fileCoups::fileCoups()
    {
        tete=NULL;
     
        queue=NULL;
        nbElt=0;
     
    }
    void fileCoups::push(coup c) 
    {
     
            fileItem * temp;
            temp=new fileItem;
            temp->value=c;
            temp->suivant=NULL;
     
            if ( isEmpty())
            {
                tete=temp;
                queue=temp;
     
            }else{
                queue->suivant=temp;
                queue=temp;
            }
            nbElt++;
     
    }
    coup fileCoups::pop()
    {
        fileItem * temp= tete;
     
        if ( ! isEmpty())
        {
     
            tete=tete->suivant;
            nbElt--;
            return temp->value;
        }else{
            coup c;
            c.pieceBouge=-1000;
            return c;
        }
    }
     
     
    int fileCoups::isEmpty()
    {
        return tete == NULL;
    }

  2. #2
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    hum...
    Je ne vois pas OÙ tu remets tête et queue à NULL quand tu retires le dernier élément de la file... :

  3. #3
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    ben normalement, quand on arrive au dernier element, on doit avoir :

    tete == queue == pointeur vers cet dernierElement.

    or, comme je fait gaffe quand j'ajoute un element a mettre son suivant a NULL, normalement apres avoir recuperé le dernier element, on va avoir :

    tete == dernierElement->suivant donc == NULL

    effectivement, queue n'est pas remis a NULL, mais peut ce etre la source du probleme ? a priori il n'intervient que dans l'ajout d'element, et pas dans le retrait, et pour savoir si la liste est vide je fais le test sur tete. et puis la boucle while de la fonction d'afichage ronronne ....

  4. #4
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Moi, je conseillerais de remettre quand même queue à NULL quand la file est vide, ce qui permet:
    1°) d'avoir une queue vide qui soit aussi propre qu'à la création,
    2°) de faire une fonction de test d'intégrité qui dit que tête et queue doivent être NULL simultanément ou pas du tout, et que nbElem est 0 quand la file est vide.
    (Et si ce n'est pas le cas, le programme doit gueuler)
    Cela permettrait de vérifier à tout moment l'intégrité de la structure.
    (Par exemple, un appel au début et à la fin de chaque fonction, plus dans le IsEmpty()... Et quand tu cesses de déboguer, tu vides la fonction de son contenu, si elle est inline, elle ne sera même plus appelée -> aucun problème de perf lors de la compilation finale.

  5. #5
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    mea culpa, c'est plus ou moins ce que j'avais commence a faire, mais je ne pensais pas que ce serait ca. je l'oublie a chaque fois, mais on dirait que (arretez moi si je me trompe ) quand il ya une segmentation fault dans la condition d'un if, ca n'interromps pas le programme. meme si je ne sais toujours pas pourquoi, je devais en avoir une (j'avais tete qui n'etais ni NULL ni defini ). donc j'ai simplement ajouter dans le if de mon "pop" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    if ( ! isEmpty())
        {
            if(tete!=queue)
            {
                tete=tete->suivant;
            }else{
                tete=NULL;
                queue=NULL;
            }
            nbElt--;
            c=temp->value;
            //delete temp;
            return c;
    et ca fonctionne. vais quand meme garder un oeil dessus.

  6. #6
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    j'ai parle un peu vite, ca ne fonctionne qu'a moitite. je vais assayer de suivre ces qq conseils, et je reviens si ca marche vraiment pas. merci, en tout cas !

  7. #7
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut Re: [Dev-C++]Problème avec une file ...
    Citation Envoyé par jobherzt
    je vous expose mon petit probleme. je suis en train de programmer un petit jeu d'echecs, et je me retrouve face a un curieux phenomene.
    Hum.. Tu devrais peut-être plutôt te concentrer sur la logique de ton appli et utiliser ce qui existe déjà pour le "bas-niveau" => std::queue (& deque).

    Où si tu veux vraiment tout refaire, tu blindes ce genre de facilités très propices aux erreurs. Dans un module tu ne fais que ça, et tu prévois une baterie de tests unitaires pour tester ta queue dans les cas nominaux et aux limites.

  8. #8
    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
    Je ne vois pas pourquoi dans ton code, le fait de ne pas mettre queue à NULL quand la file est vide peut plomber ton programme. Mais, je suis d'accord avec Médinoc pour la gestion de queue : il est choquant que l'état soit différent de l'état initial lorsque la file est vidée. C'est une source d'erreur pour plus tard.

  9. #9
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    apres ma petite modif et verification, ( session je fous des cout de partout pour voir ce qui se passe .. ), l'etat de la file est a priori "propre" a la fin.



    mais une idee me vient : la seule difference entre ma fonction d'affichage des coups ( qui marche ) et ma fonction de test de validite ( qui me sort des coups bidons dans la liste, genre mouvement a1a1 (correspond a l'indice 0 de mon tableau)), c'est que dans le premier cas, la file est declaree au moment ou je m'en sers :

    fileCoups f=trouveCoups(blanc)

    alors que l'autre est defini dans un .h pour pouvoir etre utilisee dans n'importe quelle fonction. l'erreur pourrait elle venir de la ?

  10. #10
    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
    alors que l'autre est defiisni dans un .h pour pouvoir etre utilisee dans n'importe quelle fonction
    Doit-on comprendre qu'il y a là deux variables différentes ? Auquel cas, le résultat n'est pas étonnant. Tu manipules une file et tu testes une autre !!!
    Que fait de toute façon la déclaration d'une variable dans un -.h . il ne devrait y avoir que des définitions de type, des prototypes ou des trucs du même genre, mais pas de variables sinon tu vas au devant des ennuis

  11. #11
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    oui, c'est vrai, je cree une file et j'en teste une autre, mais c'etait pour tester le fonctionnement de ma classe file en general, puisque je les construit de la meme maniere. mais j'ai ajoute de quoi affiche aussi la file que j'utilise reellement. en bricolant 2 3 trucs, j'arrive a la faire fonctionner presque correctement : mais la je perds completement les pedales : la file se construit correctement, cette fois elle considere tous les coups, les cases de depart et de destinations des coups sont bons mais l'identifiant de la piece bougee est foireux sur cette file ( et pas sur la file "temoin" ) alors qu'il s'agit d'un simple integer, comme les autres parametres, et qu'elle est initialise au meme endroit et au meme moment. la je ne comprends vraiment plus rien !! alors que tout fonctionne bien a priori, la file sort cette fois correctement le dernier element, tete et queue se retrouvent a NULL quand la file est vide, bref a priori tout fonctionne bien. un mystere !!

  12. #12
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 380
    Points : 41 576
    Points
    41 576
    Par défaut
    Tu es sûr que tu ne t'es pas gouré en faisant ton constructeur de copie?
    Il faut copier tous les éléments et ne laisser aucun "ancien" pointeur dans les nouveaux...

  13. #13
    Membre éclairé
    Inscrit en
    Janvier 2005
    Messages
    711
    Détails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    Points : 751
    Points
    751
    Par défaut
    je ne fais pas de copie. je passe la file par reference a la fonction qui trouve les coups, et si elle n'est pas vide, je la vide proprement. je ne le faisais pas avant, et effectivement ca foutait le boxon, mais maintenant a priori plus de probleme de ce cote la.

Discussions similaires

  1. problèmes avec "include file" pour une page asp
    Par chipsense dans le forum ASP
    Réponses: 1
    Dernier message: 02/09/2005, 15h22
  2. [JBOSS] [Struts] Problème avec une application
    Par Tiercel dans le forum Wildfly/JBoss
    Réponses: 5
    Dernier message: 13/07/2004, 13h50
  3. Problème avec une instruction OUTER /Postgres
    Par Volcomix dans le forum Langage SQL
    Réponses: 14
    Dernier message: 21/04/2004, 16h56
  4. problème avec une requête imbriquée
    Par jaimepasteevy dans le forum Langage SQL
    Réponses: 13
    Dernier message: 05/12/2003, 10h29
  5. Problème avec une procédure stockée
    Par in dans le forum Langage SQL
    Réponses: 4
    Dernier message: 27/05/2003, 15h33

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