Partage
  • Partager sur Facebook
  • Partager sur Twitter

Probleme TP Pendu

Sujet résolu
    5 décembre 2006 à 8:01:41

    Bonjour à tous les zero !

    voila j'ai fais la parti un du pendu (tous seul). ca marche bien mais lorsque je quitte le programme, visual c++ me genere une erreur

    Run-Time Check Failure #2 - Stack around the variable 'cMotEssai' was corrupted.



    Je peuse que mon erreur est dans InitialiseATrouver dans chaine.c mais je suis pas sur..



    je n'arrive pas a trouver pouvez vous m'aider svp voila mon code


    #include "chaine.h"
    #include <stdio.h>
    #include <stdlib.h>

    int main()
    {
            char cLettre = '\0', cfin = '\0';
            int iNombreCara = 0, iNombreDeCoup = 15;


            // On affiche la presentation
            printf("\t\t**************************************************\n");
            printf("\t\t*                                                *\n");
            printf("\t\t*                 LE JEU DU PENDU                *\n");
            printf("\t\t*                                                *\n");
            printf("\t\t**************************************************\n\n\n");

            printf("bon jeu et bonne chance\n");
            system("PAUSE");
           
            //On choisi un Mot au hazzard
            char cMotATrouver[] = "MARRON";
            char cMotEssai[] = "";
           
            //On initialise
            iNombreCara = NombreCara(cMotATrouver);
            InitialiseATrouver(cMotEssai,iNombreCara);

            do
            {
                    do
                    {
                            // on choisie une lettre
                            printf("Il vous reste : %d\n",iNombreDeCoup);
                            printf("%s\n",cMotEssai);
                            printf("Tapez une lettre > ");
                            cLettre = lireCaractere();

                            // on regarde si la lettre existe dans le mot
                            TrouveCara(cMotATrouver,cLettre,cMotEssai);
                           
                            //On decremente le nombre de coup restant
                            iNombreDeCoup --;
                    }
                    while(0 == ComparerChaine(cMotATrouver,cMotEssai) && iNombreDeCoup > 0)

                    if ( 1 == ComparerChaine(cMotATrouver,cMotEssai) ) // on a gagné
                            printf("BRAVO le mot etait bien %s\n\n\n",cMotATrouver);
                    else if (iNombreDeCoup <=0) // On a perdu
                            printf("DSL, le mot etait %s\n\n\n",cMotATrouver);


                    // on demande si on veut rejouer
                    printf("Voulez vous rejouer (o/n) > ");
                    cfin = lireCaractere();
    }
            while (cfin != 'N');

            return 0;
    }


    Fichier chaine.cpp



    // FICHIER                   : principale.cpp
    // AUTEUR                      : Quentin
    // DATE CREATION         : 03/12/2006
    // DESCRIPTION     : travaille sur les chaines de caracteres
    //                                 (on aurait pu utiliser la bibliothéque string.h)
    // DATE MODIFICATION :
    // VERSION           : 0.1

    #include <stdio.h>
    #include "chaine.h"
    #include <ctype.h>

    //On compte le nombre de caractaires dans une chaine.
    int NombreCara(char p_Chaine[])
    {
            int rep = 0;
            while (*(p_Chaine + rep) != '\0')
                    rep ++;

            return rep;
    }

    //On initialise la chaine 'Atrouver' avec des **** et on l'affiche
    void InitialiseATrouver(char p_Chaine[], int p_NombreCara)
    {
            int i = 0;
            for (i = 0 ; i < p_NombreCara ; i++)
                    *(p_Chaine + i) = '*';

            *(p_Chaine + i) = '\0';

    }

    //on compare deux chaines si elle sont egales on renvoi 1 sinon 0
    int ComparerChaine(char p_Chaine1[], char p_Chaine2[])
    {
            int i = 0, rep = 1;
            while (*(p_Chaine1 + i) != '\0' && rep ==1)
            {
                    if (*(p_Chaine1 + i) != *(p_Chaine2 + i))
                            rep = 0;
                    i ++;
            }

            return rep;
    }

    // on regarde si la premiere chaine contien le caractaire si oui on le met dans la
    // deuxieme chaine à la meme place.
    void TrouveCara(char p_Chaine1[], char p_Cara, char p_Chaine2[])
    {       
            int i = 0;

            while ('\0' != *(p_Chaine1 + i))
            {
                    if (*(p_Chaine1 + i) == p_Cara )
                            *(p_Chaine2 + i) = *(p_Chaine1 + i);
                    i++;
            }

            return;
    }

    char lireCaractere()
    {
            char caractere = 0;

            caractere = getchar(); // On lit le premier caractère

            caractere = toupper(caractere); // on met en majuscule

            // on vide le buffer
            while(getchar() != '\n');

            return caractere;
    }


    le.h de chaine.cpp
    // FICHIER                   : chaine.h
    // AUTEUR                      : Quentin
    // DATE CREATION         : 03/12/2006
    // DESCRIPTION     : travaille sur les chaines de caracteres
    //                                 (on aurait pu utiliser la bibliothéque string.h)
    // DATE MODIFICATION :
    // VERSION           : 0.1

    #ifndef CHAINE_H
    #define CHAINE_H


    //On compte le nombre de caractaires dans une chaine.
    int NombreCara(char Chaine[]);

    // On regarde si on trouve le cara envoyé en parametre dans la chaine
    //si on trouve on remplace le * de caine 2 par le cara
    void TrouveCara(char p_Chaine1[], char p_Cara, char p_Chaine2[]) ;

    //On initialise la chaine 'Atrouver'
    void InitialiseATrouver(char p_Chaine[], int p_NombreCara);

    //Compare deux chaines de caractéres
    //renvoi 1 si les chaines sont identiques sinon renvoi 0
    int ComparerChaine(char p_Chaine1[], char p_Chaine2[]);

    //On lit un caractaire
    char lireCaractere();

    #endif



    voila si vous pouviez me donner quelque conseil aussi sur ma façon de coder se serait simpa de votre part

    merci


    EDIT : un peu de couleur c'est peu etre mieux pour vous !
    EDIT : j'ai remis le code
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      5 décembre 2006 à 9:18:33

      utilise <code type="c"></code>
      • Partager sur Facebook
      • Partager sur Twitter
        5 décembre 2006 à 9:44:22

        effectivement c'est plus lisible merci
        • Partager sur Facebook
        • Partager sur Twitter
          5 décembre 2006 à 11:11:33

          Citation : le5ejumeau


          Fichier chaine.cpp (je mets pas le .h mais il existe aussi


          Alors il faut le mettre, car on ne sait pas ce que tu as oublié.

          • Si tu écris en C, l'extension devrait être .c et non .cpp. Sinon, tu compiles en C++ et le comportement est différent
          • Bonne présentation, mais tu devrais régler ton éditeur pour qu'il utilise les espaces (2 à 4) à la place des tabulations.
          • Citation : Pas de titre

            voila j'ai fais la parti un du pendu (tous seul). ca marche bien

            Non. Le fonctionnement est incorrect

            **************************************************
            * *
            * LE JEU DU PENDU *
            * *
            **************************************************


            bon jeu et bonne chance
            Appuyez sur une touche pour continuer...
            Il vous reste : 15
            ******
            Tapez une lettre > e
            BRAVO le mot etait bien *****


            Voulez vous rejouer (o/n) > n

            Press ENTER to continue.

          • C'est bien d'utiliser des fonctions personnelles, mais ont elles été validées ? Peux-tu publier les jeux de tests unitaires ?

          J'ai mis des traces :

          #include "ed/inc/dbg.h"
          <...>
             //On choisi un Mot au hazzard
             char cMotATrouver[] = "MARRON";
             char cMotEssai[] = "";

          PRT_S (cMotATrouver);
          PRT_S (cMotEssai);

             //On initialise
             iNombreCara = NombreCara (cMotATrouver);
             InitialiseATrouver (cMotEssai, iNombreCara);

          PRT_S (cMotATrouver);
          PRT_S (cMotEssai);


          avec http://mapage.noos.fr/emdel/clib/ed/inc/dbg.h (nouveau de ce matin...)

          Ca donne

          **************************************************
          * *
          * LE JEU DU PENDU *
          * *
          **************************************************


          bon jeu et bonne chance
          Appuyez sur une touche pour continuer...
          DBG : cMotATrouver = 'MARRON'
          at main.c:26
          DBG : cMotEssai = ''
          at main.c:27
          DBG : cMotATrouver = '*****'
          at main.c:33
          DBG : cMotEssai = '******'
          at main.c:34
          Il vous reste : 15
          ******
          Tapez une lettre >

          Init tueuse !
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            5 décembre 2006 à 11:28:16

            ben c'est bizzard ca marche bien chez moi ...
            J'ai fais un edit, j'ai recollé le code dans le forum et j'ai ajouter le fichier .h
            j'ai réinventer la roue pour certains fonctions dans un but pédagogique.



            Image utilisateur

            tu entends quoi par
            <citation nom="C'est bien d'utiliser des fonctions personnelles, mais ont elles été validées ?"></citation>
            • Partager sur Facebook
            • Partager sur Twitter
              5 décembre 2006 à 12:11:16

              Citation : le5ejumeau

              J'ai fais un edit, j'ai recollé le code dans le forum et j'ai ajouter le fichier .h


              Le problème persiste.

              Citation : le5ejumeau

              tu entends quoi par

              Citation : -ed-

              C'est bien d'utiliser des fonctions personnelles, mais ont elles été validées ?


              Lorsqu'on écrit des fonctions, il faut les tester avant de les utiliser. Ont elles été testées ?

              Autrement dit est-on sûr que leur fonctionnement ne peut pas induire d'erreur dans le programme, ou est-ce qu'il faut aussi chercher ici ? Tu imagines bien que dans un développement 1 million de lignes (taille moyenne dans la vie réelle), on ne s'amuse pas à vérifier tout le code à chaque bug. On travaille avec des parties de codes réputées fiables (il y a des méthode de test qui permettent de s'en assurer, ça commence par un contrôle visuel, suivi de tests automatiques) que l'on ne touche pas et on cherche le bug dans les parties nouvellement développées ou modifiées.
              • Partager sur Facebook
              • Partager sur Twitter
              Music only !
                5 décembre 2006 à 14:08:29

                hehe dsl c'est ça d'aller trop vite, :-) je suis en stage et je peux faire du c que le soir alors ... Je vais valider toutes les fonctions que j'ai ecrite ce soir(je vais faire des test).
                • Partager sur Facebook
                • Partager sur Twitter
                  5 décembre 2006 à 15:30:21

                  Citation : le5ejumeau

                  hehe dsl c'est ça d'aller trop vite, :-) je suis en stage et je peux faire du c que le soir alors ... Je vais valider toutes les fonctions que j'ai ecrite ce soir(je vais faire des test).


                  N'oublie pas de compiler en C (.c) et de mettre (void) au lieu de () quand une fonction n'a pas de paramètres.

                  Je constate que tu utilises la 'notation hongroise correcte', c'est à dire celle qui spécifie la nature de l'objet et non son type (comme le fait à tord Microsoft). Attention, cependant à rester cohérent.

                  Citation : Pas de titre

                     char cLettre = '\0', cfin = '\0';


                  OK en C++, mais en C, un caractère est un int :
                  int cLettre = '\0', cfin = '\0';


                  Citation : Pas de titre

                     char cMotATrouver[] = "MARRON";


                  c, c'est pour 'character'. Pour une chaine, c'est s ou sz ('string' 'zero-terminated-string')
                     char sMotATrouver[] = "MARRON";


                  Citation : Pas de titre

                  void TrouveCara(char p_Chaine1[], char p_Cara, char p_Chaine2[]) ;


                  Il faut choisir entre xIdentificateur et x_identificateur et rester cohérent...
                  Cara est un caractère donc c (rappel : type int) et non p.
                  void TrouveCara(char pChaine1[], int cCara, char pChaine2[]) ;

                  etc.

                  http://mapage.noos.fr/emdel/codage.htm

                  • Partager sur Facebook
                  • Partager sur Twitter
                  Music only !
                    5 décembre 2006 à 15:47:03

                    merci pour ces commentaires.
                    dans void TrouveCara(char pChaine1[], int cCara, char pChaine2[]); et les autres ...
                    le p pour moi signifie parametre comme ca je sais que la variable que j'utilise et une variable passé en parametre. je sais pas si c'est bien ou pas (je vais aller jeter un coup d'oeil à la notification hongoise je connaissais pas...

                    effectivement il faut que je choisisse entre x_variable et xVariable j'avais pas fais gaffe.

                    en se qui concerne char sur le cours de M@teo21 il est dit :

                    Si ce type char permet de stocker des nombres, il faut savoir qu'en C on l'utilise rarement pour ça mais pour stoquer des caracteres. En général, même si le nombre est petit, on le stocke dans un long ou un int. Certes, ça prend un peu plus de place en mémoire, mais aujourd'hui la mémoire c'est vraiment pas ce qui manque sur un ordinateur ;) Vous ne tuerez pas votre ordi parce que vous utilisez des int ou des long :p

                    • Partager sur Facebook
                    • Partager sur Twitter
                      6 décembre 2006 à 7:51:47

                      bon j'ai trouvé se qui cloché. pour se que sa interresse, cette erreur signifie un debordement de capacité. mon tableau char cMotEssai[] = ""; et initialisé à rien donc enfait il ne contient pas de case. Ensuite je lui ajoute des * dans ma fonction d'initialisation et c'est la que sa plante ....
                      normale le tableau n'a pas de case et je lui en rajoute quand meme (en fait j'ecris sur de la memoire que je n'est pas reservée . donc en initialisant mais tableau avec une longeur sa marche ...
                      char cMotEssai[40] = "";

                      voila merci et a +
                      • Partager sur Facebook
                      • Partager sur Twitter
                        6 décembre 2006 à 9:53:11

                        Citation : le5ejumeau

                        bon j'ai trouvé se qui cloché. pour se que sa interresse, cette erreur

                        Citation : erreur

                        Run-Time Check Failure #2 - Stack around the variable 'cMotEssai' was corrupted.


                        signifie un debordement de capacité.


                        Malheureusement non. Il faut se garder des conclusions hâtives. Ce qui s'est passé est certes un débordement de capacité, mais les conséquences entrent dans la catégorie "comportement indéfini".

                        Sur ta machine, ça s'est traduit par le message en question. Mais sur la mienne, les conséquences ont été différentes. Le propre d'un comportement indéfini est précisément d'être indéfini. Tout peut arriver et, c'est ça le problème, l'illusion d'un fonctionnement correct.

                        C'est pourquoi rien ne remplace le contrôle visuel (ou avec des outils d'analyse très puissants) du code avant mise en 'boite noire'.

                        Citation : Pas de titre


                        mon tableau char cMotEssai[] = ""; et initialisé à rien donc enfait il ne contient pas de case.


                        Si. Il a un taille de 1 et cette 'case' contient 0 (la marque de fin de chaine).
                        • Partager sur Facebook
                        • Partager sur Twitter
                        Music only !

                        Probleme TP Pendu

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown