Partage
  • Partager sur Facebook
  • Partager sur Twitter

Le pendu

problème de compilation

Sujet résolu
    5 mai 2006 à 20:48:26

    Bonjour à Tous !!

    J'ai un tout petit problème avec le pendu ?!? :-°
    Bon, honnêtement, je l'ai fait sans regarder la correction de notre cher M@teo21 (enfin, presque ! :euh: ), et ça ne marchait pas (c'est une façon de parler, hein !!, je ne m'attendais pas à ce qu'il se mette à courrir !!). J'ai donc tout réécrit :o et...bah..., ça ne marchais pas non plus !!

    Le compilateur de Dev C++ m'affiche :"invalid conversion from 'void*' to 'int*'". Pourquoi ????

    Voici le code du main:

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

    #include "dico.h"


    int gagne(int lettreTrouvee[], long tailleMot);
    int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[]);
    char lireCaractere();

    int main(int argc, char* argv[])
    {
    char lettre = 0;
    char motSecret[100] = {0};
    int *lettreTrouvee = NULL;
    long coupsRestants = 10;
    long i = 0;
    long tailleMot = 0;

    printf(" === Bienvenue dans le pendu ! ===\n\n");

    if (!piocherMot(motSecret))
    exit(0);

    tailleMot = strlen(motSecret);

    lettreTrouvee = malloc(tailleMot * sizeof(int));

    if(lettreTrouvee == NULL);
    exit(0);

    for (i = 0 ; i < tailleMot ; i++)
    lettreTrouvee[i] = 0;

    while (coupsRestants > 0 && !gagne(lettreTrouvee, tailleMot))
    {
    printf("Il vous reste %ld coups a jouer.\n", coupsRestants);
    printf("Quel est le mot secret ? ");
    for (i = 0; i < tailleMot; i++)
    {
    if (lettreTrouvee[i])
    printf("%c",motSecret[i]);
    else
    printf("*");
    }
    printf("\nProposez une lettre : ");
    lettre = lireCaractere();
    if (!rechercheLettre(lettre, motSecret, lettreTrouvee))
    {
    coupsRestants--;
    }
    }
    if (gagne(lettreTrouvee, tailleMot))
    printf("\n\nGagne ! Le mot secret était bien : %s", motSecret);
    else
    printf("\n\nPerdu ! Le mot secret était : %s", motSecret);

    free(lettreTrouvee);

    return 0;
    }


    char lireCaractere()
    {
    char caractere = 0;

    caractere = getchar();
    caractere = toupper(caractere);

    while(getchar() != '\n');
    return caractere;
    }

    int gagne(int lettreTrouvee[], long tailleMot)
    {
    long i = 0;
    int joueurGagne = 1;

    for (i = 0; i < tailleMot; i++)
    {
    if(lettreTrouvee[i] == 0)
    joueurGagne = 0;
    }
    return joueurGagne;
    }

    int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[])
    {
    long i = 0;
    int bonneLettre = 0;
    for (i = 0; motSecret[i] != '\0'; i++)
    {
    if (lettre == motSecret[i])
    {
    bonneLettre = 1;
    lettreTrouvee[i] = 1;
    }
    }
    return bonneLettre;
    }


    Et puis le code source Dico.c :


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

    #include "dico.h"

    int piocherMot(char *motPioche)
    {
    FILE* dico = NULL;
    long nombreMots = 0, numMotChoisi = 0;
    int caractereLu = 0;

    dico = fopen("dico.txt", "r");
    if (dico == NULL)
    {
    printf("\n Impossible de charger le dictionnaire de mots.");
    return 0;
    }

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

    numMotChoisi = nombreAleatoire(nombreMots);

    rewind(dico);
    while (numMotChoisi > 0)
    {
    caractereLu = fgetc(dico);
    if (caractereLu == '\n')
    numMotChoisi--;
    }

    fgets(motPioche, 100, dico);
    motPioche[strlen(motPioche) - 1] = '\0';

    fclose(dico);

    return 1;

    }

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


    Et enfin !!! le code source de dico.h :

    #ifndef DEF_DICO
    #define DEF_DICO

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

    #endif



    Pouvez-vous, par pitié, me dire où est le problème ?!!!!!!!
    Merci, merci et encore merci d'avance !





    • Partager sur Facebook
    • Partager sur Twitter
    Anonyme
      5 mai 2006 à 20:50:53

      Utilise la balise <code type="c"></code>
      • Partager sur Facebook
      • Partager sur Twitter
        5 mai 2006 à 21:15:57

        C'est claire, on y comprend rien comme ça ! et personne va lire ça :(
        • Partager sur Facebook
        • Partager sur Twitter
          5 mai 2006 à 21:29:54

          ouep, ca mange pas de pain...
          On verra une fois que t'auras mis ca au clair :p
          • Partager sur Facebook
          • Partager sur Twitter
            5 mai 2006 à 21:32:33

            Citation : K@ndar7


            Voici le code du main:

            <couleur nom="bleugris">

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


            Plutôt que des couleurs douteuses, merci d'utiliser les balises 'code'... Evidemment, si tu avais lu les regles du forum, tu l'aurais su...

            • srand() doit être appelé une seule fois au debut du code.
            • Il est préférable de transmettre à piocherMot() la taille du tableau. Elle sera ensuite utilisée par fgets().
            • Pour exit(), le code d'erreur portable est EXIT_FAILURE
            • BUG : après if (lettreTrouvee == NULL), il y a un ';'
            • Veiller à ce que les lignes de textes passées à printf() soit complètres, sinon, forcer avec fflush (stdout).
            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
              6 mai 2006 à 10:51:14

              Bonjour,
              Ok,Ok,Ok, j'ai réalisé à quel point mon code source était...impossible à lire.
              Bon, je vais essayer de le réécrire ici :


              Mon problème est dans le main : le compilateur surligne la ligne :
              lettreTrouvee = malloc(tailleMot * sizeof(int));

              Et il m'indique : invalid conversion from 'void*' to 'int*'.


              Code : main

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

              #include "dico.h"


              int gagne(int lettreTrouvee[], long tailleMot);
              int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[]);
              char lireCaractere();

              int main(int argc, char* argv[])
              {
              char lettre = 0;
              char motSecret[100] = {0};
              int *lettreTrouvee = NULL;
              long coupsRestants = 10;
              long i = 0;
              long tailleMot = 0;

              printf("                          === Bienvenue dans le pendu ! ===\n\n");

              if (!piocherMot(motSecret))
                 exit(0);
                 
              tailleMot = strlen(motSecret);

              lettreTrouvee = malloc(tailleMot * sizeof(int));

              if(lettreTrouvee == NULL)
                exit(0);

              for (i = 0 ; i < tailleMot ; i++)
                lettreTrouvee[i] = 0;

              while (coupsRestants > 0 && !gagne(lettreTrouvee, tailleMot))
              {
              printf("Il vous reste %ld coups a jouer.\n", coupsRestants);
              printf("Quel est le mot secret ? ");
              for (i = 0; i < tailleMot; i++)
              {
                  if (lettreTrouvee[i])
                         printf("%c",motSecret[i]);
                  else
                         printf("*");
              }
              printf("\nProposez une lettre : ");
              lettre = lireCaractere();
              if (!rechercheLettre(lettre, motSecret, lettreTrouvee))
              {
                     coupsRestants--;
              }
              }
              if (gagne(lettreTrouvee, tailleMot))
                 printf("\n\nGagne ! Le mot secret était bien : %s", motSecret);
              else
                 printf("\n\nPerdu ! Le mot secret était : %s", motSecret);
                 
              free(lettreTrouvee);
                 
                 return 0;
              }   

                 
              char lireCaractere()
              {
                   char caractere = 0;
                   
                   caractere = getchar();
                   caractere = toupper(caractere);
                   
                   while(getchar() != '\n');
                   return caractere;
              }

              int gagne(int lettreTrouvee[], long tailleMot)
              {
                  long i = 0;
                  int joueurGagne = 1;
                 
                  for (i = 0; i < tailleMot; i++)
                  {
                      if(lettreTrouvee[i] == 0)
                      joueurGagne = 0;
                  }
               return joueurGagne;
              }

              int rechercheLettre(char lettre, char motSecret[], int lettreTrouvee[])
              {
                  long i = 0;
                  int bonneLettre = 0;
                  for (i = 0; motSecret[i] != '\0'; i++)
                  {
                      if (lettre == motSecret[i])
                      {
                                 bonneLettre = 1;
                                 lettreTrouvee[i] = 1;
                      }
                  }
                return bonneLettre;
              }







              Code : dico.c



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

              #include "dico.h"

              int piocherMot(char *motPioche)
              {
                  FILE* dico = NULL;
                  long nombreMots = 0, numMotChoisi = 0;
                  int caractereLu = 0;
                 
                  dico = fopen("dico.txt", "r");
                  if (dico == NULL)
                  {
                           printf("\n      Impossible de charger le dictionnaire de mots.");
                           return 0;
                  }
                 
              do
              {
                  caractereLu = fgetc(dico);
                  if (caractereLu == '\n')
                    nombreMots++;
              }while(caractereLu != EOF);

              numMotChoisi = nombreAleatoire(nombreMots);

              rewind(dico);
              while (numMotChoisi > 0)
              {
                    caractereLu = fgetc(dico);
                    if (caractereLu == '\n')
                      numMotChoisi--;
              }

              fgets(motPioche, 100, dico);
              motPioche[strlen(motPioche) - 1] = '\0';

              fclose(dico);

              return 1;

              }

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



              Code : dico.h

              #ifndef DEF_DICO
              #define DEF_DICO

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

              #endif


              Et encore, désolé ! :-°
              • Partager sur Facebook
              • Partager sur Twitter
                6 mai 2006 à 12:27:52

                T'as fait un pas, le prochain c'est l'indentation... surtout pour un code si long.

                Tu devrait aussi nous indiquer le numéro de la ligne où est l'erreur etc.
                • Partager sur Facebook
                • Partager sur Twitter
                Anonyme
                  6 mai 2006 à 12:58:27

                  A la place de répondre, édite ton message, parce que ton code est fort long...
                  • Partager sur Facebook
                  • Partager sur Twitter
                    6 mai 2006 à 13:11:54

                    Le code mal presenter ^^:-°
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Zéro pointé à vie. | La chimie est l'écoute de la matière. | Art&Science.
                      6 mai 2006 à 13:52:11

                      Citation : K@ndar7

                      Mon problème est dans le main : le compilateur surligne la ligne :

                      lettreTrouvee = malloc(tailleMot * sizeof(int));


                      Et il m'indique : invalid conversion from 'void*' to 'int*'.


                      On dirait que tu compiles en C++. Vérifie que l'extension de ton fichier main est bien .c et non.cpp, ni .C
                      • Partager sur Facebook
                      • Partager sur Twitter
                      Music only !
                        6 mai 2006 à 14:46:54

                        Bonjour
                        Tu devrais soit:
                        -utiliser le programme GNU indent pour bien indenter ton code et le rendre lisible
                        -configurer ton éditeur en C-Mode de façon à ce que l'indentation se fasse automatiquement comme sous Emacs ou Vim
                        -enfin même s'il y a moyen que ce travail soit fait pour toi il est toujours bon de connaitre les règles en la matière: http://mapage.noos.fr/emdel/codage.htm#presenter
                        • Partager sur Facebook
                        • Partager sur Twitter
                          8 mai 2006 à 11:32:31

                          Merci à tous, ça marche !!! :D:p
                          Oui, bon, mon erreur était bête : au moment de créer un projet, je n'ai pas coché la case projet C mais projet C++, alors, évidemment... :-°
                          • Partager sur Facebook
                          • Partager sur Twitter

                          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