Partage
  • Partager sur Facebook
  • Partager sur Twitter

Programmation modulaire

Du mal à gérer les directives de préprocesseurs

Sujet résolu
    3 octobre 2007 à 0:47:19

    Bonsoir à tous !
    J'ai un petit soucis. J'ai compris (du point de vue théorique) le cour de M@théo sur la programmation modulaire (Partie 2, Chapitre 1).
    Seulement voilà, du point de vue pratique cette fois j'ai quelques petites erreurs...
    En effet j'ai modifié le "TP Plus ou Moins", j'ai maintenant 3 fichiers :
    • un fichier source (main.c) qui est le "corps" de mon programme
    • un fichier header (Programme.h) qui contient les prototypes de mes fonctions
    • un fichier source (Programme.c) qui contient le code de mes fonctions

    Donc en toute logique j'ai inclus le fichier "Programme.h" tout en haut du fichier "Programme.c" avec les autres directives de préprocesseur, comme cela :
    1. #include <stdio.h>
    2. #include <stdlib.h>
    3. #include <time.h>
    4. #include "Programme.h"

    J'ai bien compris tout ça, je crois.
    Mais au sommet du fichier main.c, je suis dans le flou quand à ce qu'il faut mettre...
    Voici ce qu'il contient :
    1. int main()
    2. {
    3.     long niveau;
    4.     presentation ();
    5.     niveau = niveauDeDifficulte ();
    6.     jeu (niveau);
    7.     getchar();
    8.     return 0;
    9. }

    J'ai tenté plusieurs trucs :
    • Ne rien mettre;
    • Mettre ces directives de préprocesseur :
    1. #include <stdio.h>
    2. #include <stdlib.h>
    </ul>
    Mais ces 2 méthodes plantaient à la compilation.
    Comme j'utilise des fonctions dont le code est contenu dans un autre fichier, je suppose qu'il faudrait mettre cela :
    1. #include "Programme.h"

    Mais ça plante toujours :
    C:\Users\SmallFitz\Documents\Projets Programmation\TP plus ou moins\main.c:: In function `main':
    C:\Users\SmallFitz\Documents\Projets Programmation\TP plus ou moins\main.c:20: warning: implicit declaration of function `system'
    obj\Debug\main.o:: In function `main':C:/Users/SmallFitz/Documents/Projets Programmation/TP plus ou moins/main.c:17: undefined reference to `presentation'
    :C:\Users\SmallFitz\Documents\Projets Programmation\TP plus ou moins\main.c:18: undefined reference to `niveauDeDifficulte'
    :C:\Users\SmallFitz\Documents\Projets Programmation\TP plus ou moins\main.c:19: undefined reference to `jeu'
    :: === Build finished: 2 errors, 1 warnings ===

    J'ai réussi à contourner le problème en le remplaçant par :
    1. #include "Programme.c"

    Mais je ne suis pas vraiment convaincu par ce bricolage, car M@teo n'en parle pas, et je ne suis même pas sûr que ça fonctionne toujours.

    Bref, si quelqu'un pouvait me donner un petite explication, ça serait vraiment bienvenue !
    Bonne nuit à tous.
    • Partager sur Facebook
    • Partager sur Twitter
      3 octobre 2007 à 5:30:09

      Alors voilà. Ce n'est vraiment pas compliqué.

      Citation : SmallFitz

      Bonsoir à tous !
      J'ai un petit soucis. J'ai compris (du point de vue théorique) le cour de M@théo sur la programmation modulaire (Partie 2, Chapitre 1).
      Seulement voilà, du point de vue pratique cette fois j'ai quelques petites erreurs...
      En effet j'ai modifié le "TP Plus ou Moins", j'ai maintenant 3 fichiers :

      • un fichier source (main.c) qui est le "corps" de mon programme
      • un fichier header (Programme.h) qui contient les prototypes de mes variables
      • un fichier source (Programme.c) qui contient le code de mes fonctions


      Donc en toute logique j'ai inclus le fichier "Programme.h" tout en haut du fichier "Programme.c" avec les autres directives de préprocesseur, comme cela :

      1. #include <stdio.h>
      2. #include <stdlib.h>
      3. #include <time.h>
      4. #include "Programme.h"


      J'ai bien compris tout ça, je crois.


      En effet, tu as compris. Dans ton fichier .c tu inclus le fichier .h qui contient les prototypes.
      Sauf une petite chose (erreur d'inattention probablement) :
      • un fichier header (Programme.h) qui contient les prototypes de mes variables

      serait plutôt
      • un fichier header (Programme.h) qui contient les prototypes de mes fonctions

      Citation : Toi


      Mais au sommet du fichier main.c, je suis dans le flou quand à ce qu'il faut mettre...


      Et bien tous dépends des include des autres fichier. (Exemple, tu as un fichier programme.h qui inclus un fichier fonctions.h, tu n'as pas besoin d'inclure fonction.h dans le main.c).
      Mais tu dois inclure tous les ".h" qui ne sont pas inclus dans un autre fichier lui-même inclus dans le main (ou dans un autre fichier inclus dans le main, etc). Désolé si ce n'est pas clair. Je donne un autre exemple :

      tu as 5 fichiers .h
      1.h
      2.h
      3.h
      4.h
      5.h
      Chacun on leur fichier ".c", et il y a le main.
      le fichier 1.h inclus le fichier 2.h
      le fichier 2.h inclus le fichier 5.h et le fichier 3.h
      Le fichier 5.h n'inclus rien d'autre.
      En incluant le 1.h dans ton main, tu inclus donc aussi le 2.h, le 4.h et le 5.h . N'en reste plus qu'un
      Le 3.h n'inclus aucun fichier et est inclus nulle part ailleurs. Il est donc obligatoire de l'inclure dans ton main.c

      includes du fichier main.c :
      1. /*toutes les includes nécessaires, stdio, stdlib, string, math, time, etc*/
      2. #include "1.h"
      3. #include "3.h"

      Et chaque fichier .c inclus le fichier .h qui s'y réfère. (1.c et 1.h etc)
      J'espère que c'est clair.
      Si ce ne l'est pas, ce n'est pas si grave, contente toi de te rappeler qu'il faut inclure tout les fichiers header, le système anti-inclusion infini va faire le reste, (et, si tu comprends, rappels toi qu'il faut inclure tous les header qui n'ont pas été inclus ailleurs).

      Donc, concrètement, voici les includes nécessaire (donc exclusivement ceux qui te sont nécessaire) à ton main :

      1. #include <stdlib.h> /*pour la fonction system, uniquement*/
      2. #include "Programme.h"/*pour que ton header fasse partie du projet, donc que tes prototypes soit pris en compte.*/

      et voilà.

      Tu as déjà donner les includes de ton fichier programme.c et il n'y en a aucun dans le fichiers programme.h

      Citation : Bah

      Voici ce qu'il contient :

      1. int main()
      2. {
      3.     long niveau;
      4.     presentation ();
      5.     niveau = niveauDeDifficulte ();
      6.     jeu (niveau);
      7.     system ("PAUSE");
      8.     return 0;
      9. }


      Évite la fonction system ("PAUSE"); qui n'est pas portable (FAQ [2][1]). Utilise plutôt getchar(); ;)

      Citation : Bah2


      J'ai tenté plusieurs trucs :

      • Ne rien mettre;
      • Mettre ces directives de préprocesseur :
      1. #include <stdio.h>
      2. #include <stdlib.h>

      </ul>
      Mais ces 2 méthodes plantaient à la compilation.



      En effet, ce n'est ni un ni l'autre. Ne rien mettre ne définit ni system ni tes fonctions.
      Ne mettre que ces deux là (stdio en inutile dans ce cas-ci) ne défini pas tes fonctions, mais uniquement system("PAUSE").
      Normal que ça plante.

      Citation : Bah74587215

      Comme j'utilise des fonctions dont le code est contenu dans un autre fichier, je suppose qu'il faudrait mettre cela :

      1. #include "Programme.h"


      Mais ça plante toujours :

      C:UsersSmallFitzDocumentsProjets ProgrammationTP plus ou moinsmain.c:: In function `main':
      C:UsersSmallFitzDocumentsProjets ProgrammationTP plus ou moinsmain.c:20: warning: implicit declaration of function `system'
      objDebugmain.o:: In function `main':C:/Users/SmallFitz/Documents/Projets Programmation/TP plus ou moins/main.c:17: undefined reference to `presentation'
      :C:UsersSmallFitzDocumentsProjets ProgrammationTP plus ou moinsmain.c:18: undefined reference to `niveauDeDifficulte'
      :C:UsersSmallFitzDocumentsProjets ProgrammationTP plus ou moinsmain.c:19: undefined reference to `jeu'
      :: === Build finished: 2 errors, 1 warnings ===


      Alors là, tu as mal fait quelque chose (ton fichier .h en l'occurrence, doit avoir une erreur). Parce que c'est bien cela que tu aurais du faire.

      Citation : Gnan ET Bah


      J'ai réussi à contourner le problème en le remplaçant par :

      1. #include "Programme.c"


      Mais je ne suis pas vraiment convaincu par ce bricolage, car M@teo n'en parle pas, et je ne suis même pas sûr que ça fonctionne toujours.

      Bref, si quelqu'un pouvait me donner un petite explication, ça serait vraiment bienvenue !
      Bonne nuit à tous.



      En effet, en incluant directement le programme.c, ton problème est réglé parce que c'est exactement comme si tu aurais défini les fonctions avant ton main (comme tu faisait avant la programmation modulaire, et avant les prototypes).
      Le problème, si dans une de tes fonctions, tu appels une autre fonction et celle-ci est situé après la première, alors ça plante parce qu'au moment de l'appel de la fonction, elle n'est pas encore connu du compilo.
      C'est un des avantages des header d'éviter cela. Peu importe l'ordre des prototypes, toutes les fonctions sont connues dès le début du programme, avant le moindre code (donc avant même d'entrer dans le main).

      Ton fichier .h devrait donc ressemblé à :

      1. /*pour éviter les inclusions multiple. */
      2. #ifndef DEF_NIMPORTEQUOI /*condition*/
      3. #define DEF_NIMPORTEQUOI /*définition de la variable*/
      4. /*Si la variable n'était pas défini, elle l'est maintenant.
      5. Donc le suite ne pourra s'exécuter qu'une seule fois*/
      6. /*Les prototyes*/
      7.     /*comme la fonction ne prend pas de paramètre, on inscrit comme paramètre "void" signifie "vide".
      8.     Pour le type. Je ne sais pas. Mais elle semblait ne rien retourner.
      9.     Donc void : "Qui ne retourne rien'*/
      10.     void presentation (void);
      11.     /*la fonction retourne un long mais ne prend pas de paramètre*/
      12.     long niveauDeDifficulte (void);
      13.     /*la fonction prend un paramètre long mais ne renvoid rien.*/
      14.     void jeu (long niveau);
      15. /*fin de la condition. le code après cela pourra être exécuter.
      16. Mais dans un .h, tout le code se trouve entre le #if et le #endif*/
      17. #endif


      J'ai énormément commenté pour être sûr que tu comprennes.
      Bien sûr, tu dois changer mes prototypes de fonctions pour les tiens.
      S'il y a toujours des problèmes, poste ton code (du header)

      Autre petit commentaire, évite les long quand les int suffisent (90% du temps). Je ne sais pas pourquoi, mais M@téo à la manie d'utiliser des long partout. Essaie de t'habituer tout de suite au int ;)

      Voilà.
      En espérant avoir aidé.
      • Partager sur Facebook
      • Partager sur Twitter
        6 octobre 2007 à 16:47:52

        Merci beaucoup pour tes réponses, Mikechaos !
        Maintenant je comprend mieux.

        Mais j'ai toujours un soucis lorsque je veux compiler.
        A mon avis il n'y a pas d'erreur dans le code de mes fonctions.
        Ca doit être une nouvelle fois une mauvaise utilisation de la programmation modulaire.
        Le message d'erreur qui apparait quand je compile :
        obj\Release\main.o:main.c:(.text+0x19):: undefined reference to `presentation'
        obj\Release\main.o:main.c:(.text+0x1e):: undefined reference to `niveauDeDifficulte'
        obj\Release\main.o:main.c:(.text+0x26):: undefined reference to `jeu'
        :: === Build finished: 3 errors, 0 warnings ===


        Donc il doit y avoir une erreur dans mon header, comme tu dis, mais je ne vois vraiment pas où et pourquoi, puisque j'ai mis tous les prototypes des fonctions de Programme.c dans Programme.h
        Le code de Programme.h :
        1. #ifndef PROGRAMME_H_INCLUDED
        2. #define PROGRAMME_H_INCLUDED
        3. // Prototypes des fonctions :
        4. void presentation (void);// Presentation du jeu, d'ordre esthétique
        5. long niveauDeDifficulte (void); // Fais choisir niveau de difficulté 1,2 ou 3
        6. long jeu (long niveauDeDifficulte);// Le jeu lui meme
        7. long genereNombreAleatoire (long min, long max);// Genere un nombre aleatoirement dans [min ; max]
        8. long choixMenu (long nombreChoixPossibles);// Verifie que le choix est correct et l'enregistre
        9. long initialiseMax (long niveauDeDifficulte);// Donne une valeur a max en fonction de niveauDeDifficulte (100, 1000, ou 10 000)
        10. #endif // PROGRAMME_H_INCLUDED


        Je donne aussi la structure du code de Programme.c, j'ai enlevé l'affichage de certaines fonctions(qui alourdissait le code) pour une meilleure compréhension.
        1. // Les inludes qui me paraissent necessaires :
        2. #include <stdio.h>
        3. #include <stdlib.h>
        4. #include <time.h>
        5. #include "Programme.h"
        6. void presentation (void)// Presentation du jeu, d'ordre esthetique
        7. {
        8.     /* Affichage inutile
        9.     pour la comprehension du code */
        10. }
        11. long niveauDeDifficulte (void)// Fais choisir niveau de difficulté 1,2 ou 3. Elle appelle la fonction choixMenu.
        12. {
        13.     long nombreChoixPossibles = 3, choix = 0;
        14.     do
        15.     {
        16.         /* Affichage qui presente
        17.            les differents niveaux */
        18.         // Puis appelle la fonction choixMenu pour analyser si le choix est correct
        19.         choix = choixMenu (nombreChoixPossibles);
        20.     }while (choix == -1); // Si choix == -1, le choix était mauvais. Donc la boucle recommence.
        21.     return choix;
        22. }
        23. long jeu (long niveauDeDifficulte)// Deroulement du jeu
        24. {
        25.     long nombreDeTentatives = 0, max, nombreEntrePourEssai, nombreMystere;
        26.     // Appelle la fonction initialiseMax
        27.     max = initialiseMax (niveauDeDifficulte);
        28.     // Appelle la fonction genereNombreAleatoire
        29.     nombreMystere = genereNombreAleatoire ( 1, max );
        30.      // Boucle du jeu. Tant que le joueur n'a pas trouve le nombre mystere elle recommence.
        31.     do
        32.     {
        33.         printf("Trouvez le nombre entre 1 et %ld !\n",max);
        34.         nombreDeTentatives ++;
        35.         printf("Nombre de tentatives : %ld.\nEntrez un nombre :\n",nombreDeTentatives);
        36.         scanf("%ld",&nombreEntrePourEssai);
        37.         if (nombreEntrePourEssai < 1 || nombreEntrePourEssai > max)
        38.         {
        39.             printf("!!! ERREUR : ce nombre doit etre compris entre 1 et %ld !!!\n",max);
        40.             printf("  => PENALITE : cette erreur est comptée comme une tentative. Soyez plus vigilant a l'avenir !\n");
        41.         }
        42.         else if (nombreEntrePourEssai < nombreMystere)
        43.         {
        44.             printf("\nRATE : c'est plus grand !\n");
        45.         }
        46.         else if (nombreEntrePourEssai > nombreMystere)
        47.         {
        48.             printf("\nRATE : c'est plus petit !\n");
        49.         }
        50.         else if (nombreEntrePourEssai == nombreMystere)
        51.         {
        52.             printf("FELICITATION ! Tu as gagne !");
        53.             printf("Nombre de tentatives : %ld",nombreDeTentatives);
        54.         }
        55.     }while (nombreEntrePourEssai != nombreMystere);
        56.     return 0;
        57. }
        58. long genereNombreAleatoire (long min, long max)// Genere un nombre aleatoirement dans [min ; max]
        59. {
        60.     long nombreMystere = 0;
        61.     srand(time(NULL));
        62.     nombreMystere = (rand() % (max - min + 1)) + min;
        63.     return nombreMystere;
        64. }
        65. long choixMenu (long nombreChoixPossibles)// Verifie le choix. Si correct: renvoie la bonne valeur. Si faux renvoie la valeur -1
        66. {
        67.     long choix = 0;
        68.     printf("Entrer choix entre 1 et %ld : ",nombreChoixPossibles);
        69.     scanf("%ld",&choix);
        70.     if (choix<1 || choix>nombreChoixPossibles )
        71.     {
        72.         // Message d'erreur pour choix invalide
        73.         printf("\nTu ne sais pas faire un choix ? J'ai dit entre 1 et %ld c'est pourtant pas difficile !\n",nombreChoixPossibles);
        74.         printf("On recommence...\n\n");
        75.         choix = -1;
        76.     }
        77.     return choix;
        78. }
        79. long initialiseMax (long niveauDeDifficulte)// Donne une valeur à max en fonction du niveau de difficulte choisi
        80. {
        81.     long max = 0;
        82.     switch ( niveauDeDifficulte )
        83.     {
        84.         case 1 :
        85.         max = 100;
        86.         break;
        87.         case 2 :
        88.         max = 1000;
        89.         break;
        90.         case 3 :
        91.         max = 10000;
        92.         break;
        93.         default :
        94.         printf("Le choix du niveau de difficultes a mal ete saisis, veuillez contacter le concepteur\n");
        95.         break;
        96.     }
        97.     return max;
        98. }

        Où est mon erreur ?

        J'ai tenté de rendre mon code le plus clair possible... Si je dois modifier des trucs dites-le.
        Maintenant si quelqu'un pouvait me dire où ça ne va pas ça serait cool.
        Merci d'avance.

        Ensuite Mikechaos je pense que tu as fais une erreur (d'inattention certainement) dans ton deuxième exemple.
        Rappel :

        Citation : Mikechaos


        Le fichier 1.h inclus le fichier 2.h
        Le fichier 2.h inclus le fichier 5.h et le fichier 3.h
        Le fichier 5.h n'inclus rien d'autre.


        Ce ne serait pas plutôt :

        Par l'intermédiaire du 1.h, les headers 2.h, 3.h et 5.h sont inclus.
        C'est à dire tous les headers sauf le 4.h.
        Donc il ne reste que le 4.h qui n'est inclus nulle part.
        Et ça donnerait alors :
        1. #include "1.h"
        2. #include "4.h"

        Non ?

        Ensuite tu te demandes pourquoi M@teo21 utilise souvent des long au lieu des int, il donne lui-même la réponse dans son tuto :

        Citation : M@teo21

        Vous remarquerez qu'int et un long ont l'air identiques. Avant ce n'était pas le cas (un int était plus petit qu'un long), mais aujourd'hui les mémoires ont évolué et on a assez de place pour stocker des grands nombres, donc on se moque un peu de la différence entre un int et un long. Le langage C "conserve" tous ces types pour des raisons de compatibilité, même si certains sont un peu de trop.
        En pratique, j'utilise principalement char, long et double.


        Une autre petite question au passage :
        Est-il nécessaire de mettre "void" pour indiquer que la fonction ne reçoit aucun type ou bien peut-on mettre des parenthèses vides ? Personnellement j'ai toujours fait ça et ça n'a jamais planté... Mais c'est peut-être "sale" ? En tout cas là j'ai évité :)
        • Partager sur Facebook
        • Partager sur Twitter
          6 octobre 2007 à 17:08:25

          Citation : SmallFitz

          Une autre question au passage : Est-il nécessaire de mettre "void" pour indiquer que la fonction ne reçoit aucun type


          Oui.
          • Partager sur Facebook
          • Partager sur Twitter
          Music only !
            6 octobre 2007 à 17:09:59

            OK, merci -ed- !
            Et pour mon erreur dans le code, quelqu'un a une petite idée ?
            D'avance merci... :)
            • Partager sur Facebook
            • Partager sur Twitter
              7 octobre 2007 à 19:16:37

              Petit UP. ^^

              Comme personne n'a répondu j'ai tout rééditer, pour une meilleure compréhension.
              Je m'étais surement mal exprimé et on a du croire que mon problème était résolu.

              Je suis toujours bloqué, et je ne peux attaquer de nouveaux projets sans savoir maitriser la programmation modulaire. :(

              Donc si vous si vous avez le temps, et si vous pouviez y rejeter un coup d'œil...
              Merci. :)
              • Partager sur Facebook
              • Partager sur Twitter
                7 octobre 2007 à 22:45:17

                Citation : SmallFitz

                Petit UP. ^^

                Comme personne n'a répondu j'ai tout rééditer, pour une meilleure compréhension.
                Je m'étais surement mal exprimé et on a du croire que mon problème était résolu.

                Je suis toujours bloqué, et je ne peux attaquer de nouveaux projets sans savoir maitriser la programmation modulaire. :(

                Donc si vous si vous avez le temps, et si vous pouviez y rejeter un coup d'œil...
                Merci. :)


                Dans main.c, il faut inclure programme.h pour les fonctions de l'application et <stdio.h> pour getchar() :
                1. #include "Programme.h"
                2. #include <stdio.h>
                3. int main (void)
                4. {
                5.    long niveau;
                6.    presentation ();
                7.    niveau = niveauDeDifficulte ();
                8.    jeu (niveau);
                9.    getchar ();
                10.    return 0;
                11. }

                Dans programme.c. srand() doit être appelé une seule fois. Voici ton code réorganisé. Les fonctions 'static' ne sont pas visibles de l'extérieur, elles n'ont donc pas de prototype séparé.
                1. #include "Programme.h"
                2. #include <stdio.h>
                3. #include <stdlib.h>
                4. #include <time.h>
                5. int main (void)
                6. {
                7.    long niveau;
                8.     srand(time(NULL));
                9.    presentation ();
                10.    niveau = niveauDeDifficulte ();
                11.    jeu (niveau);
                12.    getchar ();
                13.    return 0;
                14. }

                1. #ifndef PROGRAMME_H_INCLUDED
                2. #define PROGRAMME_H_INCLUDED
                3. /* Prototypes des fonctions : */
                4. /* Presentation du jeu, d'ordre esthétique */
                5. void presentation (void);
                6. /* Fais choisir niveau de difficulté 1,2 ou 3 */
                7. long niveauDeDifficulte (void);
                8. /* Le jeu lui meme */
                9. long jeu (long niveauDeDifficulte);
                10. /* PROGRAMME_H_INCLUDED */
                11. #endif

                1. /* Les includes qui me paraissent necessaires : */
                2. #include "Programme.h"
                3. #include <stdio.h>
                4. #include <stdlib.h>
                5. /* Verifie le choix. Si correct: renvoie la bonne valeur. Si faux renvoie la valeur -1 */
                6. static long choixMenu (long nombreChoixPossibles)
                7. {
                8.    long choix = 0;
                9.    printf ("Entrer choix entre 1 et %ld : ", nombreChoixPossibles);
                10.    scanf ("%ld", &choix);
                11.    if (choix < 1 || choix > nombreChoixPossibles)
                12.    {
                13. /* Message d'erreur pour choix invalide */
                14.       printf
                15.          ("\nTu ne sais pas faire un choix ? J'ai dit entre 1 et %ld c'est pourtant pas difficile !\n",
                16.           nombreChoixPossibles);
                17.       printf ("On recommence...\n\n");
                18.       choix = -1;
                19.    }
                20.    return choix;
                21. }
                22. /* Genere un nombre aleatoirement dans [min ; max] */
                23. static long genereNombreAleatoire (long min, long max)
                24. {
                25.    long nombreMystere = 0;
                26.    nombreMystere = (rand () % (max - min + 1)) + min;
                27.    return nombreMystere;
                28. }
                29. /* Donne une valeur à max en fonction du niveau de difficulte choisi */
                30. static long initialiseMax (long niveauDeDifficulte)
                31. {
                32.    long max = 0;
                33.    switch (niveauDeDifficulte)
                34.    {
                35.    case 1:
                36.       max = 100;
                37.       break;
                38.    case 2:
                39.       max = 1000;
                40.       break;
                41.    case 3:
                42.       max = 10000;
                43.       break;
                44.    default:
                45.       printf
                46.          ("Le choix du niveau de difficultes a mal ete saisis, veuillez contacter le concepteur\n");
                47.    }
                48.    return max;
                49. }
                50. /* Presentation du jeu, d'ordre esthetique */
                51. void presentation (void)
                52. {
                53. /* Affichage inutile
                54.       pour la comprehension du code */
                55. }
                56. /* Fais choisir niveau de difficulté 1,2 ou 3. Elle appelle la fonction choixMenu. */
                57. long niveauDeDifficulte (void)
                58. {
                59.    long nombreChoixPossibles = 3, choix = 0;
                60.    do
                61.    {
                62. /* Affichage qui presente
                63.    les differents niveaux */
                64. /* Puis appelle la fonction choixMenu pour analyser si le choix est correct */
                65.       choix = choixMenu (nombreChoixPossibles);
                66.    }
                67. /* Si choix == -1, le choix était mauvais. Donc la boucle recommence. */
                68.    while (choix == -1);
                69.    return choix;
                70. }
                71. /* Deroulement du jeu */
                72. long jeu (long niveauDeDifficulte)
                73. {
                74.    long nombreDeTentatives = 0, max, nombreEntrePourEssai, nombreMystere;
                75. /* Appelle la fonction initialiseMax */
                76.    max = initialiseMax (niveauDeDifficulte);
                77. /* Appelle la fonction genereNombreAleatoire */
                78.    nombreMystere = genereNombreAleatoire (1, max);
                79. /* Boucle du jeu. Tant que le joueur n'a pas trouve le nombre mystere elle recommence. */
                80.    do
                81.    {
                82.       printf ("Trouvez le nombre entre 1 et %ld !\n", max);
                83.       nombreDeTentatives++;
                84.       printf ("Nombre de tentatives : %ld.\nEntrez un nombre :\n",
                85.               nombreDeTentatives);
                86.       scanf ("%ld", &nombreEntrePourEssai);
                87.       if (nombreEntrePourEssai < 1 || nombreEntrePourEssai > max)
                88.       {
                89.          printf
                90.             ("!!! ERREUR : ce nombre doit etre compris entre 1 et %ld !!!\n",
                91.              max);
                92.          printf
                93.             ("  => PENALITE : cette erreur est comptée comme une tentative. Soyez plus vigilant a l'avenir !\n");
                94.       }
                95.       else if (nombreEntrePourEssai < nombreMystere)
                96.       {
                97.          printf ("\nRATE : c'est plus grand !\n");
                98.       }
                99.       else if (nombreEntrePourEssai > nombreMystere)
                100.       {
                101.          printf ("\nRATE : c'est plus petit !\n");
                102.       }
                103.       else if (nombreEntrePourEssai == nombreMystere)
                104.       {
                105.          printf ("FELICITATION ! Tu as gagne !");
                106.          printf ("Nombre de tentatives : %ld", nombreDeTentatives);
                107.       }
                108.    }
                109.    while (nombreEntrePourEssai != nombreMystere);
                110.    return 0;
                111. }

                Je ne l'ai pas corrigé, mais tes lignes de textes sont trop longues (ne pas dépasser 80 colonnes).
                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  8 octobre 2007 à 22:51:33

                  Désolé pour les lignes de code trop longues. J'éviterais a l'avenir.

                  Je ne vois pas ce que tu veux dire par

                  Citation : -ed-

                  Dans programme.c. srand() doit être appelé une seule fois.


                  J'ai beau vérifier, je ne la vois qu'une fois ?

                  Merci pour les static. J'ai des progrès à faire !
                  J'ai modifié mon code comme tu m'as conseillé, mais c'est toujours le même message d'erreur !

                  J'ai même fait un copier-coller de ton code modifié dans mon IDE(ce que je voulais éviter, pour mieux comprendre) pour vérifier si j'étais aveugle ^^ mais c'est encore et toujours le même message !
                  Je ne comprends pas. o_O
                  C'est comme si le fichier header ne servait à rien !

                  A l'aide... :(
                  • Partager sur Facebook
                  • Partager sur Twitter
                    8 octobre 2007 à 23:03:05

                    Citation : SmallFitz

                    Je ne vois pas ce que tu veux dire par

                    Citation : -ed-

                    Dans programme.c. srand() doit être appelé une seule fois.


                    J'ai beau vérifier, je ne la vois qu'une fois ?


                    Oui, mais comme il est dans une fonction, rien ne dit qu'on ne va pas appeler celle-ci plusieurs fois...

                    http://mapage.noos.fr/emdel/notes.htm#rand

                    Citation : Pas de titre


                    J'ai modifié mon code comme tu m'as conseillé, mais c'est toujours le même message d'erreur !

                    J'ai même fait un copier-coller de ton code modifié dans mon IDE(ce que je voulais éviter, pour mieux comprendre) pour vérifier si j'étais aveugle ^^ mais c'est encore et toujours le même message !
                    Je ne comprends pas. o_O
                    C'est comme si le fichier header ne servait à rien !


                    Ce code fonctionne chez moi. Je pense que tu n'as pas bien créé le projet ou que tu t'embrouilles dans les répertoire.

                    Le principe, c'est un projet par répertoire. Dans le répertoire, tu dois mettre les 3 fichiers, et (Code::Blocks) les ajouter (tous les 3) au projet. Ca doit créer automatiquement une section 'sources' et une section 'headers' dans la fenêtre du projet.

                    Dans la section 'sources', tu dois retrouver les 2 .c et dans la section 'headers', le .h.
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Music only !
                      8 octobre 2007 à 23:17:29

                      Citation : SmallFitz


                      Ensuite Mikechaos je pense que tu as fais une erreur (d'inattention certainement) dans ton deuxième exemple.
                      Rappel :

                      Citation : Mikechaos


                      Le fichier 1.h inclus le fichier 2.h
                      Le fichier 2.h inclus le fichier 5.h et le fichier 3.h
                      Le fichier 5.h n'inclus rien d'autre.


                      Ce ne serait pas plutôt :

                      Par l'intermédiaire du 1.h, les headers 2.h, 3.h et 5.h sont inclus.
                      C'est à dire tous les headers sauf le 4.h.
                      Donc il ne reste que le 4.h qui n'est inclus nulle part.
                      Et ça donnerait alors :

                      1. #include "1.h"
                      2. #include "4.h"


                      Non ?


                      Oui. En effet.

                      Citation : SmallFitz


                      Ensuite tu te demandes pourquoi M@teo21 utilise souvent des long au lieu des int, il donne lui-même la réponse dans son tuto :

                      Citation : M@teo21

                      Vous remarquerez qu'int et un long ont l'air identiques. Avant ce n'était pas le cas (un int était plus petit qu'un long), mais aujourd'hui les mémoires ont évolué et on a assez de place pour stocker des grands nombres, donc on se moque un peu de la différence entre un int et un long. Le langage C "conserve" tous ces types pour des raisons de compatibilité, même si certains sont un peu de trop.
                      En pratique, j'utilise principalement char, long et double.

                      Ce n'était pas une question. Utilisé des long à la place des int, c'est inutile. Mais bon, c'est un conseil, après, tu fais ce que tu veux.

                      Citation : SmallFitz


                      Une autre petite question au passage :

                      Est-il nécessaire de mettre "void" pour indiquer que la fonction ne reçoit aucun type ou bien peut-on mettre des parenthèses vides ? Personnellement j'ai toujours fait ça et ça n'a jamais planté... Mais c'est peut-être "sale" ? En tout cas là j'ai évité :)

                      Comme répondue. Oui c'est nécessaire. Règle mieux ton compilo et tu verras qu'il va te donner une erreur si tu ne le fais pas.

                      Finalement, pour ton problème, comme -ed- a dit, tu as sûrement fait une erreur dans ton projet. Assures-toi que tu n'as qu'un seul projet dans ton répertoire et que dans ton projet, tous tes fichiers soient bien inclus.

                      Bonne continuation.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        9 octobre 2007 à 0:00:42

                        Il me semble que mon projet est bien créé :
                        Image utilisateur

                        Et il n'y a bien qu'un projet dans mon répertoire "+ ou moins"
                        Image utilisateur

                        Ça peut venir d'ailleurs ?
                        Je suis sous Vista mais j'ai installé les nightly builds.
                        Je ne suis peut être plus dans le bon forum alors ??? o_O
                        Tous fonctionnais nickel avant que je commence la programmation modulaire...

                        Je ne sais plus quoi faire... :euh:
                        • Partager sur Facebook
                        • Partager sur Twitter
                          9 octobre 2007 à 0:55:28

                          Oula.. Il faut éviter les espaces et les caractères spéciaux dans les noms de projets ;) (enfin, il me semble).

                          Si l'erreur ne vient pas de là, je ne sais pas...
                          • Partager sur Facebook
                          • Partager sur Twitter
                            9 octobre 2007 à 1:16:05

                            Eurêka !
                            Ca marche !
                            C'est magnifique ! :D

                            Merci Mikechaos ! Je t'aime T'es génial ! :p

                            Ben ouais c'est les espaces (ou le caractère spécial) dans le nom de mon projet qui empêchaient de compiler.
                            Quand je pense que je suis bloqué depuis deux semaines à cause de ça... :)
                            J'espère que ce topic aura servis à quelque chose...

                            Un grand merci à toi et à -ed- !
                            Bonne continuation. ;)

                            PS : La programmation en C c'est vraiment drôle. ^^
                            • Partager sur Facebook
                            • Partager sur Twitter
                              9 octobre 2007 à 1:27:46

                              Citation : SmallFitz

                              Eurêka !
                              Ca marche !
                              C'est magnifique ! :D

                              Merci Mikechaos ! Je t'aime T'es génial ! :p

                              Ben ouais c'est les espaces (ou le caractère spécial) dans le nom de mon projet qui empêchaient de compiler.
                              Quand je pense que je suis bloqué depuis deux semaines à cause de ça... :)
                              J'espère que ce topic aura servis à quelque chose...

                              Un grand merci à toi et à -ed- !
                              Bonne continuation. ;)

                              PS : La programmation en C c'est vraiment drôle. ^^



                              Lol. Et bien j'espère aussi que tout ça aura servi à quelque chose tout de même et que tu comprends mieux la programmation modulaire qu'au départ :p

                              PS : Lol, si tu le dis (réponse à ton ps)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                9 octobre 2007 à 1:30:17

                                Ouais je crois que j'ai quand même compris et appris pleins de nouvelles choses. :lol:
                                • Partager sur Facebook
                                • Partager sur Twitter

                                Programmation modulaire

                                × 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