Partage
  • Partager sur Facebook
  • Partager sur Twitter

TP Le Pendu

Problème après avoir fait la partie dico

Sujet résolu
    17 juillet 2006 à 21:00:16

    Salut,

    Je suis arrivé au tp de pendu.

    La première partie était bien faite, enfin elle fonctionnait correctement quoi.

    Pour faire la partie du dico, j'ai eu du mal je suis donc allé voir la correstion. J'ai repris entiérement le dico.c et dico.h et je l'ai inclus dans mon projet. mais lors de la compilation ya ce message dans le build log

    .objs\dico.o:dico.c:(.text+0x0): multiple definition of `piocherMot'
    .objs\main.o:main.c:(.text+0x0): first defined here
    .objs\dico.o:dico.c:(.text+0xf5): multiple definition of `nombreAleatoire'
    .objs\main.o:main.c:(.text+0xf5): first defined here
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 1 seconds)


    Voilà mon fichier main avant inclusion du dico :

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

    char lireCaractere();
    char configMot(const long tailleMot, char mot[]);

    int main(int argc, char* argv[])
    {
        char motSecret[] = "MARRON";

        long tailleMot = 0 , chances = 10 , i = 0;
        char maLettre = "";
        int trouver = 0 ;
        int *pointeurTrouver = &trouver ;
        int gagner = 0 ;
        char mot[30] = "" ;

        tailleMot = strlen(motSecret);

        configMot(tailleMot, mot);

        printf("Vous devez trouver le mot secret avec un maximum de 10 fautes !\n\n");

        do {
            trouver = 0;
            printf("Il vous reste %ld chances !\n", chances);
            printf("Quel est le mot secret ? %s \n", mot);
            printf("Proposez une lettre : ");
            maLettre = lireCaractere() ;
            printf("\n\n");

            for ( i = 0 ; i < tailleMot ; i++)
            {
                if (maLettre == motSecret[i])
                {
                    mot[i] = maLettre;
                    *pointeurTrouver = 1;
                }
            }


            if ( strcmp(motSecret, mot) == 0 )
            {
                gagner = 1;
                chances = 0;
            }


            if ( trouver == 0 )
            {
                chances--;
            }

        } while ( chances > 0 );


     if ( gagner == 1 )
        {
            printf("Bravo ! Vous avez trouver le mot secret qui etait %s !\n", motSecret);
        }
        else
        {
            printf("Dommage, vous n'avez pas trouver le mot secret !\n");
        }

        return 0;
    }


    char lireCaractere()
    {
        char caractere = 0;

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

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

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


    char configMot(const long tailleMot, char mot[])
    {
        long i = 0;

        for ( i = 0 ; i < tailleMot ; i++ )
        {
            mot[i] = '*' ;
        }
    }


    et le voilà après insertion du dico :


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


    #include "dico.c"

    char lireCaractere();
    char configMot(const long tailleMot, char mot[]);

    int main(int argc, char* argv[])
    {

        char motSecret[100];

        long tailleMot = 0 , chances = 10 , i = 0;
        char maLettre = 0 ;
        int trouver = 0 ;
        int *pointeurTrouver = &trouver ;
        int gagner = 0 ;
        char mot[100] = "" ;

        piocherMot(motSecret);

        tailleMot = strlen(motSecret);

        configMot(tailleMot, mot);

        printf("Vous devez trouver le mot secret avec un maximum de 10 fautes !\n\n");

        do {
            trouver = 0;
            printf("Il vous reste %ld chances !\n", chances);
            printf("Quel est le mot secret ? %s \n", mot);
            printf("Proposez une lettre : ");
            maLettre = lireCaractere() ;
            printf("\n\n");

            for ( i = 0 ; i < tailleMot ; i++)
            {
                if (maLettre == motSecret[i])
                {
                    mot[i] = maLettre;
                    *pointeurTrouver = 1;
                }
            }


            if ( strcmp(motSecret, mot) == 0 )
            {
                gagner = 1;
                chances = 0;
            }


            if ( trouver == 0 )
            {
                chances--;
            }

        } while ( chances > 0 );


     if ( gagner == 1 )
        {
            printf("Bravo ! Vous avez trouver le mot secret qui etait %s !\n", motSecret);
        }
        else
        {
            printf("Dommage, vous n'avez pas trouver le mot secret !\n");
        }

        return 0;
    }


    char lireCaractere()
    {
        char caractere = 0;

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

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

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


    char configMot(const long tailleMot, char mot[])
    {
        long i = 0;

        for ( i = 0 ; i < tailleMot ; i++ )
        {
            mot[i] = '*' ;
        }
    }


    Et voilà, j'espère que vous pourrez m'aider, car là je ne vois pas du tout quel problème cela pourrait etre, je vous rappel les messages d'erreurs dans le "buil log" :



    Project : Console application
    Compiler : GNU GCC Compiler (called directly)
    Directory : D:\Programmaion\Chapitre II\Copy of II.Chap_tp pendu\
    --------------------------------------------------------------------------------
    Switching to target: default
    Compiling: main.c
    Linking console executable: D:\Programmaion\Chapitre II\II.Chap_tp pendu\Le_pendu.exe
    .objs\dico.o:dico.c:(.text+0x0): multiple definition of `piocherMot'
    .objs\main.o:main.c:(.text+0x0): first defined here
    .objs\dico.o:dico.c:(.text+0xf5): multiple definition of `nombreAleatoire'
    .objs\main.o:main.c:(.text+0xf5): first defined here
    collect2: ld returned 1 exit status
    Process terminated with status 1 (0 minutes, 0 seconds)


    • Partager sur Facebook
    • Partager sur Twitter
      17 juillet 2006 à 21:04:29

      Le message d'erreur te dit que tu as plusieurs définitions des fonctions piocherMot et nombreAleatoire, vérifie que tu n'as pas oublié le ; à la fin des prototypes, sinon c'est que tu as fait trop d'include.
      • Partager sur Facebook
      • Partager sur Twitter
        17 juillet 2006 à 21:05:16

        Il nous faut voir le fichier dico.c pour voir l'erreur.
        • Partager sur Facebook
        • Partager sur Twitter
          17 juillet 2006 à 21:05:16

          Ce n'est pourtant pas compliqué : tu as surdéfini tes fonctions piocherMot() et nombreAleatoire() ; ceci parce que tu as inclus un fichier .c au lieu d'un fichier .h >> revois le chapitre sur la programmation modulaire !
          • Partager sur Facebook
          • Partager sur Twitter
            17 juillet 2006 à 21:30:04

            Chaine, j'ai essayé de corrigé ce que t'a dit, mais ca na rien changé au résultat, toujours le mm message d'erreurs :euh:

            Alors, le dico.c c'est le même que dans les cours, le voila :



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

            #include "dico.h"


            int piocherMot(char *motPioche)
            {
                FILE* dico = NULL; // Le pointeur de fichier qui va contenir notre fichier
                long nombreMots = 0, numMotChoisi = 0;
                int caractereLu = 0;

                dico = fopen("dico.txt", "r"); // On ouvre le dictionnaire en lecture seule

                // On vérifie si on a réussi à ouvrir le dictionnaire
                if (dico == NULL) // Si on n'a PAS réussi à ouvrir le fichier
                {
                    printf("\nImpossible de charger le dictionnaire de mots");
                    return 0; // On retourne 0 pour indiquer que la fonction a échoué
                    // A la lecture du return` la fonction s'arrête immédiatement.
                }

                // On compte le nombre de mots dans le fichier (il suffit de compter les
                // entrées \n). Pensez à laisser une Entrée après le dernier mot du dico !
                do
                {
                    caractereLu = fgetc(dico);
                    if (caractereLu == '\n')
                        nombreMots++;
                } while(caractereLu != EOF);

                numMotChoisi = nombreAleatoire(nombreMots); // On pioche un mot au hasard

                // On recommence à lire le fichier depuis le début. On s'arrête lorsqu'on est arrivés au bon mot
                rewind(dico);
                while (numMotChoisi > 0)
                {
                    caractereLu = fgetc(dico);
                    if (caractereLu == '\n')
                        numMotChoisi--;
                }

                /* Le curseur du fichier est positionné au bon endroit.
                On n'a plus qu'à faire un fgets qui lira la ligne */

                fgets(motPioche, 100, dico);

                // On vire l'\n à la fin
                motPioche[strlen(motPioche) - 1] = '\0';

                fclose(dico);

                return 1; // Tout s'est bien passé` on retourne 1
            }


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



            et voila le dico.h :


            #ifndef DEF_DICO
            #define DEF_DICO

            int piocherMot(char *motPioche);
            long nombreAleatoire(long nombreMax);

            #endif

            • Partager sur Facebook
            • Partager sur Twitter
              18 juillet 2006 à 10:08:20

              Chez moi ça compile sans problème... Avec la rectification que je t'ai indiquée...
              • Partager sur Facebook
              • Partager sur Twitter
                18 juillet 2006 à 19:45:20

                ok, j'ai réessayer ce que t'avait dit, et jai fait ca >>

                #include "dico.h" /*dans le main*/

                et j'ai enlevé l'include dico.h dans le dico.c

                ensuite, j'ai du modifier le type de nombreAleatoire car il était dit qu'il yavait des conflit (je l'ai mit en int) et maintenant tout va bien ^^

                Merci pour votre aide ;) je vais pouvoir continuer a avancer ! :p
                • Partager sur Facebook
                • Partager sur Twitter
                  18 juillet 2006 à 20:30:01

                  Et comme tu es un Zéro très discipliné, tu marques ton sujet comme résolu ! ;)
                  • Partager sur Facebook
                  • Partager sur Twitter

                  TP Le Pendu

                  × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                  × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                  • Editeur
                  • Markdown