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 :

Remplissage de tableaux à 2 dimensions


Sujet :

C

  1. #1
    Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 29
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Décembre 2014
    Messages : 5
    Points : 4
    Points
    4
    Par défaut Remplissage de tableaux à 2 dimensions
    Bonjour,

    Toujours dans ma quête d’apprentissage du C, je veux remplir de caractères un tableaux a 2 dimensions. J'ai un fichier et pour chaque ligne du fichier je stocke la chaîne de caractère dans une case du tableau.

    Mon problème est le suivant : j'ai un "Segmentation Fault" sur la dernière ligne du tableau, quand j'ai 25 lignes à copier, j'en copie 24 et la dernière provoque une jolie "Segmentation Fault". Quand j'ai 4 lignes, j'en copie 3 et la dernière provoque une jolie "Segmentation Fault", etc.

    Un exemple sera peut-être plus parlant :
    - le fichier que je veux copier.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    4
    yuay
    jkja
    oiyi
    aoiu
    - le résultat d’exécution.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    />./BSQ exemple
    yuay
    jkja
    oiyi
    Erreur de segmentation
    Et voici le code :

    - le main :
    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
    int     main(int argc, char **argv)
    {
      int   fd;
      int   ret;
      char  *buffer;
     
      buffer = malloc(sizeof(char));
      fd = open(argv[1], O_RDONLY);
      if (fd == -1)
        {
          my_putstr("open error");
          return (1);
        }
      ret = read(fd, buffer, buffer);
      pos_origin(buffer);
      close(fd);
      return (0);
    }
    - fonction de remplissage :
    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
    int     count_line(char *str)
    {
      int   i;
      int   nbr_line;
     
      i = 0;
      nbr_line = 0;
      while (str[i])
        {
          if (str[i] == '\n')
            nbr_line = nbr_line + 1;
          i = i + 1;
        }
      return (nbr_line);
    }
     
    int     pos_origin(char *buffer)
    {
      int   i;
      int   n;
      int   v;
      int   y;
      int   nbr_line;
      char  **tab;
     
      y = 2;
      i = 0;
      n = 0;
      v = 0;
      nbr_line = count_line(buffer);
      tab = malloc(sizeof(char *));
      while (n < nbr_line)
        {
          tab[n] = malloc(sizeof(char));
          n = n + 1;
        }
      while (y != '\0')
        {
          while (buffer[y] != '\n')
            {
              tab[v][i] = buffer[y];
              y = y + 1;
              i = i + 1;
            }
          my_printf("%s\n", tab[v]);
          v = v + 1;
          y = y + 1;
          i = 0;
        }
      free(tab);
      free(*tab);
    }
    Merci d'avance à ceux qui prendront le temps de me lire et de m'aider.

  2. #2
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par daminouche Voir le message
    Et voici le code:

    Le main
    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
    int     main(int argc, char **argv)
    {
      int   fd;
      int   ret;
      char  *buffer;
    
      buffer = malloc(sizeof(char));
      fd = open(argv[1], O_RDONLY);
      if (fd == -1)
        {
          my_putstr("open error");
          return (1);
        }
      ret = read(fd, buffer, buffer);
      pos_origin(buffer);
      close(fd);
      return (0);
    }
    Fonction de remplissage.
    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
    int     count_line(char *str)
    {
      int   i;
      int   nbr_line;
    
      i = 0;
      nbr_line = 0;
      while (str[i])
        {
          if (str[i] == '\n')
            nbr_line = nbr_line + 1;
          i = i + 1;
        }
      return (nbr_line);
    }
    
    int     pos_origin(char *buffer)
    {
      int   i;
      int   n;
      int   v;
      int   y;
      int   nbr_line;
      char  **tab;
    
      y = 2;
      i = 0;
      n = 0;
      v = 0;
      nbr_line = count_line(buffer);
      tab = malloc(sizeof(char *));
      while (n < nbr_line)
        {
          tab[n] = malloc(sizeof(char));
          n = n + 1;
        }
      while (y != '\0')
        {
          while (buffer[y] != '\n')
            {
              tab[v][i] = buffer[y];
              y = y + 1;
              i = i + 1;
            }
          my_printf("%s\n", tab[v]);
          v = v + 1;
          y = y + 1;
          i = 0;
        }
      free(tab);
      free(*tab);
    }
    Bonjour

    Voir ce que j'ai mis en rouge dans ton code. Tu ne peux pas stocker "n" éléments dans une zone mémoire allouée pour "un" élément. Et tu devrais aussi vérifier comment on utilise read(). Et accessoirement éviter de remplir des variables que tu n'utilises pas (ret=read(...))...

    PS: au fait, vouloir stocker tout un fichier en mémoire est une très mauvaise idée. Justement je viens d'un autre topic où quelqu'un avait aussi essayé (voir ici)...

  3. #3
    Membre averti
    Homme Profil pro
    Inscrit en
    Juillet 2012
    Messages
    200
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Bénin

    Informations forums :
    Inscription : Juillet 2012
    Messages : 200
    Points : 342
    Points
    342
    Par défaut
    Bonjour. Après avoir regardé ton code, j'ai quelques petites remarques :
    1. Il n'y a pas de commentaires, donc c'est difficile pour quelq'un qui veut t'aider de comprendre ce que tu as &ssayé de faire.
    2. Pour les opérations d'entrée-sortie sur les fichiers, il est préférable d'utiliser les fonctions fopen, fread et fclose de la bibliothèque standard.
    3. Dans ta fonction main(), tu fais un malloc() et tu ne vérifies pas si le pointeur renvoyé est différent de NULL.
    4. Pour en revenir à ce que tu veux faire, pour lire une ligne dont tu ne connais pas la taille, utilise la fonction "getline" de librairie du projet GNU.
    Donc le code est le suivant
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    Lire la première ligne contenant le nombre de lignes n
    allouer la mémoire pour un tableau de n buffers (char *)
    Pour chacun des éléments du tableau alloué, appeler la fonction getline()

  4. #4
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par esired Voir le message
    2. Pour les opérations d'entrée-sortie sur les fichiers, il est préférable d'utiliser les fonctions fopen, fread et fclose de la bibliothèque standard.
    Là je ne suis pas d'accord. Si open, read et close existent (et sont tellement déployées de partout qu'on pourrait presque croire qu'elles font aussi partie de la bibliothèque standard ), ce n'est pas pour rien. Dans un cas peut-être que fopen sera préférable mais dans d'autre cas peut-être que ce sera open.

    Ceci dit, c'est vrai qu'il y a beaucoup de fonctions intéressantes (fgets, fscanf, fprintf, getline) qui utilisent un FILE* en entrée...

  5. #5
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 195
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 195
    Points : 17 163
    Points
    17 163
    Par défaut
    Tiens, elles font parties de la lib? je ne l'ai trouve pas sur la partie C de cppreference.com
    Tu es sûr de toi?

  6. #6
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    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 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Non, t'as raison. J'ai présumé qu'elles en faisaient partie mais en fait je ne les y trouve pas. Je corrige...

Discussions similaires

  1. Réponses: 8
    Dernier message: 09/03/2006, 17h48
  2. [Tableaux] mémoriser un tableaux à n dimension
    Par Benat64 dans le forum Langage
    Réponses: 4
    Dernier message: 21/02/2006, 16h43
  3. [Tableaux] Gerer des tableaux à deux dimensions
    Par FrankOVD dans le forum Langage
    Réponses: 2
    Dernier message: 02/12/2005, 15h20
  4. Tableaux à plusieurs dimensions
    Par Diabolik dans le forum Assembleur
    Réponses: 3
    Dernier message: 08/12/2003, 12h15
  5. [langage] erreurs utilisation tableaux 2 dimensions
    Par drosof dans le forum Langage
    Réponses: 11
    Dernier message: 01/07/2003, 11h44

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