IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

probleme de compatibilité avec une variable et une fonction


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Par défaut probleme de compatibilité avec une variable et une fonction
    bonjour a tous je fais appelle a vous car j'ai besoin de votre aide concerant une fonction et une variable qui reçoit ce que la fonction renvoit.

    Tout d'abord voici le code source :

    variable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char motAchercher[TAILLE] = ""
     motAchercher = choisirUnMot (fichier, nombreMots);
    et la fonction qui est censé retourner le mot que l'on a piocher dans un fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    char  *choisirUnMot (FILE *file, int numeroLigne)
    {
     
    srand(time(NULL));
    int hasard = rand()%numeroLigne;
     
     
        int  caractere = 0;
        char  motAretourner[30];
        rewind(file);
     
        if ( file != NULL && numeroLigne != 0)
        {
            while ( (caractere = fgetc(file))!= EOF && hasard != 0)
            {
     
                if (caractere == '\n')
                {
                    hasard--;
                    printf ("trouver n\n");
     
                }
     
     
            }
             fgets(motAretourner, 30, file);
             printf ("mot retourner %s\n", motAretourner);
             return motAretourner;
        }
        else
        {
            printf ("Une erreur s'est produite lors de la recherche d\'un mot\n");
            return EXIT_FAILURE;
        }
     
    }
    le compilateur m'indique comme erreur : "incompatible types in assignment"

    Je ne vois pas pourquoi il y a une erreur car tout deux son de type char

    PS : merci d'avance pour vos explications et aides

  2. #2
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Je ne sais pas sur quelle ligne il te met le warning, mais j'ai vu deux choses qui m'ont choqué :

    La fonction est censée renvoyer un pointeur sur char. EXIT_FAILURE est un entier. Ce serait plus logique de retourner NULL.

    Il ne faut JAMAIS retourner l'adresse d'un objet local à une fonction. Une fois que tu sors de la fonction, l'objet créé n'existe plus et le contenu en mémoire (sur la pile, pour être précis) est susceptible d'être écrasé à n'importe quel moment. Du coup, l'adresse retournée pointe sur n'importe quoi.

    Une chose aussi :
    En principe, ceci doit être exécuté une seule fois. Or, si la fonction est appelée plusieurs fois, c'est pas terrible.
    Le mieux, c'est de mettre ça en début de la fonction "main".

    EDIT :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char motAchercher[TAILLE] = ""
    motAchercher = choisirUnMot (fichier, nombreMots);
    "motAchercher" est un tableau. Tu ne peux pas faire "tableau=adresse".

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Par défaut
    je te remercie pour tes remarques, qui m'aideront (a progresser) a l'avenir.
    Je n'arrive pas a trouver de solution pour regler ce probleme, a part mettre le code dans le main.c mais sa va etre un grand bazar.
    Je cherche mais je ne trouve pas.

    Une solution de votre part peut etre ?

  4. #4
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Le problème, c'est que je ne comprends déjà pas ce que ton programme est censé faire réellement.

    et la fonction qui est censé retourner le mot que l'on a piocher dans un fichier :
    C'est-à-dire ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Par défaut
    c'est cette fonction justement

    - on a comme parametre le fichier ou se trouve les mots et comme 2eme parametre le nombre de mots dans ce fichier

    - ensuite on fait un rand avec le nombre de mots dans ce fichier, pour cela on fait moins 1 a hasard lorsqu'il rencontre ce caractere è\n' (donc changement de ligne)

    - une fois celle ci arriver a 0 on fait appelle a fgets pour transferer le mot du fichier a la ligne X dans motAretourner

    - et ensuite on fait un return motAchercher (mais bon c'est faux tu me la expliqué pourquoi)


    voila

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Par défaut
    je veux en faite creer une sorte de pendu sur console.

  7. #7
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Tu peux te baser sur quelque chose de ce genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    #include <stdio.h>
    #include <stdlib.h>
    #include <string.h>
    #include <time.h>
     
    #define TAILLE_MOT_MAX 128
     
    char * choisirUnMot ( FILE * fichier , char * motAchercher , int nombreMots )
    {
        char mot[TAILLE_MOT_MAX];
        int numero_ligne;
        int ligne_courante;
     
        numero_ligne = (int) ((double)rand() / (double)RAND_MAX * nombreMots) ;
        ligne_courante = 0 ;
     
        rewind(fichier);
     
        while ( fgets(mot,TAILLE_MOT_MAX,fichier) != NULL )
        {
            if ( ligne_courante == numero_ligne )
            {
                char * position_caractere ;
     
                position_caractere = strchr(mot,'\r');
                if ( position_caractere != NULL )
                    *position_caractere = '\0' ;
                position_caractere = strchr(mot,'\n');
                if ( position_caractere != NULL )
                    *position_caractere = '\0' ;
     
                strncpy(motAchercher,mot,TAILLE_MOT_MAX);
                return motAchercher ;
            }
            ligne_courante++;
        }
     
        return NULL;
    }
     
    #define NOMBRE_MOTS 10 /* à adapter selon le nombre de mots dans le fichier texte */
     
    int main( void )
    {
        char motAchercher[TAILLE_MOT_MAX] = "";
        FILE * fichier ;
        int i;
     
        fichier = fopen ( "mots.txt" , "rb" );
        if ( fichier == NULL )
            return 0 ;
     
        srand(time(NULL));
        rand(); /* j'en mets un ici volontairement (la première valeur est toujours quasiment identique chez moi :o ) */
     
        for ( i=0 ; i<50 ; i++) /* tire 50 mots au sort */
        {
            if ( choisirUnMot(fichier , motAchercher , NOMBRE_MOTS) != NULL )
            {
                printf("Mot : %s\n" , motAchercher);
            } else
            {
                printf("Erreur\n");
            }
        }
     
        fclose (fichier);
     
        return 0;
    }

  8. #8
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Par défaut
    merci, je vais regarder sa.
    Moi j'ai reussi a faire une fonction bcp plus longue/barbare, ou je copie caractere par caractere, la voici :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    void choisirUnMot (FILE *file, int numeroLigne, char *tableau)
    {
     
        int hasard = rand()%numeroLigne;
     
        int  caractere = 0,i = 0, nbLettre = 0;
        char  motAtransferer[30] = "";
        rewind(file);
     
     
        if ( file != NULL && numeroLigne != 0)
        {
            while ( (caractere = fgetc(file))!= EOF && hasard != 0)
            {
     
                if (caractere == '\n')
                {
                    hasard--;
                }
     
            }
     
            fgets(motAtransferer, 30, file);
     
            nbLettre = strlen(motAtransferer);
     
     
            while (i < nbLettre)
            {
                tableau[i] = motAtransferer[i];
                i++;
     
                if (i == nbLettre)
                {
                    *(tableau + i) = '\0';
                }
            }
     
        }
    }
    je sais c'est un peu moche mais c'est la seule solution que j'ai trouver, je vais etudier le code que tu ma donner pour améliorer le mien

    MERCI A TOI

  9. #9
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 34
    Par défaut
    salut

    juste une remarque de base,

    pourquoi tu prend un int pour ton fgetc ?
    bien sur quand tu va stocker un char (8bits) dans un int (32) ca va aller
    mais ensuite quand tu vas le réutiliser?
    le compilo est obligé de supposer que tu sais que les 24 autres bits seront perdus.

  10. #10
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par momo-ben2A Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
        rewind(file);
        if ( file != NULL && numeroLigne != 0)
    Moi, je me demande pourquoi tu testes file != NULL.
    Non. En fait, je me demande surtout, si jamais il pouvait arriver que file soit égal à null, comment se comporterait le rewind() situé juste au dessus...

    Accessoirement, traiter le fichier par fgetc() et compter les '\n' pour les lignes marche... mais utiliser fgets(), qui lit une ligne entière, est beaucoup plus aisé !
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  11. #11
    Membre Expert
    Profil pro
    Inscrit en
    Août 2006
    Messages
    1 104
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2006
    Messages : 1 104
    Par défaut
    Citation Envoyé par dzada Voir le message
    pourquoi tu prend un int pour ton fgetc ?
    Il faut prévoir un éventuel EOF comme retour de fonction :
    fgetc() lit le caractère suivant depuis le flux stream et renvoie ce caractère, lu sous forme unsigned char, puis transformé en int, ou EOF en cas d'erreur ou de fin de fichier.

  12. #12
    Membre averti
    Inscrit en
    Mars 2007
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 34
    Par défaut
    exact, ca fait vraiment trop longtemp que j'ai arrêté de penser C je devrais me taire.

  13. #13
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Par défaut
    merci a tous pour vos conseils, que je mettra en pratique

    PS : j'ai vraiment fait des erreurs betes ....

  14. #14
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2010
    Messages
    126
    Détails du profil
    Informations personnelles :
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Août 2010
    Messages : 126
    Par défaut
    voila ma procedure modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void choisirUnMot (FILE *file, int numeroLigne, char *tableau)
    {
     
        int hasard = rand()%numeroLigne;
        char  motAtransferer[30] = "";
     
        if ( file != NULL && numeroLigne != 0)
        {
            rewind(file);
            while ( hasard != 0)
            {
                hasard--;
                fgets(motAtransferer, 30, file);
            }
     
            strcpy(tableau, motAtransferer);
     
        }
    }
    un seul petit probleme : a chaque fois qu'on boucle, fgets va ecraser le contenu de motAchercher (les mots precedents)

    PS : merci a tous encore pour vos explications
    PS2 : j'en profite également pour vous demander si vous ne connaissez pas des livres en C de niveau intermediaire car j'aimerai bien approfondir mes connaissances sur ce langage

  15. #15
    Expert confirmé
    Avatar de diogene
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Juin 2005
    Messages
    5 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Enseignant Chercheur
    Secteur : Enseignement

    Informations forums :
    Inscription : Juin 2005
    Messages : 5 761
    Par défaut
    un seul petit probleme : a chaque fois qu'on boucle, fgets va ecraser le contenu de motAchercher (les mots precedents)
    C'est quoi motAchercher ?
    Si c'est motAtransferer, quelle importance d'écraser les mots que l'on n'utilise pas ?


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
        int hasard = rand()%numeroLigne;
        char  motAtransferer[30] = "";
     
        if ( file != NULL && numeroLigne != 0)
    C'est trop tard qu'intervient le test numeroLigne != 0. Si numeroLigne == 0, le programme a déjà planté pour division par 0 ici :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     int hasard = rand()%numeroLigne;
    Pour bien te former au C regarde par ici : Cours et tutoriels programmation C et FAQ C.

  16. #16
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 827
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 827
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par momo-ben2A Voir le message
    voila ma procedure modifier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    void choisirUnMot (FILE *file, int numeroLigne, char *tableau)
    {
     
        int hasard = rand()%numeroLigne;
        char  motAtransferer[30] = "";
     
        if ( file != NULL && numeroLigne != 0)
        {
            rewind(file);
            while ( hasard != 0)
            {
                hasard--;
                fgets(motAtransferer, 30, file);
            }
     
            strcpy(tableau, motAtransferer);
     
        }
    }
    un seul petit probleme : a chaque fois qu'on boucle, fgets va ecraser le contenu de motAchercher (les mots precedents)
    Ben oui. Si tu veux pas les perdre alors te faut définir un "tableau" de mots avec, à chaque fois, fgets qui remplit une nouvelle case du tableau. Bien entendu te faut un tableau assez grand donc avec le nb de mots connu à l'avance ou alors obligé de jouer avec les mallocet les realloc. Bref faut te donner les moyens...

    Accessoirement, fgets() copie la ligne (enfin le mot) dans la variable "motAtransferer". Puis, sans que t'aies fait un traitement quelconque de ce mot, tu copies "motAtransferer" dans la variable "tableau". Bref la variable "motAtransferer" ne sert pas à grand chose. Comme si, chaque fois qu'on te rend la monnaie, tu mette l'argent dans la poche gauche puis, ensuite, tu transfères l'argent de la poche gauche vers la poche droite...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. [Débutant] Affecter une variable d'une classe C# à une variable Javascript
    Par SultanGeek dans le forum C#
    Réponses: 0
    Dernier message: 20/06/2015, 20h42
  2. [debutant]passager une variable d'une page a une autre
    Par Eisy dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 17/03/2006, 11h18
  3. Mettre une valeur d'une table dans une variable
    Par Raphou96 dans le forum Access
    Réponses: 5
    Dernier message: 06/02/2006, 15h19
  4. faire passer une variable d'une fct js à une page php
    Par harlock59 dans le forum Langage
    Réponses: 1
    Dernier message: 25/11/2005, 14h41
  5. Affecter une variable javascript à une variable php
    Par gwendy dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 17/10/2005, 20h58

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo