Partage
  • Partager sur Facebook
  • Partager sur Twitter

probleme d' allocation dynamique entre fonctions

je passe un tableau de char a une fonction qui est chargee d allouer la memoire pour ce tableau

    12 mai 2006 à 22:36:41

    bonjour !
    je suis tjrs sur le meme programme depuis 2 semaines et il plante de temps en temps, je trouve parfois des solutions pour eviter l' erreur, mais ce n' est que temporaire et je retombe regulierement sur des erreurs d allocation memoire.

    alors si vous pouviez me dire ce que j' oublie ca me depannerait bien, je ne sais plus quoi faire je voudrais resoudre ce probleme une bonne fois pour toute.

    voici mon code, decoupe :


    int main(int argc, char *argv[])
    {
        FILE*   origin = NULL;
        FILE*   destination = NULL;
        FILE*   list = NULL;

        char    line[0], alias[0];
        char*   comp;
        int i = 0;

    //ouvre la liste des alias, le fichier d origine, et le fichier de destination
        list = fopen("d:\\aida\\aida\\list.txt", "r");
        origin = fopen("d:\\aida\\aida\\test.txt", "r");
        destination = fopen("d:\\aida\\aida\\out.csv", "w");

    //si l ouverture des fichiers ne fonctionne pas
        if(origin == NULL || destination == NULL || list == NULL)
        {
            fprintf(stderr,"erreur dans l' ouverture des fichiers\n");
            exit(1);
        }

    //envoie le tableau 'line' pour stocker les lignes du fichier d origine
    while (lineget(origin, line))
    {
        i++;

    //envoie le tableau 'alias' pour stocker le premier alias de la liste txt
        while (lineget(list, alias))
        {
    //pointe la position de l alias dans le tableau 'line
            comp = strstr(line, alias);

    //si l alias est trouve, extraire sa valeur dans le fichier de destination
            if (comp != NULL) { seekout(destination, comp); }
        }

    //reprendre la liste d alias au debut
        fseek(list, 0, SEEK_SET);
    }

        free(alias);
        free(line);
        free(comp);

        if (fclose(origin) != 0 || fclose(destination) != 0 || fclose(list) != 0)
        {
            printf("erreur de fermeture des fichiers");
        }

        return 1;
    }


    les fonctions lineget() et linelen() :


    int     linelen(FILE* stream)
    {
        int pos = 0, len, i;
        int c = 0;

    //Sauvegarde la position du marqueur
        pos = ftell(stream);

    //compte le nombre de caracteres avant la fin de la ligne
        for (len = 0; c != '\n'; len++)
            {
                c = fgetc(stream);
                if (c == EOF) return -1;
            }
            len--; //discards '\r' before '\n'

    //replace le marqueur au debut de la ligne
            fseek(stream, -(len + a_EOL_LEN), SEEK_CUR);

    //verifie si la position du marqueur est ok
        if (ftell(stream) != pos) return -2;

        return len;
    }

    int     lineget(FILE* stream, char* line)
    {
        int i, len;

        len = linelen(stream);

        if (len < 0)
        {
            erratum(-len);
            return 0;
        }

    //dimensionne le tableau --line ou alias--
        line = realloc(line, (len + 1) * sizeof(char));

    //prevenir si l allocation a echoue
        if (line == NULL)
        {
            erratum(3);
            return 0;
        }

    //enregistre la ligne du fichier dans le tableau
        for (i = 0; i <= len; i++)
        {
            line[i] = fgetc(stream);
        }

    //insere le caractere de fin de chaine
        line[i] = '\0';

        return 1;

    }


    en fait j ai l impression que redimmensionner le tableau dans une autre fonction
    pose probleme, mais je ne sais pas pourquoi.

    mes tableaux line et alias sont redimensionnes dans la fonction lineget a chaque appel de la fonction lineget.


    le but du programme :

    j ai 3 fichiers,
    un qui contient des infos que je veux recuperer,
    un dans lequel je vais mettre ske g recupere,
    et un qui contient des bouts de texte places juste avant ce que je veux recuperer dans le premier fichier.

    vous voyez quelquechose d anormal ? :(

    edit :

    le programme plante des le deuxieme appel de cette fonction :

    while (lineget(origin, line))
    {


    et hop commentaires en francais
    • Partager sur Facebook
    • Partager sur Twitter
      12 mai 2006 à 22:39:00

      Ce serait gentil de mettre des commentaires en francais, tout le monde ne parle pas Anglais :)
      • Partager sur Facebook
      • Partager sur Twitter
        13 mai 2006 à 16:07:32

        personne pr me depanner ? :S

        ok le code est un peu long alors jvais essayer de simplifier,
        si je fais :


        int main()
        {
           char line[0];

           while (modifier(line)) printf("%s", line);
        }

        void modifier(char* line)
        {
           unsigned int X = random();

           line = realloc(line, X + 1);

           if (line == NULL) return 0;

           return 1;
        }


        est ce que j oublie qqchose ?
        • Partager sur Facebook
        • Partager sur Twitter
          13 mai 2006 à 20:32:06

          Bon déjà ce serait int main non ? Mais je pense que c'est une faute de frappe !

          Ensuite ça te parais pas louche ça :
          char line[0];


          Il vaudrait mieux :
          char line[1];

          En revanche la seul case de ce tableau sera line[0] !
          Quand j'ai une alloc dynamique à faire perso, je fais :
          char *line;

          comme ça c'est plus clair !

          Si j'ai dis une bétise corrigez moi hein !!
          • Partager sur Facebook
          • Partager sur Twitter
            14 mai 2006 à 0:03:04

            oui ! le line[0] c est vraiment stupide de ma part
            pourtant ca n empeche pas le programe de tourner pdt un moment...
            je vais corriger ca...

            pour le int main oui c etait just epr l exemple je l ai oublie
            par contre je ne crois pas qu on puisse faire un malloc de pointeur,

            ou alors je n ai pas encore compris la difference entre un

            line[] et un *line
            • Partager sur Facebook
            • Partager sur Twitter
              14 mai 2006 à 21:01:08

              Hum ...

              Citation : M@teo21 (cours)

              int main(int argc, char *argv[])
              {
                  long nombreDAmis = 0, i = 0;
                  long* ageAmis = NULL; // Ce pointeur va servir de tableau après l'appel du malloc

                  // On demande le nombre d'amis à l'utilisateur
                  printf("Combien d'amis avez-vous ? ");
                  scanf("%ld", &nombreDAmis);

                  if (nombreDAmis > 0) // Il faut qu'il ait au moins un ami (je le plains un peu sinon :p)
                  {
                      ageAmis = malloc(nombreDAmis * sizeof(long)); // On alloue de la mémoire pour le tableau
                      if (ageAmis == NULL) // On vérifie si l'allocation a marché ou pas
                      {
                          exit(0); // On arrête tout
                      }

                      // On demande l'âge des amis un à un
                      for (i = 0 ; i < nombreDAmis ; i++)
                      {
                          printf("Quel age a l'ami numero %ld ? ", i + 1);
                          scanf("%ld", &ageAmis[i]);
                      }

                      // On affiche les âges stockés un à un
                      printf("\n\nVos amis ont les ages suivants :\n");
                      for (i = 0 ; i < nombreDAmis ; i++)
                      {
                          printf("%ld ans\n", ageAmis[i]);
                      }

                      // On libère la mémoire allouée avec malloc, on n'en a plus besoin
                      free(ageAmis);
                  }

                  return 0;
              }


              Tu vois bien on l'a fait à partir d'un pointeur !

              Et long *truc; c'est la même chose que long truc[1]; je crois et dans ce cas *truc revient à truc[1] pour la valeur !
              • Partager sur Facebook
              • Partager sur Twitter

              probleme d' allocation dynamique entre fonctions

              × 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