Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP : réalisation d'un Pendu

Problème d'exécution

Sujet résolu
    27 juin 2019 à 12:54:39

    Bonjour,

    Je suis actuellement le cours de C afin d'y apprendre ses bases. Je suis arrivé à au TP du Pendu, et je rencontre un problème étrange.

    Petite précision, j'ai uniquement effectué la première partie du Pendu, c'est-à-dire qu'il n'y a pas encore de dictionnaire de mot.

    Revenons en au problème, quand j'exécute mon programme il m'affiche comme il se doit le menu de départ avec "1.Jouer 2.Manuel 3.Quitter", mais lorsqu'on sélectionne  "1" pour jouer soit le programme va planter, donc calculer je ne sais pas quoi pendant x secondes et renvoyer un nombre négatif comme quoi il y a eu un problème, soit il va bien exécuter mon programme et m'afficher la suite du Pendu.

    Petit détail, quand le mot est découvert le programme nous redirige vers le menu de départ, et bien si on rejoue en sélectionnant "1", (donc cela a fonctionné la première), et bien le programme ne va jamais planter, on aura beau refaire cela autant de fois que l'on veut il ne va pas planter.

    Auriez-vous une idée d'où cela peut provenir ?

    Merci d'avance pour votre aide.

    Mon programme :

    main.c

    main.h

    menu.c

    menu.h

    • Partager sur Facebook
    • Partager sur Twitter
      27 juin 2019 à 15:02:09

      Bonjour,

      Mauvais forum

      Le sujet est déplacé de la section Langage C++ vers la section Langage C

      • Partager sur Facebook
      • Partager sur Twitter

      Pas d'aide concernant le code par MP, le forum est là pour ça :)

        27 juin 2019 à 16:38:22

        1) Utilises le bouton code </> du forum pour poster ton code.

        2) ne pas définir les variables dans un fichier entête (.h) !

        3) éviter les variables globales !

        4) Tu déclares motJoueur comme un pointeur sur int, alors que ce devrait être pointeur sur char.

        5) préfère l'utilisation des crochets pour accéder aux cases des tableaux, c'est plus lisible.

        • Partager sur Facebook
        • Partager sur Twitter
          27 juin 2019 à 18:10:23

          Merci de ta réponse, je vais arranger cela et voir si c'est concluant ou pas.

          (ps : je sais qu'il y a les balises </> pour le code, mais je me voyais mal mettre tout mon code dans un poste, je trouve cela pas très agréable si le code commence à faire plus d'une trentaine de lignes)

          • Partager sur Facebook
          • Partager sur Twitter
            27 juin 2019 à 18:39:23

            Il y en a qui en poste des bien plus long et sans la balise code !

            30 lignes, ce n'est pas beaucoup .

            Et je suis allé voir ton code, mais bien souvent quand c'est de fichiers déporté comme tu as fait, je ne vais même pas y voir, alors tu as eu de la chance.

            • Partager sur Facebook
            • Partager sur Twitter
              27 juin 2019 à 22:02:27

              Bonsoir :)

              En plaçant des :

              printf("test1");
              
              //code
              
              printf("Ici ?")
              
              //etc

              J'ai pu voir qu'à la ligne 60, ça plante.

              /* Fichier menu.c */
              /* Gestionnaire des menus */
               
              #include <stdio.h>
              #include <stdlib.h>
              #include <conio.h>
              #include <string.h>
              #include <ctype.h>
               
              #include "menu.h"
               
               
              void menuPrincipal(char *choix)
              {
                  system("@cls||clear");
                  printf(" ======================================\n");
                  printf("   Bienvenue dans le jeu du Pendu !\n\n");
                  printf("             1. Joueur\n");
                  printf("             2. Manuel\n");
                  printf("             3. Quitter\n\n");
                  printf(" ======================================\n\n\n");
                  printf(" Que voulez-vous faire ? ");
                  choix[0] = lireCaractere();
              }
               
              void menuManuel()
              {
                  system("@cls||clear");
                  printf("\n");
                  printf(" ======================================\n");
                  printf("                Manuel                \n\n");
                  printf(" Le jeu du Pendu est un jeu dans\n");
                  printf(" lequel il faut devenir le mot mystere\n");
                  printf(" que detient l'ordinateur.\n\n");
                  printf(" Pour cela, vous devez entrer des\n");
                  printf(" lettres en majuscule une a une pour\n");
                  printf(" decouvrir le mot mystere.\n\n");
                  printf(" Vous avez pour cela au maximum 10\n");
                  printf(" coups possible.\n\n");
                  printf(" =======================================\n\n\n ");
                  system("pause");
              }
               
              void joueurJeu()
              {
                  char motSecret[] = "COCHON";
                  int tailleMot = strlen(motSecret), i, nbCoups = 10, decouvert = 0;
                  char lettre[2];
                  int *motJoueur = NULL;
                  motJoueur = malloc(tailleMot * sizeof(char));
                  if (motJoueur==NULL)
                  {
                      system("@cls||clear");
                      printf("\n Erreur - Aucune place alouee");
                      exit(0);
                  }
                  for (i=0; i<tailleMot; i++) *(motJoueur+i) = '*';
                  do
                  {
                      system("@cls||clear");//ici ça bloque
                      printf("\n Mot mystere : ");
                      for (i=0; i<tailleMot; i++) printf("%c", *(motJoueur+i));
                      printf("\n\n Il vous reste %d coup(s).", nbCoups);
                      printf("\n Proposez une lettre : ");
                      lettre[0] = lireCaractere();
                      verif(motJoueur, motSecret, lettre, &nbCoups, &tailleMot, &decouvert);
                  } while (!decouvert && nbCoups !=0);
                  system("@cls||clear");
                  printf("\n Mot mystere : %s",motSecret);
                  printf("\n\n Il vous reste %d coup(s).\n\n ", nbCoups);
                  if (decouvert) printf("Bravo ! Vous avez trouve le mot mystere !\n\n ");
                  else printf("Desole, vous n'avez pas reussi a trouve le mot mystere.\n\n ");
                  free(motJoueur);
                  system("pause");
              }
               
              char lireCaractere()
              {
                  char caractere;
                  int temp;
                  caractere = getchar(); // On lit le premier caractère
                  caractere = toupper(caractere);
                  while ((temp = getchar()) != '\n' && temp != EOF);  // On vide le buffer
                  return caractere;
              }
               
              void verif(int *motJoueur, char *motSecret, char *lettre, int *nbCoups, int *tailleMot, int *decouvert)
              {
                  int i, compteur = 0;
                  if (strchr(motSecret, lettre[0])!=NULL)
                  {
                      for (i=0; i<=*tailleMot; i++)
                      {
                          if (motSecret[i]==lettre[0]) motJoueur[i] = lettre[0];
                      }
                  }
                  else
                  {
                      *nbCoups -= 1;
                  }
                  for (i=0; i<*tailleMot; i++)
                  {
                      if (motSecret[i]==motJoueur[i]) compteur += 1;
               
                  }
                  if (*tailleMot==compteur) *decouvert = 1;
              }


              en fait, sur la partie de code suivante :

                      printf("\nIci !!!!!!!");
                      system("@cls||clear");
                      printf("\nTrouve !!!");

              Le "ici !!!!!!!!" s'affiche, mais ensuite, le programme plante sans afficher "trouve !!!"



              (je ne connais absolument pas conio.h, mais je trouve ça bizarre que cela ne fonctionne pas à cet endroit, sachant que tu en as mis partout dans ton code ...)

              -
              Edité par Le_Wasabi_Ca_Pik' 27 juin 2019 à 22:09:24

              • Partager sur Facebook
              • Partager sur Twitter

              "Il faut toujours viser la lune, car même en cas d'échec on atterit dans les étoiles". -Oscar Wilde-

                27 juin 2019 à 23:34:05

                rouloude a écrit:

                4) Tu déclares motJoueur comme un pointeur sur int, alors que ce devrait être pointeur sur char.



                • Partager sur Facebook
                • Partager sur Twitter
                  27 juin 2019 à 23:41:39

                  @rouloude effectivement.

                  Mais, pourquoi as-tu cité ton propre message ?

                  • Partager sur Facebook
                  • Partager sur Twitter

                  "Il faut toujours viser la lune, car même en cas d'échec on atterit dans les étoiles". -Oscar Wilde-

                    28 juin 2019 à 11:19:35

                    En enlevant mon fichier main.h et donc en transférant les déclarations de variables de ce dernier dans le code source principal main.c, il semblerait que le programme ne plante plus.

                    4) Tu déclares motJoueur comme un pointeur sur int, alors que ce devrait être pointeur sur char.

                    Apparemment cela n'a pas d'incidence sur le fonctionnement du programme, car c'est de l’allocation manuel de mémoire donc je suppose qu'après on en fait un peu ce que l'on veut tant qu'on demande un espace nécessaire etc... Mais je me doute que par convention, vu que je l'utilise comme un char, vaut mieux changer le int afin que ça soit explicite.


                    (je ne connais absolument pas conio.h, mais je trouve ça bizarre que cela ne fonctionne pas à cet endroit, sachant que tu en as mis partout dans ton code ...)

                    Je trouve cela tout aussi bizarre que le programme plante à cet endroit, maintenant j'ai aucun problème donc on va dire que c'est good, mais ça serait intéressant de comprendre pourquoi il faisait ça ici ? Mystère et boule de gomme...

                    Merci des conseils à tous.

                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 juin 2019 à 12:39:23

                      ClémentBOUQUET a écrit:

                      4) Tu déclares motJoueur comme un pointeur sur int, alors que ce devrait être pointeur sur char.

                      Apparemment cela n'a pas d'incidence sur le fonctionnement du programme, car c'est de l’allocation manuel de mémoire donc je suppose qu'après on en fait un peu ce que l'on veut tant qu'on demande un espace nécessaire etc... 

                      Pas d'incidence ? Et l’arithmétique des pointeurs, qu'est ce que tu en fais !

                      • Partager sur Facebook
                      • Partager sur Twitter

                      TP : réalisation d'un 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