Erreur dans fonction introuvable

anthony -  
 anthony -
Bonjour,
voila mon code

fichier: fonction.c
#include <ctype.h>
#include <stdio.h>
#include <stdlib.h>
#include "prototype.h"
#define TAILLEMAX 1000


char lireCaractere()
{
    char caractere = 0;

    caractere = getchar(); //On lit caractere 1 a 1 de la chaine tapez au clavier grace a la fonction getchar()
    caractere = toupper(caractere); //On met la lettre on majuscule si elle ne l'est pas

    //On lit les caracteres 1 a 1 jusqua tomber sur l' \n (pourles éffacer)
    while(getchar() != '\n');

    return caractere;
}

void ecritureFichier(FILE* dictionnaire)
{
    dictionnaire = fopen("/home/user/pendu/motPendu.tkt","w");

    if(dictionnaire != NULL)
    {
        fputs("PENDU \nBIGBOSS \nSUPER \nBERK \n", dictionnaire);
        fclose(dictionnaire);
    }
    else
    {
        printf("Impossible d'ouvrire le fichier text\n");
    }
}

void lireFichier(FILE* dictionnaire, char* chaine)
{
    char chaine[] = "";
    int i = 0;
    dictionnaire = fopen("/home/user/pendu/motPendu.tkt", "r");

    if(dictionnaire != NULL)
    {
        while(fgets(chaine, TAILLEMAX, dictionnaire) != NULL)
        {
            i++;
        }
        printf("il y a %d mots\n", i);
        fclose(dictionnaire);
    }
    else
    {
        printf("Votre fichier n'a pas put s'ouvrire\n");
    }
}


fichier: mainc
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include "prototype.h"
int main()
{
    char motSecret[] = "", *lettreBonne = NULL; // Tableau pour stocker le mot
    char lettre = 0; // variable de type char qui sert a reconvertir le nbre stocker en lettre
    int nbreCoups = 10, i = 0, nbreLettre = 0; //le nombre de coups qui reste a l'utilisateur et une variable pour une boucle
    FILE* dictionnaire = NULL;


    ecritureFichier(dictionnaire);
    lireFichier(dictionnaire, motSecret);
    rewind(dictionnaire);


    nbreLettre = strlen(motSecret);
    lettreBonne = malloc((nbreLettre + 1) * sizeof(char));


    	for ( i = 0; i < nbreLettre; i++) // On rempli ton tableau avec des *
		{
		    lettreBonne[i] = '*';
		}
    printf("Bienvenue Dans le pendu\n\n\n"); // on affiche la bienvenue


    /*
     On fait une boucle tant que nombre de coups
    est superieur a 0 alors elle affiche le contenue ...
    */
    while(nbreCoups > 0 && strcmp(lettreBonne, motSecret) != 0)
    {
        printf("il vous reste %d coups\n\n", nbreCoups);
        printf("Quel est le mot secret?");

           for(i = 0; i < strlen(motSecret); i++) // une boucle pour afficher les *****
           {
               if(motSecret[i] == lettre) // si lettre elle existe alors affiche la
               {
                   lettreBonne[i] = lettre;// On stocke la lettre dans un tableau si c'est la bonne
               }
           }
           printf("%s", lettreBonne);
            printf("\nProposer une lettre \n");
            lettre = lireCaractere(); // On stocke le caractere returner dans lettre

           if(strchr(motSecret, lettre) == NULL)
           {
               nbreCoups--;
           }
    }
       if(strcmp(motSecret, lettreBonne) == 0)
           {
               printf("BRAVO !!!! vous venez de trouver le mot secret\n");
           }
           else
           {
               printf("Vous avez perdu le mot se cret était %s\n", motSecret);
           }


    free(lettreBonne);
    return 0;
}


et voila ce qu'il me mette come erreur dans le fichier fonction.c
/home/user/pendu/fonction.c||In function ‘lireFichier’:|
/home/user/pendu/fonction.c|38|erreur: ‘chaine’ redeclared as different kind of symbol|
/home/user/pendu/fonction.c|36|erreur: previous definition of ‘chaine’ was here|
||=== Build finished: 2 errors, 0 warnings ===|

6 réponses

loupius
 
Le compilateur est très clair: il y a de la redéfinition dans l'air, à savoir:
- void lireFichier(FILE* dictionnaire, char* chaine)
- char chaine[] = "";
Quand tu utiliseras 'chaine', il ne saura pas s'il faut prendre celui passé en paramètre où celui déclaré dans la fonction, d'où ses interrogations.
Bonne continuation.
0
anthony
 
ah ok et j'ai un autre problème dans cette fonction
int lireFichier(FILE* dictionnaire, char* chaine)
{
    int i = 0;
    dictionnaire = fopen("/home/user/pendu/motPendu.tkt", "r");

    if(dictionnaire != NULL)
    {
        while(fgets(chaine, TAILLEMAX, dictionnaire) != NULL)
        {
            i++;
        }
        return i;
        fclose(dictionnaire);
    }
    else
    {
        printf("Votre fichier n'a pas put s'ouvrire\n");
    }
}


voila ce que sa me dit comme erreur
/home/user/pendu/fonction.c|54|attention : control reaches end of non-void function|


je ne comprend pas cette erreur
0
loupius
 
