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

SL & STL C++ Discussion :

Probleme d'execution : le programme doit se fermer (mode console)


Sujet :

SL & STL C++

  1. #1
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut Probleme d'execution : le programme doit se fermer (mode console)
    bonjour tout le monde,

    je me demande les raisons dans le but de comprendre pourquoi parfois mes programmes " crashent " meme s'ils ne contiennent aucune erreur, dés que la fentere en mode console se lance un message du systeme s'affiche alors indiquant que le programme doit se fermer !!!!

    c'est bizzare non ?

    j'utilise Dev-C++ dans sa derniere version et sous OS Vista

    merci de me repondre

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    sans code... mais en général ça vient d'un comportement indéterminé du code..
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par LePassager Voir le message
    pourquoi parfois mes programmes " crashent " meme s'ils ne contiennent aucune erreur,
    On a tous des programmes sans erreur .... jusqu'au premier bug
    Montre-nous quelques sources pour avoir des infos plus précises.

  4. #4
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    merci pour la reponse

    voila un bout de code sachant que j'ai tester toutes les fonctions de toutes les classes créées avant de l'utiliser dans cette methode


    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    void Lancer(vector<Carte>& Jeu, Joueur& joueur1, Joueur& joueur2)
    {
            Packet Pg(Jeu);
            vector<Carte>  pj1, pj2;
     
            Pg.SplitPacket(pj1, pj2);
     
            Packet p1(pj1);
            Packet p2(pj2);
     
            Main m1 = joueur1.GetMainJoueur();
            Main m2 = joueur2.GetMainJoueur();
     
            vector<Carte> tmp1(p1.GetlePacket());
            vector<Carte> tmp2(p2.GetlePacket());
     
            Carte c1(m1.RetirerCarte(tmp1));
            Carte c2(m2.RetirerCarte(tmp2));
     
     
     
            while(PackJoueur2.size()!= 0 && PackJoueur1.size()!= 0)
            {
                p1.MelangerPacket();
                p2.MelangerPacket();
     
                if( c1.Comparer(c2) == 1 )
                {
                    joueur1.SetScore(1);
                    joueur2.SetScore(1);
                    joueur1.InformationsJoueur();
     
                    joueur2.InformationsJoueur();
                    cout<<endl;
                }
                else if( c1.Comparer(c2) == 2 )
                {      
                    Joueur2.SetScore(3);
                    Joueur2.InformationsJoueur();
                    cout<<endl;
                }
                else if( c1.Comparer(c2) == 3 )
                {      
                    Joueur1.SetScore(3);
                    Joueur1.InformationsJoueur();
                    cout<<endl;
                }
     
                cout << "Pack1 : " << PackJoueur1.size() 
                     <<" Pack2 : " << PackJoueur2.size() <<endl;
                cout << endl << endl;
                Sleep(3); 
            }
     
            if( joueur1.GetScore() == joueur2.GetScore() )
            {
                cout<<"la partie s'est terminée avec égalité !"<<endl;
                joueur1.InformationsJoueur();cout<<endl;
                joueur2.InformationsJoueur();cout<<endl;
            }
            else if( Joueur1.GetScore() > Joueur2.GetScore() )
            {
     
                Joueur1.InformationsJoueur();cout<<" a gangné !"<<endl;
                Joueur2.InformationsJoueur();cout<<" a perdu !"<<endl;
            }
            else if( Joueur1.GetScore() < Joueur2.GetScore() )
            {
     
                Joueur2.InformationsJoueur();cout<<" a gangné !"<<endl;
                Joueur1.InformationsJoueur();cout<<" a perdu !"<<endl;
            }
     
     
     
    }
    Est ce que je vous explique le code ?
    generalement c'est jeu de cartes

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par LePassager Voir le message
    merci pour la reponse

    voila un bout de code sachant que j'ai tester toutes les fonctions de toutes les classes créées avant de l'utiliser dans cette methode
    Bonne démarche. Ca évite effectivement beaucoup de soucis.

    Citation Envoyé par LePassager Voir le message
    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
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    void Lancer(vector<Carte>& Jeu, Joueur& joueur1, Joueur& joueur2)
                      {
                            Packet Pg(Jeu);
                            vector<Carte>  pj1, pj2;
     
                            Pg.SplitPacket(pj1, pj2);
     
                            Packet p1(pj1);
                            Packet p2(pj2);
     
                            Main m1 = joueur1.GetMainJoueur();
                            Main m2 = joueur2.GetMainJoueur();
     
                            vector<Carte> tmp1(p1.GetlePacket());
                            vector<Carte> tmp2(p2.GetlePacket());
     
                            Carte c1(m1.RetirerCarte(tmp1));
                            Carte c2(m2.RetirerCarte(tmp2));
     
     
     
                            while(PackJoueur2.size()!= 0 && PackJoueur1.size()!= 0)
                               {
                                     p1.MelangerPacket();
                                     p2.MelangerPacket();
     
                                     if( c1.Comparer(c2) == 1 )
                                     {
                                           joueur1.SetScore(1);
                                           joueur2.SetScore(1);
                                           joueur1.InformationsJoueur();
     
                                           joueur2.InformationsJoueur();
                                           cout<<endl;
                                     }
                                     else if( c1.Comparer(c2) == 2 )
                                     {      
                                           Joueur2.SetScore(3);
                                           Joueur2.InformationsJoueur();
                                           cout<<endl;
                                     }
                                     else if( c1.Comparer(c2) == 3 )
                                     {      
                                           Joueur1.SetScore(3);
                                           Joueur1.InformationsJoueur();
                                           cout<<endl;
                                     }
     
                                     cout<<"Pack1 : "<<PackJoueur1.size()<<" Pack2 : "<<PackJoueur2.size()<<endl;
                                     cout<<endl;cout<<endl;
                                     Sleep(3); 
                               }
     
                           if( joueur1.GetScore() == joueur2.GetScore() )
                           {
                                 cout<<"la partie s'est terminée avec égalité !"<<endl;
                                 joueur1.InformationsJoueur();cout<<endl;
                                 joueur2.InformationsJoueur();cout<<endl;
                           }
                           else if( Joueur1.GetScore() > Joueur2.GetScore() )
                           {
     
                                 Joueur1.InformationsJoueur();cout<<" a gangné !"<<endl;
                                 Joueur2.InformationsJoueur();cout<<" a perdu !"<<endl;
                           }
                           else if( Joueur1.GetScore() < Joueur2.GetScore() )
                           {
     
                                 Joueur2.InformationsJoueur();cout<<" a gangné !"<<endl;
                                 Joueur1.InformationsJoueur();cout<<" a perdu !"<<endl;
                           }
     
     
     
                      }
    Est ce que je vous explique le code ?
    generalement c'est jeu de cartes
    Ca manque encore d'information. Ce qui ne me saute pas aux yeux c'est comment tu sors de ta boucle while. Outre que PackJoueur1 et PackJoueur2 ne sont pas définis dans le bout de code que tu postes, les méthodes indiquées dans la boucle while ne semblent pas retirer des nouvelles cartes des paquets. D'où l'impression que tu ne sors jamais de la boucle.

  6. #6
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    mecri pour le temps que tu m'accordes

    en fait,c'est la methode RetirerCarte() qui permet de determiner la fin de la boucle et par lasuite d'en sortir, puisqu'elle supprime la premiere carte du conteneur puis retourne la carte supprimée
    et par la suite la valeur contenue dans size() decremente

  7. #7
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par LePassager Voir le message
    mecri pour le temps que tu m'accordes

    en fait,c'est la methode RetirerCarte() qui permet de determiner la fin de la boucle et par lasuite d'en sortir, puisqu'elle supprime la premiere carte du conteneur puis retourne la carte supprimée
    et par la suite la valeur contenue dans size() decremente
    Sauf que je ne vois pas où elle est appelée dans le while :
    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
     
                            while(PackJoueur2.size()!= 0 && PackJoueur1.size()!= 0)
                               {
                                     p1.MelangerPacket();
                                     p2.MelangerPacket();
     
                                     if( c1.Comparer(c2) == 1 )
                                     {
                                           joueur1.SetScore(1);
                                           joueur2.SetScore(1);
                                           joueur1.InformationsJoueur();
     
                                           joueur2.InformationsJoueur();
                                           cout<<endl;
                                     }
                                     else if( c1.Comparer(c2) == 2 )
                                     {      
                                           Joueur2.SetScore(3);
                                           Joueur2.InformationsJoueur();
                                           cout<<endl;
                                     }
                                     else if( c1.Comparer(c2) == 3 )
                                     {      
                                           Joueur1.SetScore(3);
                                           Joueur1.InformationsJoueur();
                                           cout<<endl;
                                     }
     
                                     cout<<"Pack1 : "<<PackJoueur1.size()<<" Pack2 : "<<PackJoueur2.size()<<endl;
                                     cout<<endl;cout<<endl;
                                     Sleep(3); 
                               }

  8. #8
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Bonne démarche. Ca évite effectivement beaucoup de soucis.
    merci de m'encourager

    le probleme ce que lors de l'appel de la methode Lancer() dans le main principal

    le programme se ferme sans que j'obiens une erreur ou une indication

    c'est pire comme resultat !

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Rajoutes des traces pour voir comment ton programme se comporte (dump vers cout ou vers un fichier log) : d'abord dans chaque étape de ton main, puis de plus en plus finement en fonction de là où ça s'arrête.
    Des bons testU c'est une super démarche que beaucoup devrait suivre.
    Ensuite, un bon debug (avec un debugger ou avec des traces), c'est ++ !

  10. #10
    Membre éclairé

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Points : 858
    Points
    858
    Par défaut
    Un petit "Rebuild All" puis lancement en mode debug pas-à-pas pour voire où ça plante exactement.

  11. #11
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Sauf que je ne vois pas où elle est appelée dans le while :
    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
     
                            while(PackJoueur2.size()!= 0 && PackJoueur1.size()!= 0)
                               {
                                     p1.MelangerPacket();
                                     p2.MelangerPacket();
     
                                     if( c1.Comparer(c2) == 1 )
                                     {
                                           joueur1.SetScore(1);
                                           joueur2.SetScore(1);
                                           joueur1.InformationsJoueur();
     
                                           joueur2.InformationsJoueur();
                                           cout<<endl;
                                     }
                                     else if( c1.Comparer(c2) == 2 )
                                     {      
                                           Joueur2.SetScore(3);
                                           Joueur2.InformationsJoueur();
                                           cout<<endl;
                                     }
                                     else if( c1.Comparer(c2) == 3 )
                                     {      
                                           Joueur1.SetScore(3);
                                           Joueur1.InformationsJoueur();
                                           cout<<endl;
                                     }
     
                                     cout<<"Pack1 : "<<PackJoueur1.size()<<" Pack2 : "<<PackJoueur2.size()<<endl;
                                     cout<<endl;cout<<endl;
                                     Sleep(3); 
                               }
    si je vous comprends, l'appel s'effectue dans la boucle de façon automatique
    j'explique :
    lorsque la carte sera supprimée du conteneur grace a RetirerCarte()
    le conteneur s'il contenait 26 cartes moins une qui vient d'etre supprimée
    le reste est 25

    le premiere test sur la condition de la boucle est size() = 26
    le deuxieme test size() = 25
    .
    .
    .
    le dernier test de la boucle size vaut Zéro pour les deux conteneurs PackJoueur1 et 2

  12. #12
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Rajoutes des traces pour voir comment ton programme se comporte (dump vers cout ou vers un fichier log) : d'abord dans chaque étape de ton main, puis de plus en plus finement en fonction de là où ça s'arrête.
    Des bons testU c'est une super démarche que beaucoup devrait suivre.
    Ensuite, un bon debug (avec un debugger ou avec des traces), c'est ++ !
    ouiiii, vous avez raison

    je l'ai fait deja

    j'affiche le tout depuis la creation des conteneurs jusqu'a l'affichage des valeurs des cartes supprimées et le resultat final

    mais ca reste en mettant le code dans la methode Lancer() ca crash

    sans cette methode le programme fonctionne super correctement

  13. #13
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par Sylvain Togni Voir le message
    Un petit "Rebuild All" puis lancement en mode debug pas-à-pas pour voire où ça plante exactement.
    je vais le faire et je posterai le resultat

    mais avant je dois terminer un bout de code

    merci amigos

  14. #14
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par LePassager Voir le message
    si je vous comprends, l'appel s'effectue dans la boucle de façon automatique
    j'explique :
    lorsque la carte sera supprimée du conteneur grace a RetirerCarte()
    le conteneur s'il contenait 26 cartes moins une qui vient d'etre supprimée
    le reste est 25

    le premiere test sur la condition de la boucle est size() = 26
    le deuxieme test size() = 25
    .
    .
    .
    le dernier test de la boucle size vaut Zéro pour les deux conteneurs PackJoueur1 et 2
    Je ne vois pas l'appel à RetirerCarte DANS la boucle while; à moins que tu n'aies oublié de le recopier en postant ton bout de code.
    Met des traces dans ta fonction Lancer et dans ta boucle while.

  15. #15
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Je ne vois pas l'appel à RetirerCarte DANS la boucle while; à moins que tu n'aies oublié de le recopier en postant ton bout de code.
    Met des traces dans ta fonction Lancer et dans ta boucle while.
    le code est complètement correcte et j'ai rien oublié :d

    si vous revoyez le code que j'ai mis :

    RetirerCarte est appelée par un objet de une classe main (hand) d'un joueur (classe aussi) qui possede a son tour cete main
    cette methode permet de tirer une carte du conteneur c-a-d supprimer une carte puis retounrnée cette derniere pour faire la comparaison et augmenter le score du gagnat

  16. #16
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    j'ai oublié de dire que tirer une carte implique enlever celle la du conteneur

    ce qui est a la fin : la condition de la boucle teste si les deux conteneurs contiennent encore des elements de type carte ou non
    si oui elle retire et compare les cartes et bien sur le score est augmenté sinon

    on quitte et on affiche le gagnant

  17. #17
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Dans quelle méthode?
    MelangerPacket()?
    Comparer(c2)?
    SetScore(1)?
    InformationsJoueur()?
    size()?
    ce sont les seuls méthodes à l'intérieur du while que je vois.

  18. #18
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Dans quelle méthode?
    MelangerPacket()?
    Comparer(c2)?
    SetScore(1)?
    InformationsJoueur()?
    size()?
    ce sont les seuls méthodes à l'intérieur du while que je vois.
    aucune d'elles

    vous allez la trouver dans le constructeur de recopie des cartes

    je vous comprends maintenant
    moi je parle avec mon code devant les yeux sous Dev-C++

    je sais pas comment les objets cartes ne sont pas mis dans la boucle

    ---

    je m'excuse

  19. #19
    Membre du Club
    Inscrit en
    Janvier 2009
    Messages
    107
    Détails du profil
    Informations forums :
    Inscription : Janvier 2009
    Messages : 107
    Points : 43
    Points
    43
    Par défaut
    une derniere question :

    pour la methode Lancer

    vaut il mieux la laisser sans parametres ou bien je rajoute des parametres comme le joueur1, joueur2 et l'ensemble de cartes (paquet) ?

    puisque cette methode ne sert qu'à lancer la partie du jeu ?

  20. #20
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Quel est l'objet qui a la responsabilité de la méthode Lancer (LeJeu)?
    Quel est la durée de vie des objets Jeu/Joueur1/Joueur2 : est-elle synchrone de Lancer -> Variable Locale, elle est synchrone de LeJeu-> compositon?, elle est indépendante: variable main + paramètre? Je ne connais pas suffisamment ton programme pour voir quelle est la conception la + approprié.
    Dernière remarque, faire un tirage dans le constructeur par copie est dangereux d'un point de vue maintenance/relecture du code. Spontanément, personne ne le verra.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. probleme à l'execution du programme
    Par alphonse62 dans le forum JBuilder
    Réponses: 2
    Dernier message: 20/05/2007, 04h05
  2. Probleme d'execution de programme
    Par vg-matrix dans le forum C
    Réponses: 7
    Dernier message: 09/05/2007, 21h04
  3. probleme d execution programme perl
    Par calimero642 dans le forum Langage
    Réponses: 4
    Dernier message: 13/07/2006, 12h49
  4. Réponses: 20
    Dernier message: 23/06/2006, 20h49
  5. [Kylix] Probleme d'execution de programmes...
    Par yopziggy dans le forum EDI
    Réponses: 19
    Dernier message: 03/05/2002, 14h50

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