Partage
  • Partager sur Facebook
  • Partager sur Twitter

Erreurs a la compilation

mais aussi questions sur les pointeurs :)

Sujet résolu
    27 mai 2006 à 15:51:50

    Salut,

    Jai réaliser un quiz en C (plutot un debut de quiz) en m'inspirant du TP sur le pendu mais jai quelques erreurs a la compuilation :( .

    Voici mon code :
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>

    int main(int argc, char *argv[])
    {
        int choixCate = 0;
        char question[500] = {0};

            puts ("     --- Quiz ---\n");
            printf ("Voici les differentes categories :\n 1-Histoire\n 2-Maths\nVotre choix : ");
            scanf ("%ld", &choixCate); puts ("\n");

        switch (choixCate)
        {
            case 1:
                piocherQuestion (&question);
                printf("%s", question);
                break;
            case 2:

                break;
            default:
                puts ("Erreur : choisissez une categorie en tapant le nombre qui lui correspond.\n exemple : '1' pour histoire, '2' pour maths ...");
        }
            return 0;
    }

    int piocherQuestion (char *questionPiochee)
    {
        FILE* questionsHistoire = NULL;

        long nombreQuestions = 0;
        long numQuestionChoisie = 0;
        long i = 0;
        int caractereLu = 0;

        questionsHistoire = fopen("questionHistoire.txt""r"); // error : syntax error before string constant

        if (questionsHistoire == NULL)
        {
            printf("\nImpossible de charger le dictionnaire de questions");
            return 0;
        }

        do
        {
            caractereLu = fgetc(questionsHistoire);
            if (caractereLu == '\n')
                nombreQuestions++;
        } while(caractereLu != EOF);

        numQuestionChoisie = nombreAleatoire(nombreQuestions); // error :  previous declaration of "nombreAleatoire" was here

        rewind(questionsHistoire);

        while (numQuestionChoisie > 0)
        {
            caractereLu = fgetc(questionsHistoire);
            if (caractereLu == '\n')
                numQuestionChoisie––;
        }

        fgets (*questionPiochee‚ 500‚ questionsHistoire); // error : syntax error before numeric constant

        fclose(questionsHistoire);

        return 1;
    }

    long nombreAleatoire(long nombreMax)
    { // error : conflicting types for "nombreAleatoire"
        srand(time(NULL));
        return (rand() % nombreMax);
    }




    Ca serait sympa si vous pouvez le tester et me dire ce qui ne vas pas svp.

    Jai mis les erreurs que me trouvait mon compilateur (code blocks) en commentaire.

    Je n'ai pas utilisé "return" pour retourner "questionPiochee" car je voulais m'entrainer avec les pointeurs mais maintenant je me demande si mon passage de pointeurs dans la fonction est correct et si la variable question est bien changer une fois la fonction executé.

    Merci de maider plz car je galere pas mal ! :)
    • Partager sur Facebook
    • Partager sur Twitter
      27 mai 2006 à 17:52:14

      Je sais pas si ton clavier est un clavier français, mais mingw me disais que tous tes signes de ponctuations étaient bizarres... Je sais pas vraiment d'où ça peut venir, mais je suis presque près à parier que tu a pas un clavier azerty français ^^
      Enfin, bon, ça c'est pas très grave.
      Tu as aussi oublier de déclarer tes fonctions avant de les utiliser. (en clair, relit le chapitre sur les fonction au moment on M@t parle de prototypes).
      Il y avait aussi deux-trois erreurs avec des confusions entre les pointeurs et les dé-référenciation de ces-dits pointeurs.

      Je te passe le code que j'ai corriger, tu n'as qu'à comparer pour trouver ce que j'ai changer. (J'editerais pour remettre le code avec les commentaires).

      Voila, là ça marche. Ce qui m'étonne, c'est que tu n'as jamais dut réussir à te servir de tes virgules avant (quoi que c'était jamais que des warnings...)

      Bon courage.


      #include <stdio.h>
      #include <stdlib.h>
      #include <string.h>
      #include <time.h>

      /* Pas bien de pas mettre les prototypes */
      int piocherQuestion (char *questionPiochee);
      long nombreAleatoire(long nombreMax);


      int main(int argc, char *argv[])
      {
          int choixCate = 0;
          char question[500] = {0};

              puts ("     --- Quiz ---\n");
              printf ("Voici les differentes categories :\n 1-Histoire\n 2-Maths\nVotre choix : ");
                      /* %d parce que tu utilise un int et non un long */
              scanf ("%d", &choixCate); puts ("\n");

          switch (choixCate)
          {
              case 1:
                              /* Non, question est un pointeur vers le premier élément de questoin[];... */
                  piocherQuestion (question);
                  printf("%s", question);
                  break;
              case 2:

                  break;
              default:
                  puts ("Erreur : choisissez une categorie en tapant le nombre qui lui correspond.\n exemple : '1' pour histoire, '2' pour maths ...");
          }
              return 0;
      }

      int piocherQuestion (char *questionPiochee)
      {
          FILE* questionsHistoire = NULL;

          long nombreQuestions = 0;
          long numQuestionChoisie = 0;
              /* Cette variable est inutilisée ! */
          /*long i = 0;*/
          int caractereLu = 0;

              /* Une petite virgule de modifiée */
          questionsHistoire = fopen("questionHistoire.txt", "r"); // error : syntax error before string constant

          if (questionsHistoire == NULL)
          {
              printf("\nImpossible de charger le dictionnaire de questions");
              return 0;
          }

          do
          {
              caractereLu = fgetc(questionsHistoire);
              if (caractereLu == '\n')
                  nombreQuestions++;
          } while(caractereLu != EOF);

          numQuestionChoisie = nombreAleatoire(nombreQuestions); // error :  previous declaration of "nombreAleatoire" was here

          rewind(questionsHistoire);

          while (numQuestionChoisie > 0)
          {
              caractereLu = fgetc(questionsHistoire);
                      /* Deux petits guillemets de modifiés */
              if (caractereLu == '\n')
                              /* Modification de jolis petits signes - */
                  numQuestionChoisie--;
          }

              /* Deux jolies petitses virgules à nouveaux modifiées, et questionPiochees c'est déjà un pointeur */
          fgets (questionPiochee, 500, questionsHistoire); // error : syntax error before numeric constant

          fclose(questionsHistoire);

          return 1;
      }

      long nombreAleatoire(long nombreMax)
      { // error : conflicting types for "nombreAleatoire"
          srand(time(NULL));
          return (rand() % nombreMax);
      }



      Voila, le code est commenté
      • Partager sur Facebook
      • Partager sur Twitter
        27 mai 2006 à 18:06:39

        Exact. Première erreur : un tableau de char est un pointeur. Inutile alors d'utiliser des pointeurs.
        • Partager sur Facebook
        • Partager sur Twitter
          27 mai 2006 à 18:08:40

          Citation : <!--nico-->

          Je sais pas si ton clavier est un clavier français, mais mingw me disais que tous tes signes de ponctuations étaient bizarres...


          Problème récurrent lié au forum. Parfois, les ',' et les '-' ASCII sont transformé en un équivallent non ASCII (\130 et \150).
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            27 mai 2006 à 18:14:15

            Citation : Hugoo901

                int choixCate = 0;
                // ...
                scanf ("%ld", &choixCate); puts ("\n");

            %d
            • Partager sur Facebook
            • Partager sur Twitter
              27 mai 2006 à 20:00:16

              Merci tous ! ;)

              Maintenant ca marche, vraiment merci beaucoup :)

              Pour les prototypes c'est un simple oubli mais je connai sinon pour le %d je savais vraiment pas (c'est dans le cours de mateo ca?).

              Pour l'histoire du tableaux de char qui est un pointeur je me rapelle lavoir lu mais cetait pas bien clair donc je vais relire ca sinon le bug qui me faisait une erreur du genre "error : stray /130 ..." ba effectivement ca venait des virgules et du signe - qui etait pas les bons . Donc jai bien un clavier azerty pour te rassurer :D . Et pour finir la variable inutilisés c'est car c'est un truc qui me servait a la bas et que ji oublier de retirer par la suite.

              Voila merci beaucoup ! ++


              • Partager sur Facebook
              • Partager sur Twitter
                28 mai 2006 à 14:02:47

                Me revoila :D ,

                Eh oui jai encore un probleme, alors mon premier probleme etant résolu jai continuer a programmer mon quiz mais le programme ne fonctionne pas comme je le voudrais, voici mon code :

                #include <stdio.h>
                #include <stdlib.h>
                #include <string.h>
                #include <time.h>

                int piocherQuestion (char *questionPiochee, int *reponse);
                long nombreAleatoire(long nombreMax);
                void questionner (char *question, int *reponse);

                int main(int argc, char *argv[])
                {
                    int choixCate = 0;
                    char question[500] = {0};
                    int reponse = 0;

                        puts ("     --- Quiz ---\n");
                        printf ("Voici les differentes categories :\n 1-Histoire\n 2-Maths\nVotre choix : ");
                        scanf ("%d", &choixCate); puts ("\n");

                    switch (choixCate)
                    {
                        case 1:
                            piocherQuestion (question, &reponse);
                            questionner (question, &reponse);
                            break;
                        case 2:

                            break;
                        default:
                            puts ("Erreur : choisissez une categorie en tapant le nombre qui lui correspond.\n exemple : '1' pour histoire, '2' pour maths ...");
                    }
                        return 0;
                }

                int piocherQuestion (char *questionPiochee, int *reponsePiochee)
                {
                    FILE* questionsHistoire = NULL;
                    FILE* reponsesHistoire = NULL;

                    long nombreQuestions = 0;
                    long numQuestionChoisie = 0;
                    int caractereLu = 0;

                    questionsHistoire = fopen("questionsHistoire.txt", "r");
                    reponsesHistoire = fopen("reponsesHistoire.txt", "r");

                    if (questionsHistoire == NULL)
                    {
                        printf("\nImpossible de charger le dictionnaire de questions.");
                        return 0;
                    }

                    if (reponsesHistoire == NULL)
                    {
                        printf("\nImpossible de charger le dictionnaire de reponses.");
                        return 0;
                    }

                    do
                    {
                        caractereLu = fgetc(questionsHistoire);
                        if (caractereLu == '\n')
                            nombreQuestions++;
                    } while(caractereLu != EOF);

                    numQuestionChoisie = nombreAleatoire(nombreQuestions);

                    rewind(questionsHistoire);

                    while (numQuestionChoisie > 0)
                    {
                        caractereLu = fgetc(questionsHistoire);
                        if (caractereLu == '\n')
                            numQuestionChoisie--;
                    }

                    while (numQuestionChoisie > 0)
                    {
                        caractereLu = fgetc(reponsesHistoire);
                        if (caractereLu == '\n')
                            numQuestionChoisie--;
                    }

                    fgets (questionPiochee, 500, questionsHistoire);
                    fgets (*reponsePiochee, 3, reponsesHistoire); // le warning se situe a cette ligne

                    fclose(reponsesHistoire);
                    fclose(questionsHistoire);

                    return 1;
                }

                long nombreAleatoire(long nombreMax)
                {
                    srand(time(NULL));
                    return (rand() % nombreMax);
                }

                void questionner (char *question, int *reponse)
                {
                    int reponsedonnee = 0;

                    printf("%s", question);
                    printf ("\n\nQuel est la bonne reponse ? ");
                    scanf ("%d", &reponsedonnee);
                    puts ("\n");
                    if (*reponse == reponsedonnee)
                    {
                        puts ("Bravo, c'est la bonne reponse !");
                    }
                    else
                    {
                        printf ("Perdu, la bonne reponse etait la reponse %d.", *reponse);
                    }
                    system ("PAUSE");
                }




                Le code se compile sans erreur mais avec un warning :warning: passing arg 1 of `fgets' makes pointer from integer without a cast


                Du coup mon programme s'execute mais pendant l'utilisation (vous le verrez si vous l'executer) windows m'affiche une erreur du genre "ce programme a rencontré un probleme et doit fermer ... patati et patata...".

                Alors je ne pense pas que ce soit une erreur dans le passage de pointeur a la fonction vu que maintenant je pense avoir saisi la chose, mais je pense plutot a une mauvaise utilisation de la fonction "fgets" avec le pointeur(je narrive pas a traduire le warning o fait).

                Pouvez vous maidez ? plz :)
                • Partager sur Facebook
                • Partager sur Twitter
                  28 mai 2006 à 15:43:42

                  fgets attend en premier parametre un pointeur sur char je crois. Dans ton cas tu lui fourni un int (meme pas un pointeur). Voila l'erreur.

                  Je te conseil d'utiliser des char partout que tu peux ensuite éventuellement transformer en int si c'est nécéssaire grace a des fonctions des lib standard. Sinon tu peux recoder une fonction en faisant juste un décalage dans la table ascii.
                  • Partager sur Facebook
                  • Partager sur Twitter
                    28 mai 2006 à 15:53:51

                    fgets ne peut pas écrire sur un int ?
                    Et puis il me semble que mon int est un pointeur, nan ?

                    Donc pour résoudre l'erreur il suffirait de changer mon int en char ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                      28 mai 2006 à 15:58:47

                      fgets ne prend pas d'int en parametre, uniquement un pointeur sur char, j'insite sur le mot pointeur, mais ca ne veut pas dire qu'un pointeur sur int marche, il lui faut bien un pointeur sur char.
                      Donc passe en char voila =)

                      EDIT :
                      Et j'oubliais, ce que tu passes a la ligne du warning n'est pas un pointeur mais bien un int. Le fait de mettre l'étoile indique que tu fournis l'entier qui se trouve a l'adresse du pointeur et non pas le pointeur qui s'écrirait sans étoile comme dans le premier fgets.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        28 mai 2006 à 17:58:58

                        Merci, alors maintenant je n'ai ni erreur ni warning mais le programme ne fonctionne pas comme je le voudrai voici ce que fait le programme :

                        --- Quiz ---

                        Voici les differentes categories :
                        1-Histoire
                        2-Maths
                        Votre choix : 1

                        Quel est la date de naissance de Louis 14 ? 1/ 1743 2/ 1643 3/ 1689 4/ 1789

                        Quel est la bonne reponse ? 2


                        Perdu, la bonne reponse etait la reponse 2
                        .
                        Appuyez sur une touche pour continuer...


                        C'est quand meme bizarre ...

                        En fait pour toute les questions (peu importe la réponse) il maffiche : Perdu, la bonne reponse etait la reponse 2

                        Et je ne trouve pas le bug dans mon code pourtant jai bien chercher jai meme corriger certaine choses mais ca ne fonctionne toujours pas, aidez moi svp !

                        Je vous embete surement un peu mais bon ... svp je debute :)

                        édité :

                        #include <stdio.h>
                        #include <stdlib.h>
                        #include <string.h>
                        #include <time.h>

                        int piocherQuestion (char *questionPiochee, char *reponsePiochee);
                        long nombreAleatoire(long nombreMax);
                        void questionner (char *question, char *reponse);

                        int main(int argc, char *argv[])
                        {
                            int choixCate = 0;
                            char question[500] = {0};
                            char reponse[3] = {0};

                                puts ("     --- Quiz ---\n");
                                printf ("Voici les differentes categories :\n 1-Histoire\n 2-Maths\nVotre choix : ");
                                scanf ("%d", &choixCate);

                            switch (choixCate)
                            {
                                case 1:
                                    piocherQuestion (question, reponse);
                                    questionner (question, reponse);
                                    break;
                                case 2:

                                    break;
                                default:
                                    puts ("Erreur : choisissez une categorie en tapant le nombre qui lui correspond.\n exemple : '1' pour histoire, '2' pour maths ...");
                            }
                                return 0;
                        }

                        int piocherQuestion (char *questionPiochee, char *reponsePiochee)
                        {
                            FILE* questionsHistoire = NULL;
                            FILE* reponsesHistoire = NULL;

                            long nombreQuestions = 0;
                            long numQuestionChoisie = 0;
                            long numReponseChoisie = 0;
                            int caractereLu = 0;

                            questionsHistoire = fopen("questionsHistoire.txt", "r");
                            reponsesHistoire = fopen("reponsesHistoire.txt", "r");

                            if (questionsHistoire == NULL)
                            {
                                printf("\nImpossible de charger le dictionnaire de questions.");
                                return 0;
                            }

                            if (reponsesHistoire == NULL)
                            {
                                printf("\nImpossible de charger le dictionnaire de reponses.");
                                return 0;
                            }

                            do
                            {
                                caractereLu = fgetc(questionsHistoire);
                                if (caractereLu == '\n')
                                    nombreQuestions++;
                            } while(caractereLu != EOF);

                            numQuestionChoisie = nombreAleatoire(nombreQuestions);
                            numReponseChoisie = numQuestionChoisie;

                            rewind(questionsHistoire);

                            while (numQuestionChoisie > 0)
                            {
                                caractereLu = fgetc(questionsHistoire);
                                if (caractereLu == '\n')
                                    numQuestionChoisie--;
                            }

                            rewind(reponsesHistoire);

                            while (numQuestionChoisie > 0)
                            {
                                caractereLu = fgetc(reponsesHistoire);
                                if (caractereLu == '\n')
                                    numReponseChoisie--;
                            }

                            fgets (questionPiochee, 500, questionsHistoire);
                            fgets (reponsePiochee, 3, reponsesHistoire);

                            fclose(reponsesHistoire);
                            fclose(questionsHistoire);

                            return 1;
                        }

                        long nombreAleatoire(long nombreMax)
                        {
                            srand(time(NULL));
                            return (rand() % nombreMax);
                        }

                        void questionner (char *question, char *reponse)
                        {
                            char reponsedonnee[3] = {0};

                            printf("\n%s", question);
                            printf ("\nQuel est la bonne reponse ? ");
                            scanf ("%s", reponsedonnee);
                            puts ("\n");
                            if (reponse != reponsedonnee)
                            {
                                printf ("Perdu, la bonne reponse etait la reponse %s.\n", reponse);
                            }
                            else
                            {
                                puts ("Bravo, c'est la bonne reponse !");
                            }
                            system ("PAUSE");
                        }


                        • Partager sur Facebook
                        • Partager sur Twitter
                          28 mai 2006 à 22:09:16

                          Citation : Hugoo901


                          Le code se compile sans erreur mais avec un warning :<couleur nom="bleu">warning: passing arg 1 of `fgets' makes pointer from integer without a cast


                          Problème de méthode. On n'apprend pas à se servir d'une fonction nouvelle au milieu d'une application. Trop lourd, on a peur de tout casser...

                          Il faut faire les choses une par une et les faire bien. Si on ne maitrise pas, on bricole, et on oublie et on avance pas.

                          Je te conseille donc de te pencher sur la mise en oeuvre de fgets() à l'aide d'un mini programme (snippet) qui ne traite que de ce sujet...

                          Tu ouvres ta doc sur fgets(), tu étudies l'interface, le comportement décrit, tu fais des essais, tu apprend à 'sentir' les réactions de la fonction (les traces, printf() etc. aident à la compréhension). Une fonction, c'est presque un organisme vivant qui réagit à des stimulis selon des schémas comportementaux instinctifs.

                          En cas de problème, tu poses des questions. C'est comme ça qu'on apprend. Pas en récupérant un bout code par-ci par-là sans rien comprendre des détails de fonctionnement...
                          • Partager sur Facebook
                          • Partager sur Twitter
                          Music only !
                            29 mai 2006 à 19:58:06

                            Merci ed mais maintenant jai bien compris le fonctionnement de fgets(); (enfin je pense), je sais qu'il doit prendre en premier parametre un pointeur sur un char et non sur un autre type voila :-°:D

                            Mais maintenant que jai corriger mes erreurs et que je n'ai plus aucun warning le programme ne fonctionne pas comme je voudrai, comme je l'ai dit dans mon ma précedente réponse (jai mis le code dans ma derniere réponse).

                            Aidez moi a trouver la cause du disfonctionnement silvouplait ! :honte:

                            • Partager sur Facebook
                            • Partager sur Twitter
                              29 mai 2006 à 21:03:41

                              NE JAMAIS COMPARER DEUX CHAINES DE CARACTERES EN C A L'AIDE DE L'OPERATEUR != !!!!!
                              Pour comparer tes deux chaines, tu doit utiliser la fonction strcmp comme M@teo le dit dans son cours sur les chaines de caractères ! Là tu compare les pointeurs qui seront forcément différents !
                              • Partager sur Facebook
                              • Partager sur Twitter
                                29 mai 2006 à 23:59:55

                                Citation : Hugoo901

                                Merci ed mais maintenant jai bien compris le fonctionnement de fgets(); (enfin je pense), je sais qu'il doit prendre en premier parametre un pointeur sur un char et non sur un autre type voila :-°:D


                                OK, mais as-tu bien compris que fgets() prenait aussi le '\n' ? Je préconise le nettoyage de la chaine selon le principe suivant :

                                recherche du '\n'
                                Si il est present
                                   suppression du '\n'
                                Sinon
                                   purge des caractères non lus.

                                La fonction que je propose est la suivante :

                                #include <stdio.h>
                                #include <string.h>

                                void clean (char *s, FILE *fp)
                                {
                                   /* search ... */
                                   char *p = strchr (s, '\n');
                                   if (p != NULL)
                                   {
                                      /* ... and kill */
                                      *p = 0;
                                   }
                                   else
                                   {
                                      /* purge */
                                      int c;
                                      while ((c = fgetc(fp)) != '\n' && c != EOF)
                                      {
                                      }
                                   }
                                }

                                Ca s'utilise comme ça :

                                   fgets(line, sizeof line, fp);
                                   clean(line, fp);

                                Pose des questions si tu ne comprends pas.
                                • Partager sur Facebook
                                • Partager sur Twitter
                                Music only !
                                  30 mai 2006 à 14:10:49

                                  Le debut de la fonction c'est bien pour remplacer "\n" par "\0", c bien ca? si oui c'est bien ce que javai compris et il me semble que c'est remplacable par : "reponsePiochee[strlen(reponsePiochee) - 1] = '\0';" (jai vu ca dans le TP sur le Pendu).

                                  Mais il gene en quoi ce "\n" ?

                                  Sinon je n'ai pas compris a quoi sert la purge, peut tu m'expliquer ? car a ce que jai compris ca met le curseur a la fin du fichier, nan?

                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    30 mai 2006 à 15:25:22

                                    Citation : Hugoo901

                                    Le debut de la fonction c'est bien pour remplacer "\n" par "\0", c bien ca?


                                    Oui.

                                    Citation : Pas de titre


                                    si oui c'est bien ce que javai compris et il me semble que c'est remplacable par : "reponsePiochee[strlen(reponsePiochee) - 1] = '\0';" (jai vu ca dans le TP sur le Pendu).


                                    Non. Si il n'y est pas, tu détruis un caractère utile...
                                    de plus, tu ne purges pas... (voir plus loin)

                                    Citation : Pas de titre


                                    Mais il gene en quoi ce "\n" ?


                                    Si tu saisis "abc\n" et que tu dois le comparer à "abc", ça va pas le faire... Nettoyage indistpensable...

                                    Citation : Pas de titre


                                    Sinon je n'ai pas compris a quoi sert la purge, peut tu m'expliquer ? car a ce que jai compris ca met le curseur a la fin du fichier, nan?


                                    Je rappelle qu'on a appelé fgets() avec en paramètre un nom de tableau de char et la taille de ce tableau. Si on a saisi plus de caractères que ne peux en contenir le tableau, fgets() fait ce qu'il peut et complète la séquence par un 0. Les autres caractères (donc le '\n') ne sont pas lus. Pour le moment, ils restent dans le tuyau (le flux entrant).

                                    Lorsqu'on va tester la présence du '\n', et constater qu'il n'est pas là, il y a 2 choix possibles :

                                    • agrandir le tableau et lire la suite (assez compliqué mais faisable)
                                    • purger, c'est à dire lire la ligne en entier, mais sans stocker les caractères. On s'arrête évidemment au premier '\n' lu, ou à EOF si on a pas trouvé de '\n'.

                                    Si tu veux approfondir le sujet :

                                    http://mapage.noos.fr/emdel/notes.htm#saisie
                                    http://mapage.noos.fr/emdel/notes.htm#fichiers

                                    Pose des questions si tu ne comprends pas.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                    Music only !
                                      30 mai 2006 à 15:56:40

                                      Jai pense avoir compris ta fonction clean et je lai mis dans mon code mais malheureusement le malfonctionnement persiste :( .

                                      Ca commlence a m'ennuyer cette histoire, je ne vois pas du tout d'ou ca peut venir, en tout cas merci beaucoup a ceux qui ont répondu a mon sujets :)

                                      Dites moi svp si jai encore comis une erreur dans mon nouveau code (sachant que le compileur ne maffiche aucune erreur).

                                      Et ca serait cool que quelqu'un m'indique pourquoi il y a un malfonctionnement dans mon programme (le malfonctionnement est expliké plus haut) : en fait la variable reponse reste a 2 et ne veu pas changer on dirait o_O ).

                                      Merci de maider plz (encore une fois) :D

                                      Voici mon code :

                                      #include <stdio.h>
                                      #include <stdlib.h>
                                      #include <string.h>
                                      #include <time.h>

                                      int piocherQuestion (char *questionPiochee, char *reponsePiochee);
                                      long nombreAleatoire(long nombreMax);
                                      void questionner (char *question, char *reponse);
                                      void clean (char *chaine, FILE *fichier);

                                      int main(int argc, char *argv[])
                                      {
                                          int choixCate = 0;
                                          char question[500] = {0};
                                          char reponse[3] = {0};

                                              puts ("     --- Quiz ---\n");
                                              printf ("Voici les differentes categories :\n 1-Histoire\n 2-Maths\nVotre choix : ");
                                              scanf ("%d", &choixCate);

                                          switch (choixCate)
                                          {
                                              case 1:
                                                  piocherQuestion (question, reponse);
                                                  questionner (question, reponse);
                                                  break;
                                              case 2:

                                                  break;
                                              default:
                                                  puts ("Erreur : choisissez une categorie en tapant le nombre qui lui correspond.\n exemple : '1' pour histoire, '2' pour maths ...");
                                          }
                                              return 0;
                                      }

                                      int piocherQuestion (char *questionPiochee, char *reponsePiochee)
                                      {
                                          FILE* questionsHistoire = NULL;
                                          FILE* reponsesHistoire = NULL;

                                          long nombreQuestions = 0;
                                          long numQuestionChoisie = 0;
                                          long numReponseChoisie = 0;
                                          int caractereLu = 0;

                                          questionsHistoire = fopen("questionsHistoire.txt", "r");

                                          if (questionsHistoire == NULL)
                                          {
                                              printf("\nImpossible de charger le dictionnaire de questions.");
                                              return 0;
                                          }

                                          reponsesHistoire = fopen("reponsesHistoire.txt", "r");

                                          if (reponsesHistoire == NULL)
                                          {
                                              printf("\nImpossible de charger le dictionnaire de reponses.");
                                              return 0;
                                          }

                                          do
                                          {
                                              caractereLu = fgetc(questionsHistoire);
                                              if (caractereLu == '\n')
                                                  nombreQuestions++;
                                          } while(caractereLu != EOF);

                                          numQuestionChoisie = nombreAleatoire(nombreQuestions);
                                          numReponseChoisie = numQuestionChoisie;

                                          rewind(questionsHistoire);

                                          while (numQuestionChoisie > 0)
                                          {
                                              caractereLu = fgetc(questionsHistoire);
                                              if (caractereLu == '\n')
                                                  numQuestionChoisie--;
                                          }

                                          rewind(reponsesHistoire);

                                          while (numQuestionChoisie > 0)
                                          {
                                              caractereLu = fgetc(reponsesHistoire);
                                              if (caractereLu == '\n')
                                                  numReponseChoisie--;
                                          }

                                          fgets (questionPiochee, 500, questionsHistoire);
                                          clean (questionPiochee, questionsHistoire);
                                          fclose(questionsHistoire);

                                          fgets (reponsePiochee, 3, reponsesHistoire);
                                          clean (reponsePiochee, reponsesHistoire);
                                          fclose(reponsesHistoire);

                                          return 1;
                                      }

                                      long nombreAleatoire(long nombreMax)
                                      {
                                          srand(time(NULL));
                                          return (rand() % nombreMax);
                                      }

                                      void questionner (char *question, char *reponse)
                                      {
                                          char reponsedonnee[3] = {0};
                                          int comp = 0;

                                          printf("\n%s", question);
                                          printf ("\nQuel est la bonne reponse ? ");
                                          scanf ("%s", reponsedonnee);
                                          puts ("\n");
                                          comp = strcmp(reponse, reponsedonnee);
                                          if (comp == 0)
                                          {
                                              puts ("Bravo, c'est la bonne reponse !");
                                          }
                                          else
                                          {
                                              printf ("Perdu, la bonne reponse etait la reponse %s.\n", reponse);
                                          }
                                          system ("PAUSE");
                                      }

                                      void clean (char *chaine, FILE *fichier)
                                      {
                                         char *p = strchr (chaine, '\n');
                                         if (p != NULL)
                                         {
                                            *p = 0;
                                         }
                                         else
                                         {
                                              int c;
                                              while ((c = fgetc(fichier)) != '\n' && c != EOF)
                                              {
                                              }
                                         }
                                      }


                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                        30 mai 2006 à 16:16:22

                                        Citation : Hugoo901

                                        Dites moi svp si jai encore comis une erreur dans mon nouveau code (sachant que le compileur ne maffiche aucune erreur).


                                        Tu peux donner un exemple de fichier ?

                                        Et ça, c'est pas terrible. Malgré l'absence de fichier, tu poses la question ?

                                             --- Quiz ---

                                        Voici les differentes categories :
                                         1-Histoire
                                         2-Maths
                                        Votre choix : 1

                                        Impossible de charger le dictionnaire de questions.

                                        Quel est la bonne reponse ? xxx


                                        Perdu, la bonne reponse etait la reponse .
                                        Appuyez sur une touche pour continuer...

                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                        Music only !
                                          30 mai 2006 à 19:26:56

                                          questionsHistoires.txt :
                                          Quel est la date de naissance de Louis 14 ? 1/ 1743 2/ 1643 3/ 1689 4/ 1789
                                          En quelle annee est mort Louis 15 ? 1/ 1774 2/ 1874 3/ 1747 4/1847
                                          A quellle date fut fixee le sacre de Napoleon ? 1/ 02/12/1804 2/ 03/12 1804 3/ 02/02/1804 4 03/02/1804


                                          reponsesHistoire.txt :
                                          2
                                          1
                                          1


                                          Voila, c'est bien ca que tu voulais, non?
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            30 mai 2006 à 22:18:14

                                            Citation : Hugoo901

                                            Voila, c'est bien ca que tu voulais, non?


                                            Ben oui, comme ça, je vais pouvoir tester, moi aussi...

                                            J'ai trouvé. Dans ce code,

                                                while (numQuestionChoisie > 0)
                                                {
                                                    caractereLu = fgetc(questionsHistoire);
                                                    if (caractereLu == '\n')
                                                        numQuestionChoisie--;
                                                }

                                                rewind(reponsesHistoire);

                                            la variable 'numQuestionChoisie' est modifée, ce qui fait qu'ici, elle vaut 0 et que par conséquent, on ne rentre pas dans la boucle :

                                                while (numQuestionChoisie > 0)
                                                {
                                                    caractereLu = fgetc(reponsesHistoire);
                                                    if (caractereLu == '\n')
                                                        numReponseChoisie--;
                                                }

                                            En matière de codage, il y a des regles de bon sens qui font que si on s'est fait sué à obtenir une valeur, on ne la modifie pas. Eventuellement, on utilise une variable locale 'jetable' pour jouer les compteurs... L'économie de variable est une fausse économie et un vrai générateur de bugs...
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                            Music only !
                                              31 mai 2006 à 13:12:32

                                              Merci beaucoup -ed- davoir localisé l'erreur ! :)

                                              Ouf, enfin mon code fonctionne :) . Ca fait plaisir !

                                              Voila problème résolu !
                                              • Partager sur Facebook
                                              • Partager sur Twitter

                                              Erreurs a la compilation

                                              × 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