Partage
  • Partager sur Facebook
  • Partager sur Twitter

Récupérer une chaine à partir d'une fonction.

    18 mai 2007 à 14:31:08

    Bonjour :) ,

    Donc le problème est que je me retrouve avec un :
    segmentation fault: 11 (core dumped)

    Lorsque je veux récupérer la chaine de ma fonction de cette manière :

    char *motATrouver=NULL;
    motATrouver=tirerUnMot();

    Et voici ma fonction :
    char *tirerUnMot()
    {
            FILE *fichier=NULL;
            char mot[100]={0};
            int nbDeMot=0, nbAleatoire=0;
            char caractere=0;

            nbDeMot=lireDico();
            nbAleatoire=(rand()%(nbDeMot-1+1))+1;

            fichier=fopen("dico.txt","r");
            if(fichier!=NULL)
            {
                    rewind(fichier);

                    while(nbAleatoire>0)
                    {
                            caractere=fgetc(fichier);
                            if(caractere=='\n') nbAleatoire--;
                    }

                    fgets(mot,100,fichier);
                    mot[strlen(mot)-1]='\0';
                   
                    fclose(fichier);
            }

            return mot;
    }

    Je ne parviens pas à sceller l'erreur. Si quelqu'un pourrait m'éclaicir ça serait sympa :) .
    Merci .
    • Partager sur Facebook
    • Partager sur Twitter
      18 mai 2007 à 14:43:04

      Salut,

      (C'est un problème assez fréquent, et j'aurais quasiment pu te répondre rien qu'en lisant le titre, sans même voir ton code... :D )

      Le problème, ici, est que la variable mot, dont tu renvoies la valeur à la fin de ta fonction, est une variable locale à la fonction tirerUnMot(). Ton tableau mot est détruit (la mémoire est libérée) quand tu sors de cette fonction, et tu renvoies donc un pointeur vers une zone mémoire non-allouée.

      Trois solutions :

      a) Faire de mot une variable statique, afin d'éviter qu'elle ne soit détruite à la fin de la fonction (mais sa valeur sera écrasée à chaque nouvel appel de la fonction) ;

      b) Allouer dynamiquement la mémoire pour mot (il ne faudra pas oublier de la libérer dans le code appelant) ;

      c) Laisser le code appelant se charger de l'allocation du tableau (dynamiquement ou non), et passer ce tableau à la fonction tirerUnMot qui se chargera de le remplir.
      • Partager sur Facebook
      • Partager sur Twitter
        18 mai 2007 à 14:49:22

        Citation : garulfoUnix

        Donc le problème est que je me retrouve avec un :

        segmentation fault: 11 (core dumped)


        char *tirerUnMot()
        {
                FILE *fichier=NULL;
                char mot[100]={0};

        <...>
                return mot;
        }



        Un meilleur réglage de ton compilateur aurait permis de voir le problème tout de suite :

        http://mapage.noos.fr/emdel/codage.htm#cfg_compilo
        • Partager sur Facebook
        • Partager sur Twitter
        Music only !
          18 mai 2007 à 15:03:05

          Sceller l'erreur ? Comment ça ?
          • Partager sur Facebook
          • Partager sur Twitter
            18 mai 2007 à 16:10:33

            Citation : remram44

            Sceller l'erreur ? Comment ça ?

            Je pense qu'il veut dire 'celer'...

            Citation : Pas de titre


            Synonyme du verbe celer
            cacher - camoufler - couvrir - déguiser - dissimuler - masquer - receler - taire - travestir -


            Mais chez nous, on ne cache pas les erreurs, on les corrige...

            • Partager sur Facebook
            • Partager sur Twitter
            Music only !
              18 mai 2007 à 19:30:34

              @ gouttegd : merci, j'ai résolu le problème avec la méthode "static" . Pour ce qui est de l'allocation dynamique, j'ai pas encore essayer car je ne parviens pas trop a cibler là ou je dois allouer (dans la fonction ou dans le code appelant..)

              @ remram44 : -ed- à trés bien définit ce que je voulais dire :) . Et puis merci pour la correction orthographique -ed- ^^ . Je ne me souvenais plus comment ça s'écrit .
              • Partager sur Facebook
              • Partager sur Twitter
                18 mai 2007 à 20:26:11

                Citation : garulfoUnix

                @ gouttegd : merci, j'ai résolu le problème avec la méthode "static"


                Dommage, c'est la pire...

                Il n'est pas difficile de définir un objet et de passer son adresse à la fonction qui va le remplir...

                Principe général :
                 
                   T obj;

                   fonction (&objet);

                avec
                fonction (T* p_obj);

                Tableau :

                   T tab[SIZE];

                   fonction (tab, sizeof tab / sizeof *tab);

                avec
                fonction (T* a, size_t n);

                • Partager sur Facebook
                • Partager sur Twitter
                Music only !
                  18 mai 2007 à 20:56:19

                  Citation : -ed-

                  Citation : garulfoUnix

                  @ gouttegd : merci, j'ai résolu le problème avec la méthode "static"


                  Dommage, c'est la pire...


                  Ce n'est pas forcément la pire, hein ^^ Mais c'est vrai qu'il faut bien comprendre ce qu'elle implique.

                  En fait, AMHA l'inconvénient (le danger) de cette méthode c'est qu'elle est un peu trop simple (il suffit de rajouter le mot-clé "static", et hop, ça marche !), et qu'en conséquence on peut être tenté (comme tu l'as manifestement fait, garulfoUnix) de s'en contenter sans forcément bien chercher à comprendre ce qui se passe.

                  Citation : garulfoUnix

                  Pour ce qui est de l'allocation dynamique, j'ai pas encore essayer car je ne parviens pas trop a cibler là ou je dois allouer


                  Si tu fais référence à la deuxième méthode que je t'ai indiqué, le tableau doit être alloué au sein de la fonction qui l'utilise. La mémoire allouée par malloc() (ou consorts) n'étant jamais libérée implicitement (en particulier, elle n'est pas libérée à la fin du bloc où l'allocation a été faite), tu peux retourner le pointeur correspondant à la fin de la fonction : il pointera toujours vers une zone mémoire valide, jusqu'à ce que la mémoire soit explicitement libérée par un appel à free() (ce que devra faire le code appelant lorsqu'il n'aura plus besoin du tableau).

                  Toutefois, je te conseillerai plutôt la troisième méthode. C'est la plus "souple", dans la mesure où la fonction est complètement déchargée de l'allocation du tableau. Allouer le tableau devient ainsi la responsabilité du code appelant, qui peut le faire de n'importe quelle manière (automatique, statique ou dynamique) sans que le code de ta fonction n'ait à s'en soucier. Tout ce que la fonction a à faire est de manipuler le tableau qu'on lui passe. Voir l'exemple de -ed-.
                  • Partager sur Facebook
                  • Partager sur Twitter

                  Récupérer une chaine à partir d'une fonction.

                  × 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