control reaches end of non-void function
En clair, il s'agit d'une fonction 'non-void' (en l'occurence une fonction 'int'), dont on a oublié de retourner une valeur.
Bonne continuation.
0
anthony
 
oui mais tu vois bien que j'ai mit int lireFichier(...........) il y a bien le int au debut de la fonction
0
loupius > anthony
 
Justement c'est parce que tu as mis 'int' que le compilateur râle. Mets 'void' à la place de 'int' et tu verras que le compilateur reste muet.
0
anthony
 
met pourquoi mettre void puisque je retourn la variable i est du type int donc la sortie de la fonction doit etre int
0
loupius
 
C'était juste pour que tu essayes et que tu constates que l'erreur avait changé.
je retourn la variable i, certes mais pas toujours.
Bonne réflexion.
0
anthony > loupius
 
oulala je crois que tu m'enbrouille mdr
tu me dit certe mais pas toujours
mais tu veus que je retourne quoi sinon
0
loupius > anthony
 
Bon, c'est simple, si tu as une fonction:
- 'void', dans tous les cas tu ne retournes rien,
- 'non-void', dans tous les cas tu retournes quelque chose qui correspond au type de la fonction.
0
anthony
 
donc si j'ai compris ce que tu ma dit c'est le copilateur qui m'indique que j'ai une erreur alors que en faite il y en a pas puisuq ema fonction est non-void
0
loupius
 
Non, tu n'as pas compris.
Le compilateur râle parce qu'il y a des cas où ta fonction ne retourne rien: ta fonction doit retourner un 'int' dans tous les cas et il ne y avoir d'exception !
0
anthony > loupius
 
ah ok la je comprend mieu en gros faut qu'il y aun return par default car dans ma fonction elle return que si la condition est vrai sinon elle retourne rien c'est vrai en plus c'est logique ^^
0
anthony > anthony
 
int motAleatoir(char* motSecret, int MAX)
{
    int motMystere = 0;

    srand(time(NULL));
    motMystere = (rand() % (MAX - 1 + 1)) + 1;
}


la il me mette 2 erreur dans cette fonction:

/home/user/pendu/fonction.c||In function ‘motAleatoir’:|
/home/user/pendu/fonction.c|62|attention : implicit declaration of function ‘time’|
/home/user/pendu/fonction.c|64|attention : control reaches end of non-void function|
||=== Build finished: 2 errors, 0 warnings ===|


bon al 2 eme je sais d'ou sa vient et c'est surtout la 1ere erreur d'ou je ne comprend pas d'ailleur je ne comprend pas la fonction je sais juste a quoi elle sert
0
loupius > anthony
 
Tu as compris.
Un détail, malgré tout: Même si tu oublies de mettre un 'return', la compilation se fait quand même (note que le compilateur te signale 'attention' et non 'erreur') et le programme pourra donc être exécuté. A la sortie de ta fonction, une valeur ne sera donc pas toujours retournée, mais l'appellant considère qu'une valeur est toujours retournée et il va donc en lire une... qui sera absolument n'importe quoi. C'est la raison pour laquelle, il faut, à moins d'être certain de ce que l'on fait, toujours traiter toutes les remarques du compilateur.
D'autre part:
return i;
fclose(dictionnaire);

Une fois retourné à l'appellant, le programme ne se poursuit plus dans ta fonction; en conséquence, 'fclose' ne sera jamais exécuté.
Bonne continuation.
0
loupius > anthony
 
implicit declaration of function ‘time’
En clair, le compilateur ne sait pas d'où sort cette fonction; il ne sait donc pas ce que retourne cette fonction, est-ce un pointeur, un entier, un float... il ne sait donc pas comment traiter cette valeur (devant cette déclaration implicite, il va, par défaut, considérer que c'est un 'int').
Il faut donc inclure le fichier qui permet de répondre à la question du compilateur. Je te laisse deviner lequel (un 'man 2 time' te donnera la réponse).
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
loupius
 
Voici quatre lignes extraites de ton code:
#define TAILLEMAX 1000
char motSecret[] = "";
motAleatoir(motSecret, MAX, dictionnaire);
fgets(motSecret, TAILLEMAX, dictionnaire);
Je ne te donne pas la solution mais te souhaite une bonne réflexion ;-)
0
anthony
 
désolé de cette longue absence j'étais occuper ^^

Bon voila comment je vois ma fonction

void motAleatoir(char* motSecret, int MAX, FILE* dictionnaire)

ma fonction et du type void je met en entré le tableau qui va contenir le mot secret je met MAX (la variable MAX contient le nombre de ligne) et je met le dictionnaire.

Puis après je met cette fonction
srand(time(NULL));
    motMystere = (rand() % (MAX - 1 + 1)) + 1;
elle va servir à tirer un mot de façon aléatoire.

Puis je fais une boucle
 for(i = 0; i != motMystere; i++)
    {
        fgets(motSecret, TAILLEMAX, dictionnaire);
    }


cette boucle dit "tant que i est different de la variable motMystere alors continue"
donc elle va lire le dictionnaire et elle va stocker le mot dans motSecret.

donc voila moi dans cette boucle je ne vois que un seul problème c'est que tout les mot des dictionnaire vont être stocker dans motSecret

elle est la l'erreur ou c'est pas sa ??
0