Probleme de Malloc sur un char ** [Résolu]

tomy46 11 Messages postés dimanche 19 mars 2006Date d'inscription 16 février 2014 Dernière intervention - 27 oct. 2010 à 01:25 - Dernière réponse : tomy46 11 Messages postés dimanche 19 mars 2006Date d'inscription 16 février 2014 Dernière intervention
- 29 oct. 2010 à 11:14
Bonjour a tous,

Avant tout, désole pour les accents (sauf ceux repris par la correction orthographique) mais je suis sur qwerty ...

Bon voici mon problème :
Je lis un fichier qui contient plusieurs ligne de texte ...
Pour cela :
read(fd, buffer, 1)

J'effectue donc une lecture caractère par caractère que je stock dans le buffer...
Âpres cela je veux stocker ces lignes dans une belle chaîne de caractère char **tabl :
Pour cela :

int     my_open_file(char *argv, char *buffer, int fd, int argc)
{
  int   x;
  int   y;
  int   reader;
  char  **tabl;

  x = 0;
  y = 0;
  reader = 1;
  fd = open(fichier, O_RDONLY);
  while (reader == 1)
    {
      reader = read(fd, buffer, 1);
      buffer[reader] = '\0';
      if (buffer[1] = '\n')
        {
          y = y + 1;
          x = 0;
        }
      alloc_new_tabl(tabl, buffer, x, y);
      x = x + 1;
      my_putstr("O.K \n");
      //my_putstr(buffer);                                                     
      //my_putstr(tabl[0]);                                                    
    }
  close(fd)
}


Puis j'appel alloc_new_tabl :

void    alloc_new_tabl(char **tabl, char *buffer, int x, int y)
{
  tabl[y][x] = malloc(1);
  tabl[y][x] = buffer[1];
}


Seg Fault juste après le malloc ...
Le problème vient donc de la mais je n'arrive pas a le régler (sûrement par manque de connaissances ...)

Bref pouvez vous me corriger et m'expliquer pourquoi mon allocation dynamique n'est pas correct.

Merci d'avance :)


....:::: Tom JOSEPH ::::....
Afficher la suite 

Votre réponse

7 réponses

Meilleure réponse
DeAtHCrAsH 2674 Messages postés vendredi 25 janvier 2002Date d'inscription 6 février 2013 Dernière intervention - 27 oct. 2010 à 05:24
3
Merci
Salut,

Plusieurs choses à dire sur ton code.
Je vais essayer de rester simple pour ne pas te perdre.

1) Ta condition est toujours vrai tel que tu l'as ecrit :
if (buffer[1] = '\n')


Il manque un '=' pour effectuer la comparaison. D'autre part tu effectues une lecture caractère par caractère, mais pourtant tu oses ecrire buffer[1]... Vu ton code, buffer[1] devrais toujours valoir 0 qui marque la fin d'une chaine.

2) Ta boucle while ce base sur un nombre d'octet lus ce qui n'est pas correcte. Utilise feof a la place : while(!feof(fd)){...}

3) La lecture caractère par caractère va te bouffer les perfoamance. Il vaut mieux utiliser une lecture par bloc. Mais ce point la n'est pas critique, il n'empeche pas le bon fonctionnement du programme.

4) Ton tableau a deux dimensions. Avant de l'utiliser tu dois allouer la premiere dimensions sans quoi ttu va te prendre des erreurs dans tous les sens. Cela implique que tu dois connaitre a l'avance le nombre de ligne de ton fichier. Si ce n'est pas le cas tu peux toujours initialiser ta zone mémoire par bloc, et la redimenssioner si tu as besoin de plus d'espace.
char ** myArray;
malloc(*myArray, 2); //Initialise le nombre de ligne a 2
malloc(myArray[0], 15); // Initialise la premiere ligne a 15 caractères.
strcpy(myArray[0], "bonjour"); // Affecte une valeur a la premiere ligne
malloc(myArray[1], 15); // Initialise la premiere ligne a 15 caractères.
strcpy(myArray[1], "au revoir"); // Affecte une valeur a la deuxieme ligne


4) Pour rester cohérent avec le reste de ton code utilise la méthode fclose plutot que close pour liberer la mémoire allouer pour ton fichier.

Bref beaucoup de chose à améliorer. Tu peux regarder dans mes sources tu trouveras quelques codes sur la manipulation des fichiers textes en C avec le stockage dans des tableaux.

Shell

Merci DeAtHCrAsH 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de DeAtHCrAsH
Meilleure réponse
DeAtHCrAsH 2674 Messages postés vendredi 25 janvier 2002Date d'inscription 6 février 2013 Dernière intervention - 29 oct. 2010 à 05:36
3
Merci
Alloue la mémoire de ton tableau dans le main(), ca réglera tes problèmes.
Prend l'habitude de ne jamais passer en paramatres un pointeur non initialisé, ca t'évitera d'avoir des surprises.

Shell

Merci DeAtHCrAsH 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 69 internautes ce mois-ci

