Partage
  • Partager sur Facebook
  • Partager sur Twitter

Petit problème de fonctions

Sujet résolu
    16 avril 2006 à 18:35:20

    Voila, jai essayé de créer dans le jeu du plus ou du moins des fonctions, mais à chaque fois, il y a une erreur sur cette ligne :

    nombreMystere = nombreMystere(nombreDeJoueur);


    le build message est le suivant : error: called object is not a function.

    Voila le code en entier :

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

    long nombreMystere (char nombreDeJoueur)
    {
        long MIN = 1, MAX = 100, nombreMystere = 0;
                if (nombreDeJoueur == 1)
                    {
                        srand(time(NULL));
                        nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
                    }
                else if (nombreDeJoueur == 2)
                    {
                        printf ("Joueur 1, entrez un nombre entre %i et %i, joueur 2, ne regardez pas. ",MAX, MIN);
                        scanf ("%id", &nombreMystere);
                        printf ("joueur 2, c'est a vous de jouer.\n\n\n");
                    }
                else
                    {
                        printf ("Combien de joueurs vont jouer ? 1 ou 2");
                        scanf ("%id", &nombreDeJoueur);
                    }
                return nombreMystere;
    }
    int main( int argc, char** argv )
    {
        char commencerPartie = 1, nombreDeJoueur = 1;
        long nombreEntre = 0, nombreDeCoups = 0, nombreMystere = 1;
        while (commencerPartie == 1)
            {
                printf ("Combien de joueurs vont jouer, 1 ou 2");
                scanf ("%id", nombreDeJoueur);
                nombreMystere = nombreMystere(nombreDeJoueur);
                do
                    {
                        printf ("Quel est le nombre mystere ?");
                        scanf ("%id", &nombreEntre);
                        nombreDeCoups++;
                        if (nombreMystere > nombreEntre)
                            printf("C'est plus !\n\n");
                        else if (nombreMystere < nombreEntre)
                            printf("C'est moins !\n\n");
                        else
                            printf ("Bravo, vous avez trouve le nombre mystere en %i coups.!!!\n\n", nombreDeCoups);
                    }
                while (nombreEntre != nombreMystere);
                printf ("Voulez vous faire une autre partie, entrez 1 pour oui ou 0 pour non.");
                scanf ("%id", &commencerPartie);
            }
    }


    si quelqu'un pouvait me dire quelle est l'erreur que j'ai faite.

    PS : escusez moi si il y a des fautes d'othographe, je suis un zero dans ce domaine également.
    • Partager sur Facebook
    • Partager sur Twitter
      16 avril 2006 à 23:09:57

      Citation : fab5695

      error: called object is not a function.



      long nombreMystere (char nombreDeJoueur)
      <...>
      int main( int argc, char** argv )
      {
          long nombreEntre = 0, nombreDeCoups = 0, nombreMystere = 1;

                  nombreMystere = nombreMystere(nombreDeJoueur);



      Magnifique exemple de 'shadowing'

      main.c: In function `main_':
      main.c:31: warning: declaration of 'nombreMystere' shadows a global declaration
      main.c:7: warning: shadowed declaration is here

      De l'anglais shadow, ombre, le shadowing est l'effet qui consiste à 'porter de l'ombre à', 'masquer'.

      En effet, dans main(), la défintion de la fonction nombreMystere() est 'masquée' par la définition de la variable locale du même nom nombreMystere. Ici, l'effet est désastreux, car la fonction n'existe plus, et elle ne peut plus être appelée du tout.

      Le même phénomène se produit dans la fonction nombreMystere(), mais il est sans conséquence.

      Conclusion, il faut être plus attentif au choix des noms. Pour une fonction, un verbe d'action ou une action est plus clair. Par exemple : obtenirNombreMystere()
      • Partager sur Facebook
      • Partager sur Twitter
      Music only !
        19 avril 2006 à 18:47:16

        Ok merci pour la réponse, maintenant ça marche, mais le programme plante après, je vais essayer de le débugger.
        • Partager sur Facebook
        • Partager sur Twitter
          20 avril 2006 à 19:07:13

          J'ai beau chercher, je ne trouve, alors si quelqu'un pouvait me dire pourquoi windows affiche que mon programme doit etre fermé une foi que j'ai entré le nombre de joueurs qui vont jouer ? Je remets mon code :

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

          long ObtenirNombreMystere (long nombreDeJoueur)
          {
              long MIN = 1, MAX = 100, nombreMystere = 0;
                      if (nombreDeJoueur == 1)
                          {
                              srand(time(NULL));
                              nombreMystere = (rand() % (MAX - MIN + 1)) + MIN;
                          }
                      else if (nombreDeJoueur == 2)
                          {
                              printf ("Joueur 1, entrez un nombre entre %i et %i, joueur 2, ne regardez pas. ",MAX, MIN);
                              scanf ("%id", &nombreMystere);
                              printf ("joueur 2, c'est a vous de jouer.\n\n\n");
                          }
                      else
                          {
                              printf ("Combien de joueurs vont jouer ? 1 ou 2");
                              scanf ("%id", &nombreDeJoueur);
                          }
                      return nombreMystere;
          }
          int main( int argc, char** argv )
          {
              char commencerPartie = 1;
              long nombreEntre = 0, nombreDeCoups = 0, nombreMystere = 1, nombreDeJoueur = 1;
              while (commencerPartie == 1)
                  {
                      printf ("Combien de joueurs vont jouer, 1 ou 2");
                      scanf ("%id", nombreDeJoueur);

                      nombreMystere = (ObtenirNombreMystere(nombreDeJoueur));
              do
                  {
                      printf ("Quel est le nombre mystere ?");
                      scanf ("%id", &nombreEntre);
                      nombreDeCoups++;
                          if (nombreMystere > nombreEntre)
                              printf("C'est plus !\n\n");
                          else if (nombreMystere < nombreEntre)
                              printf("C'est moins !\n\n");
                          else
                              printf ("Bravo, vous avez trouve le nombre mystere en %i coups.!!!\n\n", nombreDeCoups);
                  }
              while (nombreEntre != nombreMystere);
                      printf ("Voulez vous faire une autre partie, entrez 1 pour oui ou 0 pour non.");
                      scanf ("%id", &commencerPartie);
                  }
          }


          Merci d'avance pour vos réponse.
          • Partager sur Facebook
          • Partager sur Twitter
            20 avril 2006 à 19:17:45

            Citation : fab5695

            J'ai beau chercher, je ne trouve, alors si quelqu'un pouvait me dire pourquoi windows affiche que mon programme doit etre fermé une foi que j'ai entré le nombre de joueurs qui vont jouer ? Je remets mon code :


            Apprendre à regler son compilateur...

            Project : OP code
            Compiler : GNU GCC Compiler (called directly)
            Directory : C:\dev\forums\OP\
            --------------------------------------------------------------------------------
            Switching to target: default
            Compiling: main.c
            main.c:6: warning: no previous prototype for 'ObtenirNombreMystere'
            main.c: In function `ObtenirNombreMystere':
            main.c:10: warning: passing arg 1 of `srand' as unsigned due to prototype
            main.c:15: warning: int format, long int arg (arg 2)
            main.c:15: warning: int format, long int arg (arg 3)
            main.c:16: warning: int format, long int arg (arg 2)
            main.c:22: warning: int format, long int arg (arg 2)
            main.c: In function `main_':
            main.c:33: warning: format argument is not a pointer (arg 2)
            main.c:39: warning: int format, long int arg (arg 2)
            main.c:46: warning: int format, long int arg (arg 2)
            main.c:50: warning: int format, different type arg (arg 2)
            main.c:52:2: warning: no newline at end of file
            main.c:52: warning: control reaches end of non-void function
            Linking console executable: C:\dev\forums\OP\01.exe
            Process terminated with status 0 (0 minutes, 2 seconds)
            0 errors, 12 warnings
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
              20 avril 2006 à 19:19:04

              Régler son compilateur, comment on fait sa ???
              • Partager sur Facebook
              • Partager sur Twitter
                20 avril 2006 à 19:22:25

                Citation : fab5695

                Régler son compilateur, comment on fait sa ???


                Quel est ton environnement de développement ?
                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  20 avril 2006 à 19:23:54

                  C'est Code::Blocks v1.0
                  • Partager sur Facebook
                  • Partager sur Twitter
                    20 avril 2006 à 19:25:07

                    Citation : fab5695

                    C'est Code::Blocks v1.0


                    Tu utilises le compilateur MinGW (Windows) ou gcc (Linux) ?
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      20 avril 2006 à 19:26:36

                      Windows, XP plus précisement
                      • Partager sur Facebook
                      • Partager sur Twitter
                        20 avril 2006 à 19:37:41

                        Citation : fab5695

                        Windows, XP plus précisement


                        On va supposer MinGW...

                        Par défaut, le compilateur est appelé sans options particulières. Il a donc un comportement 'par défaut' qui est asez laxiste.

                        Il est préférable d'indiquer au compilateur que l'on veut qu'il vasse plus de vérifications. Pour ça, on peut lui passer un certain nombres d'options. Celles qui donnent pas mal de résultats intéressants sont :
                        -Wall -Wextra -O2

                        si on fait du C strictement conforme à C90, on peut utiliser
                        -Wall -Wextra -O2 -ansi -pedantic


                        Pour demander à Code::Blocks d'ajouter ces options, il faut faire ceci :

                        Settings / Compiler
                        Onglet 'Compiler / Other options
                        entrer l'une ou l'autres des listes d'options
                        OK

                        C'est tout.

                        Recompiler complètement :

                        Build / Rebuid

                        • Partager sur Facebook
                        • Partager sur Twitter
                        Music only !
                          20 avril 2006 à 19:44:23

                          j'ai bien mis c'est ligne dans l'endroit indiqué, mais sa ne fonctionne toujours pas, mais ce n'est pas grave, je vais passer à la suite du cours.
                          • Partager sur Facebook
                          • Partager sur Twitter
                            20 avril 2006 à 19:49:15

                            Citation : fab5695

                            j'ai bien mis c'est ligne dans l'endroit indiqué, mais sa ne fonctionne toujours pas, mais ce n'est pas grave, je vais passer à la suite du cours.


                            Je but de cette ligne n'est pas 'que ça fonctionne', mais que ça te dises qu'il y a un tas de choses à corriger...
                            • Partager sur Facebook
                            • Partager sur Twitter
                            Music only !

                            Petit problème de fonctions

                            × 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