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 :

structure de matrice en C


Sujet :

C

  1. #1
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 25
    Par défaut structure de matrice en C
    je veux a partir d'un fichier recuperer une matrice voici en fait l'enonce:
    1. struct matrix read_matrix(FILE * p) : cette méthode prend un pointeur sur un fichier correc-
    tement ouvert et prêt à lire et lit la matrice et l’écrit dans la mémoire (à allouer) et renvoie un
    pointeur vers la structure ainsi remplie.
    et voici ce que j'ai fait :

    matrix.h
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    #ifndef H_MATRIX
    #define H_MATRIX
     
    typedef struct{
            int ** matrix;
            int nb_lignes;
            int nb_colonnes;} matrix;
     
            matrix * read_matrix(FILE *p);
    #endif
    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
    #include "matrix.h"
     
     
    int main()
    {
            matrix *m;
            FILE *p;
            //p=fopen("test1","r");
            m = read_matrix(p);
            return 0;
    }
     
     
    matrix_io.c
     
     1 #include <stdio.h>
      2 #include<stdlib.h>
      3 #include "matrix.h"
      4 
      5 
      6 matrix *read_matrix(FILE *p)
      7 {
      8 //      FILE *p;
      9         p=fopen("test1","r");
     10         matrix *m;
     11         int i,j;
     12         m=(matrix*)malloc(sizeof(matrix));
     13         m->matrix=(int **)malloc(m->nb_lignes*m->nb_colonnes*sizeof(int*));
     14         fscanf(p,"%i %i",&m->nb_lignes,&m->nb_colonnes);
     15         printf("(%i %i)\n",m->nb_lignes,m->nb_colonnes);
     16 
     17         for(i=0;i<=m->nb_lignes;i++)
     18         {
     19                 for(j=0;j<20;j++)
     20                 for(j=0;j<m->nb_colonnes;j++)
     21                 {
     22                         fscanf(p,"%i",&m->matrix[i][j]);
     23                 }
     24                 //printf("%i\n",m->matrix[i][j]);*/
     25         }
     26         return m;
     27 }
     28
    mais le prob est que j'arrive a lire et recuperer juste la 1ere ligne
    Aussi si j'utilise comme parametre FILE *p j'obtients des erreurs de declaration et je ne sais pas comment jongler

  2. #2
    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
    1-
    cette méthode prend un pointeur sur un fichier correctement ouvert et prêt à lire
    Le fichier doit être ouvert AVANT l'appel

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    int main()
    {
            matrix *m;
            FILE *p;
            p=fopen("test1","r");
            if( p != NULL)
           {
               m = read_matrix(p);
    //....
              // détruire m
              fclose(p);
            }
            return 0;
    }
    2-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     12         m=(matrix*)malloc(sizeof(matrix));
     13         m->matrix=(int **)malloc(m->nb_lignes*m->nb_colonnes*sizeof(int*));
     14         fscanf(p,"%i %i",&m->nb_lignes,&m->nb_colonnes);
    Comment peut-on allouer m->nb_lignes*m->nb_colonnes AVANT de connaitre la valeur de m->nb_lignes et m->nb_colonnes ?

    L'allocation du tableau est fausse : on doit allouer m->nb_lignes pointeurs sur int puis m->nb_colonnes int pour chaque pointeur précédemment alloué

    3-
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     19                 for(j=0;j<20;j++)
     20                 for(j=0;j<m->nb_colonnes;j++)
    Pourquoi cette boucle de j=0 à 20 ?
    Pourquoi les deux boucles utilisent-elles la même variable j ?

  3. #3
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 25
    Par défaut
    c'est idiot mais je ne me rappelle plus l'avoir mise cette boucle ni la raison en tout cas grand merci pour ton aide

  4. #4
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 25
    Par défaut
    J'ai refais en definissant m->nb_lignes et m->nb_colonnes mais j'ai toujours une "segmentation fault" que je n'arrive pas a isoler

    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
    matrix *m;
            int i,j;
     
            m=(matrix*)malloc(sizeof(matrix));
     
            fscanf(p,"%i %i",&m->nb_lignes,&m->nb_colonnes);
     
            m->matrix=(int **)malloc(m->nb_lignes*m->nb_colonnes*sizeof(int*));
     
            printf("(%i %i)\n",m->nb_lignes,m->nb_colonnes);
     
            for(i=0;i<=m->nb_lignes;i++)
            {
                    for(j=0;j<m->nb_colonnes;j++)
                    {
                            fscanf(p,"%i",&m->matrix[i][j]);
                    }
            //      printf("%i\n",m->matrix[i][j]);
            }
            return m;

  5. #5
    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
    Comme dit dans mon post précédent :
    L'allocation du tableau est fausse : on doit allouer m->nb_lignes pointeurs sur int puis m->nb_colonnes int pour chaque pointeur précédemment alloué
    Ici tu alloues m->nb_lignes*m->nb_colonnes pointeurs sur int (au lieu de m->nb_lignes pointeurs sur int) et pas de int ;
    Du coup, m->matrix[i] est la valeur du ième pointeur non initialisé et m->matrix[i][j] va dans les décors en essayant de prendre le jième élément du tableau m->matrix[i], lequel n'existe pas !

    Voir la FAQ : Comment allouer dynamiquement un tableau à 2 dimensions ?

    PS : Utilise les balises [code ] et [ /code] pour encadrer ton code : Démonstration de l'utilisation du bouton code (#)

  6. #6
    Membre averti
    Inscrit en
    Novembre 2009
    Messages
    25
    Détails du profil
    Informations forums :
    Inscription : Novembre 2009
    Messages : 25
    Par défaut
    Ok j'ai reussi a le faire
    grand merci

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Débutant] Creation dynamique de structure de matrice
    Par eloise_v dans le forum Images
    Réponses: 6
    Dernier message: 15/03/2010, 14h26
  2. [Structure] Stockage d'une matrice en XML
    Par mamid1706 dans le forum XML/XSL et SOAP
    Réponses: 6
    Dernier message: 15/03/2007, 17h14
  3. Afficher les valeurs d'une structure dans une matrice
    Par yabbiyou dans le forum MATLAB
    Réponses: 1
    Dernier message: 22/02/2007, 13h26
  4. structure matrice en C
    Par pedro7 dans le forum C
    Réponses: 8
    Dernier message: 17/12/2006, 16h28
  5. TAD matrice (structure + tableau dynamique)
    Par supermanu dans le forum C
    Réponses: 10
    Dernier message: 13/11/2004, 21h04

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