Commenter la réponse de DeAtHCrAsH
DeAtHCrAsH 2674 Messages postés vendredi 25 janvier 2002Date d'inscription 6 février 2013 Dernière intervention - 27 oct. 2010 à 06:14
0
Merci
Tu l'auras remarquer mes mallocs sont faux, mais l'idée est la.
Voici un petit code rapide qui va peut etre mieux t'aider a comprendre les tableaux a deux dimensions :

#include 

void displayArray(char ** arr);

int main(int argc, char **argv)
{
char **myArray = NULL;
myArray = (char**)malloc(2);

myArray[0] = (char*)malloc(15);
strcpy(myArray[0], "bonjour");

myArray[1] = (char*)malloc(15);
strcpy(myArray[1], "au revoir");

displayArray(myArray);

system("pause");

return EXIT_SUCCESS;
}

void displayArray(char ** arr)
{
std::cout << "Table values :" << std::endl;

for(int i=0;i<2;++i)
{
std::cout << arr[i] << std::endl;
}
}



Shell
Commenter la réponse de DeAtHCrAsH
tomy46 11 Messages postés dimanche 19 mars 2006Date d'inscription 16 février 2014 Dernière intervention - 27 oct. 2010 à 13:52
0
Merci
Bonjour,

Pour le if c'est une erreur de ma part ...
Pour le reste je suis en train de finir de corriger ...
Je re-poste des que j'ai fini :)

Un GRAND merci en tout cas !

Bonne journée ....

....:::: Tom JOSEPH ::::....

Epitech Toulouse - Tek1
M.S.P. : Microsoft Student Partner
Commenter la réponse de tomy46
tomy46 11 Messages postés dimanche 19 mars 2006Date d'inscription 16 février 2014 Dernière intervention - 27 oct. 2010 à 17:15
0
Merci
Re-Bonjour !

Alors mes problèmes sont règles mais il me reste un petit problème d'affichage, explication :
Voila mon code fini ...


#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <stdlib.h

void    my_putchar(char c)
{
  write(1, &c, 1);
}

int     check(int fd, char *argv, int argc)
{
  if (argc != 2)
    {
      my_putchar('\n');
      my_putstr("Attention: Il y a trop de parametres !\n");
      my_putchar('\n');
      return (0);
    }
  if (fd == -1)
    {
      my_putchar('\n');
      my_putstr("Erreur: Le fichier d'entree n'a pas ete trouve !\n");
      my_putchar('\n');
      return (0);
    }
  else
    return (1);
}

void    aff_string(char **tabl)
{
  int   i;
  int   j;

  i = 0;
  while (tabl[i] != '\0')
    {
      j = 0;
      while (tabl[i][j] != '\0')
        {
          my_putchar(tabl[i][j]);
          j = j + 1;
        }
      i = i + 1;
    }
}

int     my_open_file(char *argv, char **tabl, int fd, int argc)
{
  int   x;
  int   y;
  int   reader;
  char  *buffer;

  x = 0;
  y = 0;
  reader = 1;
  fd = open(argv, O_RDONLY);
  if (check(fd, argv, argc) == 0)
    return (-1);
  buffer = malloc(1 * sizeof(*buffer));
  read(fd, buffer, 2);
  tabl = (char**)malloc(buffer[0]);
  tabl[y] = (char*)malloc(64);
  while (reader == 1)
    {
      reader = read(fd, buffer, 1);
      buffer[reader] = '\0';
      if (buffer[0] == '\n')
        {
          y = y + 1;
          tabl[y] = (char*)malloc(64);
          x = 0;
        }
      tabl[y][x] = buffer[0];
      x = x + 1;
    }
  aff_string(tabl);
  free(buffer);
  close(fd);
}

int     main(int argc, char **argv)
{
  char  **tabl;
  int   fd;
  int   tmp;

  tmp = my_open_file(argv[1], tabl, fd, argc);
  if (tmp == -1)
    return (-1);
  //aff_string(tabl);                                                          
}



Mon problème est le suivant:
Âpres avoir traite mon tableau (char **tabl), je l'affiche a la fin de la fonction my_open_file ... Jusque la tout va bien ...
Mais comme je dois utiliser ce tableau dans la suite de mon programme, je re-test son affichage directement dans mon main et la : ERREUR !
Je réalise aucune action sur le **tabl mais il ne s'affiche qu a partir de la fonction my_open_file ...

HELP :(

Merci...

....:::: Tom JOSEPH ::::....

Epitech Toulouse - Tek1
M.S.P. : Microsoft Student Partner
Commenter la réponse de tomy46
tomy46 11 Messages postés dimanche 19 mars 2006Date d'inscription 16 février 2014 Dernière intervention - 27 oct. 2010 à 23:45
0
Merci
HELP

Personne?
Ma variable char **tabl une fois malloce ne peut pas être utilise dans une autre fonction??

Merci ...


....:::: Tom JOSEPH ::::....

Epitech Toulouse - Tek1
M.S.P. : Microsoft Student Partner
Commenter la réponse de tomy46
tomy46 11 Messages postés dimanche 19 mars 2006Date d'inscription 16 février 2014 Dernière intervention - 29 oct. 2010 à 11:14
0
Merci
Nickel PARFAIT :)



....:::: Tom JOSEPH ::::....

Epitech Toulouse - Tek1
M.S.P. : Microsoft Student Partner
Commenter la réponse de tomy46

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.