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++

Vue hybride

Message pr�c�dent Message pr�c�dent   Message suivant Message suivant
  1. #1
    Membre �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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... :
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  3. #3
    Membre �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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.
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  5. #5
    Membre �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    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 �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    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 confirm�
    Avatar de Luc Hermitte
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Ao�t 2003
    Messages
    5 296
    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 296
    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.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne r�ponds � aucune question technique par le biais de ce m�dia. Et de toutes fa�ons, ma BAL sur dvpz est pleine...

  8. #8
    Expert confirm�
    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
    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 �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    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 confirm�
    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
    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 �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    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
    Avatar de M�dinoc
    Homme Profil pro
    D�veloppeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 397
    D�tails du profil
    Informations personnelles :
    Sexe : Homme
    �ge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 397
    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...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parl� avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  13. #13
    Membre �m�rite
    Inscrit en
    Janvier 2005
    Messages
    711
    D�tails du profil
    Informations forums :
    Inscription : Janvier 2005
    Messages : 711
    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