Partage
  • Partager sur Facebook
  • Partager sur Twitter

[C] Le pendu

Erreur a l'execution pas à la compilation

Sujet résolu
    7 mars 2006 à 17:58:00

    Bonjour,
    je fait pour le moment le TP du pendu du cours de M@téo
    j'ai un probleme lors du passage d'une fonction dont voici le code :
    char* mot_juste(char lettre‚char mot_tmp[]char mot[])
    {
        int i = 0;
        long j=0;
        j=strlen(mot);
        for(i=0;i<j;i++)
        {
            if  (lettre==mot[i])
            {
                mot_tmp[i]=mot[i];
            }
        }
        return mot_tmp;
    }



    je suis a peut près sur que l'erreur vien de cette ligne :
    mot_tmp[i]=mot[i];


    L'erreur ne ce produit pas à la compilation mais a l'execution.
    Image utilisateur

    Merci
    @+
    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      7 mars 2006 à 19:11:06

      Non l'erreur viens de la mémoire (written = écrite) donc soit tu a un tableau trop petit ou autre.
      Ce qui est sur c'est que tu utilise de la mémoire que tu ne peut pas allouer.

      Voilà @+
      • Partager sur Facebook
      • Partager sur Twitter
        7 mars 2006 à 19:17:13

        Merci,
        mais si je fait un :
        printf("%c %c"‚mot_tmp[i]‚mot[i]);

        j'obtien:
        * R

        alors je ne comprend pas pourquoi je ne peut pas allouer une memoire que j'ai moi-même defini plus tôt dans le programme.
        @+
        P.S.:j'ai oublier de presiser tout a l'heure
        mot = le mot rechercher
        mot_tmp = les lettre trouver (les lettres non trouvées = '*')
        • Partager sur Facebook
        • Partager sur Twitter
          7 mars 2006 à 19:17:57

          essay de remplacer
          char* mot_juste(char lettre,char mot_tmp[],char mot[])


          par

          char* mot_juste(char lettre,char mot_tmp[100],char mot[100])
          • Partager sur Facebook
          • Partager sur Twitter
            7 mars 2006 à 19:20:33

            J'ai esseyer ta solution N@CR0T!C
            mais sa fait la même erreur
            Merci quand même
            @+
            • Partager sur Facebook
            • Partager sur Twitter
              8 mars 2006 à 17:45:16

              (up) :-°

              J'ai fait de nouveau test afin de cibler un maximum le probleme :

              Mon compilateur est code::block , j'ai essayer de compiler avec dev-c++ et sa me fait la même erreur.

              J'ai esseyer d'attribuer une lettre au trois des variables de la fonction:
              -pour la varriable lettre : pas de probleme
              -pour des tableau il m'affiche l'erreur (voir plus haut) même si je met directement le numero de la case et pas une variable entre les [].

              je conclus donc que c'est les chaines de caractere qui foirent.
              Mais j'aimerai bien savoir pourquoi.

              Merci d'avance pour vos réponses.
              @+
              • Partager sur Facebook
              • Partager sur Twitter
                8 mars 2006 à 17:50:59

                passe nous le code complet stp
                • Partager sur Facebook
                • Partager sur Twitter
                  8 mars 2006 à 18:02:29

                  ok le voilà ;) :
                  il tien en 3 pages :
                  main.c:

                  #include <stdio.h>
                  #include <stdlib.h>
                  #include "fonctions.h"
                  int main()
                  {
                      int  chances=10‚ juste = 0;
                      char *motSecret = "MARRON"‚* mot_tmp="******"‚lettre=0‚fin=1;
                          printf("Bienvenue sur le jeu du pendu de Boced66 \n\nLes regles sont simples:\n–Vous devez trouvez le mot mistere\n–Vous n'avez droit qu'a 10 erreurs.\n–Les lettres sont en majuscules.\n–Il n'y a pas d'accent.\n\nBonne chance.\n\n");



                        chances=10; juste = 0;lettre=0;mot_tmp="******";motSecret = "MARRON";
                  do{
                        printf("\n\n\n\nIl vous reste %d posibilitee(s) d'erreur(s)"‚chances);
                        printf("\nQuel est le mot secret ? %s\nProposez une lettre : "‚mot_tmp);

                        lettre = lireCaractere();


                        juste=verifie_lettre(lettre‚motSecret);
                        if (juste==1)
                        {
                            mot_tmp=mot_juste(lettre‚mot_tmp‚motSecret);
                            }
                        else
                      {printf("faux");
                      chances––;}

                      }while(chances>=0);

                          return 0;
                  }

                  fonctions.c:

                  char lireCaractere()
                  {
                      char caractere = 0;

                      caractere = getchar(); // On lit le premier caractère
                      caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà

                      // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
                      while (getchar() != '\n') ;


                      return caractere; // On retourne le premier caractère qu'on a lu
                  }



                  int verifie_lettre(char lettre‚char* mot)
                  {
                      int i = 0;
                      long j=0;
                      j=strlen(mot);
                      for(i=0;i<j;i++)
                      {

                          if  (lettre==mot[i])
                          return 1;
                      }
                      return 0;

                  }

                  char* mot_juste(char lettre‚char mot_tmp[]char mot[])
                  {
                      int i = 0;
                      long j=0;
                      j=strlen(mot);
                      for(i=0;i<j;i++)
                      {
                          if  (lettre==mot[i])
                          {   printf("%c %c"‚mot[i]‚lettre);
                              mot_tmp[i]=mot[i];
                          }
                      }
                      return mot_tmp;
                  }

                  et fonctions.h:

                  #ifndef DEF_FONCTIONS // Si la constante n'a pas été définie‚ le fichier n'a jamais été inclus
                  #define DEF_FONCTIONS // On définit la constante pour que la prochaine fois le fichier ne soit plus inclus

                  /* Contenu de votre fichier .h (autres includes‚ prototypes de vos fonctions‚ defines...) */
                  char lireCaractere();
                  int verifie_lettre(char lettre‚char* mot);
                  char *mot_juste(char lettre‚char *mot_tmp‚char *mot);
                  #endif


                  Voila j'esspere que sa aidera a trouver la cause du probleme.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 mars 2006 à 19:13:56

                    Switching to target: default
                    Compiling: main.c
                    In file included from main.c:3:
                    fonctions.h:6: error: stray '\130' in program
                    fonctions.h:6: error: syntax error before "char"
                    fonctions.h:7: error: stray '\130' in program
                    fonctions.h:7: error: syntax error before "char"
                    fonctions.h:7: error: stray '\130' in program
                    main.c: In function `main':
                    main.c:6: error: stray '\130' in program
                    main.c:6: error: syntax error before "juste"
                    main.c:7: error: stray '\130' in program
                    main.c:7: error: `mot_tmp' undeclared (first use in this function)
                    main.c:7: error: (Each undeclared identifier is reported only once
                    main.c:7: error: for each function it appears in.)
                    main.c:7: error: stray '\130' in program
                    main.c:7: error: syntax error before "lettre"
                    main.c:7: error: stray '\130' in program
                    main.c:12: error: `juste' undeclared (first use in this function)
                    main.c:12: error: `lettre' undeclared (first use in this function)
                    main.c:14: error: stray '\130' in program
                    main.c:14: error: syntax error before "chances"
                    main.c:15: error: stray '\130' in program
                    main.c:15: error: syntax error before "mot_tmp"
                    main.c:20: error: stray '\130' in program
                    main.c:20: error: syntax error before "motSecret"
                    main.c:23: error: stray '\130' in program
                    main.c:23: error: syntax error before "mot_tmp"
                    main.c:23: error: stray '\130' in program
                    main.c:27: error: stray '\150' in program
                    main.c:27: error: stray '\150' in program
                    Process terminated with status 1 (0 minutes, 0 seconds)


                    compilé avec code::block
                    • Partager sur Facebook
                    • Partager sur Twitter
                      8 mars 2006 à 20:32:08

                      Salut,
                      J'ai esseyer de copier/coller le code dans un projet code::block et il me fait effectivement la même chose. J'ai chercher un peut la cause du probleme et j'ai vu que les virules était noires au lieu de rouges.
                      En fait on dirait que quand on fait un copier/coller dans code::block il ne parse pas les virgules et les -- (retirer 1 a une variable).

                      En fait il faut les effacer et les remettre une par une.

                      Donc voila pour les erreur qu'il t'affiche.
                      Merci d'avoir regarder mais sa resoud pas encore mon problemme.

                      [EDIT] j'ai oublier de présiser : il faut rentrer une lettre correcte pour voir l'erreur (le mot a trouver est "MARRON" pour le moment).
                      • Partager sur Facebook
                      • Partager sur Twitter
                        8 mars 2006 à 22:36:55

                        il y as plein de chose que je ne comprend pas dans ton scripte
                        #include <stdio.h>
                        #include <stdlib.h>
                        #include "fonctions.h"
                        int main()
                        {
                            int  chances=10‚ juste = 0;
                            char *motSecret = "MARRON"‚* mot_tmp="******"‚lettre=0‚fin=1;
                                printf("Bienvenue sur le jeu du pendu de Boced66 \n\nLes regles sont simples:\n–Vous devez trouvez le mot mistere\n–Vous n'avez droit qu'a 10 erreurs.\n–Les lettres sont en majuscules.\n–Il n'y a pas d'accent.\n\nBonne chance.\n\n");



                              chances=10; juste = 0;lettre=0;mot_tmp="******";motSecret = "MARRON";
                        do{
                              printf("\n\n\n\nIl vous reste %d posibilitee(s) d'erreur(s)"‚chances);
                              printf("\nQuel est le mot secret ? %s\nProposez une lettre : "‚mot_tmp);
                              ––––––––
                              lettre = lireCaractere();


                              juste=verifie_lettre(lettre‚motSecret);
                              if (juste==1)
                              {
                                  mot_tmp=mot_juste(lettre‚mot_tmp‚motSecret);
                                  }
                              else
                            {printf("faux");
                            chances––;}

                            }while(chances>=0);

                                return 0;
                        }

                        la ou j'ai mis des piontillet il ne fautdrait pas que tu demande a l'utilisateru d'entré une lette ???

                        char lireCaractere();


                        tu mlet lire caractère mais tu n'envoit pas le caractère a lire a la fontion donc elle ne compare rien ...

                        c'est ce qui m'as le plus choquer pour le moment masi je n'ai pas etudier le scripte a fond
                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 mars 2006 à 3:18:15

                          Citation : N@CR0T!C

                          il y as plein de chose que je ne comprend pas dans ton scripte
                          [...]
                          tu mlet lire caractère mais tu n'envoit pas le caractère a lire a la fontion donc elle ne compare rien ...

                          c'est ce qui m'as le plus choquer pour le moment masi je n'ai pas etudier le scripte a fond



                          Tu a regardé le TP?
                          Peut importe :p
                          Admire la fonction lireCaractère
                          char lireCaractere()
                          {
                              char caractere = 0;

                              caractere = getchar(); // On lit le premier caractère
                              caractere = toupper(caractere); // On met la lettre en majuscule si elle ne l'est pas déjà

                              // On lit les autres caractères mémorisés un à un jusqu'à l'\n (pour les effacer)
                              while (getchar() != '\n') ;


                              return caractere; // On retourne le premier caractère qu'on a lu
                          }


                          La fonction lireCaractere demande elle même à entrer le caractère et ensuite la renvoit un caractère.
                          Donc, lireCaratere vos le caratere tapé par l'utilisateur.
                          lireCaractere()=caractere
                          Lettre=lireCaractere
                          Lettre=caractere

                          Donc, le problème n'est pas là :p



                          Bon, moi je crois voir erreur ici:
                          char *motSecret = "MARRON"‚* mot_tmp="******"‚lettre=0‚fin=1;

                          pour commencer:
                          *motSecret est un pointeur et il ne représente qu'une seule adresse.
                          En plus, il ne pointe même pas sur une variable: il est rien :(
                          j'arrète ma tentative d'explication ici pour être sur de ne pas dire n'importe quoi :-°

                          Normalement, pour une chaine, tu devrais taper motSecret[]="MARRON" (c'est pareil pour les autres)

                          Le prototype de la fonction mot_juste est pas pareil que la fonction...

                          Tu te sert de la fonction strlen, mais tu ne l'inclut pas( elle est dans string.h)

                          fin serais peut-être plus logique dans les int? Sinons, tant-pis, je crois que c'est correct en char aussi :p

                          Ensuite, c'est quoi le but de redistribuer la valeur au variables quand t'a touché à rien? La même valeur en plus!
                          Et cellui de donner un type différent à tes "i" et tes "j"?



                          Ça se compile pour de vrai?
                          Sinons, j'ai le gout de me taire ici. :p
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 mars 2006 à 7:07:56

                            Hum,
                            Je suis pas sur mais quand tu déclares mot_tmp et mot au début de ton code (j'ai pas tout regardé), mais tu fais un truc de ce genre :
                            char* chaine = "bla;";
                            Ca veut dire que les char pointés par chaine ne sont pas modifiable, car ils sont dans la mémoire de ton exe, en read-only (c'est un peu compliqué à expliquer).
                            Donc *chaine = 'f'; te renverra une erreur de ce style.
                            Pour corriger il faut faire
                            char tmp[100];
                            // ou char* tmp = malloc (1000);
                            strcpy(tmp‚"Bla");
                            *tmp = 'f';

                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 mars 2006 à 12:37:01

                              À y repenser, je crois que le type différent de tes i et tes j est un gros problème.
                              int i = 0;
                              long j=0;
                              j=strlen(mot);
                              for(i=0;i<j;i++)


                              j est comparé avec i, mais ils ne sont pas du même type...
                              ça ne peut pas vraiment marcher.
                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 mars 2006 à 16:10:31

                                Ca n'a aucun rapport, le cast est fait automatiquement :)
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  9 mars 2006 à 16:16:07

                                  Merci beaucoup sa fonctionne maintenant.
                                  j'ai aussi changer les type i et j pour avoir les même (sa fonctionnait quand même avec des différent)
                                  Encore merci et @+
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    9 mars 2006 à 17:53:34

                                    ok desoler pour les betise que j'ai pu dire je fesait a l'intuision je n'ai pas encor lu la fin du tutos de mateos (j'essay de comprendre a fond les pointeurs ...)
                                    • Partager sur Facebook
                                    • Partager sur Twitter

                                    [C] Le 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