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 :

Manipulation de matrices.


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 6
    Points
    6
    Par défaut Manipulation de matrices.
    Hello les gens!
    Je viens quemander de l'aide afin de me sortir de ce programme qui me prend la tete.
    But de l'exericice: creer un programme qui manipule des matrices. Je vous poste ici la partie principale qui s'occupe de l'allocation de la memoire, de lire un fichier contenant une matrice sous la forme
    2 3 //nbre de lignes et de colonnes
    1 2 3
    4 5 6
    D'ecrire dans le meme fichier...
    Le probleme vient de l'allocation (quelques warnings a la compilation avec gcc mais rien vis a vis de l'alloc), et j'ai le droit a un beaux segfault!
    Bref, je remercie quiconque tentera de jeter un oeil au programme et me permettra de corriger mon erreur.

    Voila le source:

    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct {
    int **matrix;
    int nb_lignes;
    int nb_colonnes;
    } matrix;
     
    void write_matrix(FILE *p,matrix *m) {
    int i;
    int j;
    if (p==NULL) return; //ouverture du fichier matrice.txt impossible
    fprintf(p,"%i%s%i\n",m->nb_lignes," ",m->nb_colonnes);
    for (i=0; i<m->nb_lignes; i++) {
    for (j=0; j<m->nb_colonnes; j++) {
    fprintf(p,"%i%s",m->matrix[j]," ");
    }
    fprintf(p,"\n");
    }
    }
     
    matrix * read_matrix(FILE *p) {
    int i,j;
    matrix *m;
    m=(matrix *)malloc(sizeof(matrix));
    if (p==NULL) return; //ouverture en lecture impossible
    fscanf(p,"%i%i",&m->nb_lignes,&m->nb_colonnes);
    m->matrix=(int**)calloc(m->nb_lignes,sizeof(int**));
    for (i=0; i<m->nb_lignes; i++) {
    m->matrix=(int*)calloc(m->nb_colonnes,sizeof(int*));
    }
    for (i=0; i<m->nb_lignes; i++) {
    for (j=0; j<m->nb_colonnes; j++) {
    fscanf(p,"%i",&m->matrix[j]);
    printf("%i%s",m->matrix[j]," ");
    }
    printf("\n");
    }
    return &m;
    }
     
    void affic_matrix(matrix *m) {
    int i,j;
    printf("Matrice de taille : %i * %i\n",m->nb_lignes,m->nb_colonnes);
    for (i=0; i<m->nb_lignes; i++) {
    for (j=0; i<m->nb_colonnes; j++){
    printf("%i%s",m->matrix[j]," ");
    }
    printf("\n");
    }
    }
     
     
    matrix * allouer_matrice(int nbli, int nbcol) {
    matrix *m;
    int i;
    m->nb_lignes=nbli;
    m->nb_colonnes=nbcol;
    m->matrix=(int**)calloc(nbli,sizeof(int**));
    for (i=0; i<nbcol; i++) {
    m->matrix=(int*)calloc(nbcol,sizeof(int*));
    }
    return &m;
    }
     
    void remplir_matrice(matrix *m){
    int i,j;
    printf("Remplissage de matrice %dx%d\n",m->nb_lignes,m->nb_colonnes);
    for(i=0;i<m->nb_lignes;i++){
    for(j=0;j<m->nb_colonnes;j++){
    printf("element (%d,%d)?",i,j);
    scanf("%i",&(m->matrix[j]));
    }
    }
    }
     
    int main() {
    matrix * m;
    int i, nbli, nbcol;
    FILE *fic;
    fic=fopen("matrix.txt","w");
    if (fic!=NULL){
    printf("Nombre de lignes : ");
    scanf("%i",&nbli);
    printf("Nombre de colonnes : ");
    scanf("%i",&nbcol);
    printf("huhu\n");
    m=allouer_matrice(nbli, nbcol);
    //remplir_matrice(m);
    //printf("%i %i %i\n",m->nb_lignes, m->nb_colonnes, m->matrix[1][1]);
    //write_matrix(fic,m);
    //m=read_matrix(fic);
    //affic_matrix(m);
    }
    }

  2. #2
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Salut

    Au moins une erreur ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    matrix * allouer_matrice(int nbli, int nbcol) {
    matrix *m;
    int i;
    m->nb_lignes=nbli; // seg fault, m est un pointeur non initialisé.
    m->nb_colonnes=nbcol;
    m->matrix=(int**)calloc(nbli,sizeof(int**));
    for (i=0; i<nbcol; i++) {
    m->matrix=(int*)calloc(nbcol,sizeof(int*));
    }
    return &m;
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  3. #3
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Je viens de voir ça aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
    int **matrix; // pour chercher (et trouver) les ennuis, y'a pas mieux que cette réutilisation du même nom matrix
    int nb_lignes;
    int nb_colonnes;
    } matrix;
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Trap D
    Salut

    Au moins une erreur ici
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    matrix * allouer_matrice(int nbli, int nbcol) {
    matrix *m;
    int i;
    m->nb_lignes=nbli; // seg fault, m est un pointeur non initialisé.
    m->nb_colonnes=nbcol;
    m->matrix=(int**)calloc(nbli,sizeof(int**));
    for (i=0; i<nbcol; i++) {
    m->matrix=(int*)calloc(nbcol,sizeof(int*));
    }
    return &m;
    }
    A l'aide de printf judicieusement places j'avais vu que le probleme venait de la aussi... Malheureusement je ne comprends pas l'erreur. :/

    Citation Envoyé par Trap D
    Je viens de voir ça aussi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    typedef struct {
    int **matrix; // pour chercher (et trouver) les ennuis, y'a pas mieux que cette réutilisation du même nom matrix
    int nb_lignes;
    int nb_colonnes;
    } matrix;
    Yep, je note ca, et je le modifie.

    Merci de ton aide.

  5. #5
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    ton pointeur m n'est pas initialisé, celà veut dire en fait qu'il pointe vers n'importe quoi.
    Tu dois faire d'abord
    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
    matrix * allouer_matrice(int nbli, int nbcol) {
    matrix *m = malloc(sizeof(*m));
    int i;
    if (m != NULL)
    {
      m->nb_lignes=nbli; // seg fault, m est un pointeur non initialisé.
      m->nb_colonnes=nbcol;
      m->matrix=(int**)calloc(nbli,sizeof(int**));
      if (m->matrix != NULL)
      {
        for (i=0; i<nbcol; i++) 
       {
          m->matrix=(int*)calloc(nbcol,sizeof(int*));
       }
      }
    }
    return m; // erreur ici, le compilateur aurait du la signaler
    }
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup!

  7. #7
    Rédacteur/Modérateur
    Avatar de Trap D
    Profil pro
    Inscrit en
    Septembre 2003
    Messages
    4 942
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2003
    Messages : 4 942
    Points : 6 498
    Points
    6 498
    Par défaut
    Attention quand même, la gestion des erreurs de malloc (retour NULL) n'est pas faite.
    Il y a encore beaucoup à faire pour avoir un code solide.
    "La haine seule fait des choix" - Koan Zen
    "Il ne faut pas être meilleur que les autres, il faut être meilleur que soi." Albert Jacquard
    "Ceux qui savent où ils ont posé leur parapluie ne sont pas alcooliques." - pgibonne.
    Faites du Prolog, ça vous changera les idées !
    Ma page Prolog
    Mes codes sources commentés

    Mon avatar : La Madeleine à la veilleuse de Georges de La Tour

  8. #8
    Membre éprouvé

    Profil pro
    Inscrit en
    Août 2003
    Messages
    878
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2003
    Messages : 878
    Points : 1 067
    Points
    1 067
    Par défaut
    Citation Envoyé par Trap D
    Il y a encore beaucoup à faire pour avoir un code solide.
    Et lisible !

    Ca peut aider d'indenter...(enfin, c'est peut-être seulement sur le forum)

    Citation Envoyé par TeKa
    quelques warnings a la compilation avec gcc mais rien vis a vis de l'alloc
    1) il ne devrait pas y avoir de warning si le code est correct
    2) essaye avec ces options
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -Wimplicit -Wreturn-type -Wunused -Wswitch -Wcomment -Wuninitialized -Wparentheses -Wtraditional -Wshadow -Wpointer-arith -Wmissing-prototypes -o reloaded matrix.c
    Et avant que la question ne soit posée : non, -Wall n'affiche pas tous les avertissements (avec gcc).
    Un problème bien exposé
    est, pour moitié, solutionné. / La connaissance s'accroît quand on la partage, pas quand on l'impose. / La violence est le langage des faibles.

  9. #9
    Expert éminent sénior
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 369
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    ... Ce qui est stupide pour une option avec un nom pareil


    Et avec -Wall -Wextra sur un GCC récent? il les affiche tous?
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  10. #10
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par Médinoc
    Et avec -Wall -Wextra sur un GCC récent? il les affiche tous?
    Presque, dont certains qui me gènent, comme
    "Missing initializers".
    Pas de Wi-Fi à la maison : CPL

  11. #11
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par David.Schris
    Citation Envoyé par Trap D
    Il y a encore beaucoup à faire pour avoir un code solide.
    Et lisible !

    Ca peut aider d'indenter...(enfin, c'est peut-être seulement sur le forum)

    Citation Envoyé par TeKa
    quelques warnings a la compilation avec gcc mais rien vis a vis de l'alloc
    1) il ne devrait pas y avoir de warning si le code est correct
    2) essaye avec ces options
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gcc -Wall -Wimplicit -Wreturn-type -Wunused -Wswitch -Wcomment -Wuninitialized -Wparentheses -Wtraditional -Wshadow -Wpointer-arith -Wmissing-prototypes -o reloaded matrix.c
    Et avant que la question ne soit posée : non, -Wall n'affiche pas tous les avertissements (avec gcc).
    J'indentes, mais sur le copier coller a tout casse... :/
    J'apprends quelque chose pour -Wall, mais je n'arrive pas a virer tous le warnings (je n'avais jamais fait de C avant la rentree, donc il me faut le temps encore de tout bien apprendre a analyser)

    Je vous reposte ici mon programme quelque peu modifie: j'ai reussi a allouer ma matrice sans probleme, je peux ecrire dans mon fichier matrice.txt. Malheureusement, je n'arrive pas a creer une matrice avec les elements du fichier matrix.txt
    Je rappelle que le fichier matrix.txt a cette forme:
    3 4
    1 2 3 4
    5 6 7 8
    9 0 1 2

    Voila le code:
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
     
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct {
    	int **element;
    	int nb_lignes;
    	int nb_colonnes;
    } matrix;
     
    void write_matrix(FILE *p,matrix *m) {
    	int i;
    	int j;
    	if (p==NULL) return; //ouverture du fichier matrice.txt impossible
    	fprintf(p,"%i%s%i\n",m->nb_lignes," ",m->nb_colonnes);
    	for (i=0; i<m->nb_lignes; i++) {
    		for (j=0; j<m->nb_colonnes; j++) {
    			fprintf(p,"%i%s",m->element[i][j]," ");
    		}
    		fprintf(p,"\n");
    	}
    }
     
    matrix * read_matrix(FILE *p) {
    	int i,j;
    	matrix *m;
    	m=(matrix *)malloc(sizeof(matrix));
    	printf("haha\n");
    	if (p==NULL) return; //ouverture en lecture impossible
    	fscanf(p,"%i%i",&m->nb_lignes,&m->nb_colonnes);
    	printf("%i\n",m->nb_lignes);
    	printf("%i\n",m->nb_colonnes);
    	m=allouer_matrice(m->nb_lignes,m->nb_colonnes);
    	printf("hehe\n");
    	for (i=0; i<m->nb_lignes; i++) {
    		for (j=0; j<m->nb_colonnes; j++) {
    			fscanf(p,"%i",m->element[i][j]);
    		}
    	}
    	printf("%i %i %i\n", m->nb_lignes, m->nb_colonnes, m->element[1][1]);
    	return m;
    }
     
    void affic_matrix(matrix *m) {
    	int i,j;
    	printf("Matrice de taille : %i * %i\n",m->nb_lignes,m->nb_colonnes);
    	for (i=0; i<m->nb_lignes; i++) {
    		for (j=0; i<m->nb_colonnes; j++){
    			printf("%i%s",m->element[i][j]," ");
    		}
    		printf("\n");
    	}
    }
     
     
    matrix * allouer_matrice(int nbli, int nbcol) {
    	matrix *m;
    	int i;
    	m=(matrix *)malloc(sizeof(matrix));
     
    	m->element=(int**)calloc(nbli,sizeof(int**));
    	for (i=0; i<nbcol; i++) {
    		m->element[i]=(int*)calloc(nbcol,sizeof(int*));
    	}
    	return m;
    }
     
    void remplir_matrice(matrix *m){
    	int i,j;
    	printf("Remplissage de matrice %dx%d\n",m->nb_lignes,m->nb_colonnes);
    	for(i=0;i<m->nb_lignes;i++){
    		for(j=0;j<m->nb_colonnes;j++){
    			printf("element (%d,%d)?",i,j);
    			scanf("%i",&(m->element[i][j]));
    		}
    	}
    }
     
    int main() {
    	matrix * m1;
    	FILE *fic;
    	m1=(matrix *)malloc(sizeof(matrix));
    	fic=fopen("matrix.txt","r");
    	if (fic!=NULL){
    		//printf("Nombre de lignes : ");
    		//scanf("%i",&m1->nb_lignes);
    		//printf("%i\n",m1->nb_lignes);
    		//printf("Nombre de colonnes : ");
    		//scanf("%i",&m1->nb_colonnes);
    		//printf("%i\n",m1->nb_colonnes);
    		//m1=allouer_matrice(m1->nb_lignes, m1->nb_colonnes);
    		//printf("%i\n",m1->nb_lignes);
    		//remplir_matrice(m1);
    		printf("huhu\n");
    		m1=read_matrix(fic);
    		printf("hoho\n");
    		printf("%i %i %i\n",m1->nb_lignes, m1->nb_colonnes, m1->element[1][1]);
    		//write_matrix(fic,m1);
    		//m=read_matrix(fic);
    		//affic_matrix(m);
    		return 0;
    	}
    }
    Encore merci pour votre aide.
    Vous inquietez pas si je met pleins de printf() plus ou moins bidons, mais il n'y a que comme ca que je vois mes erreurs.

  12. #12
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par TeKa
    J'indentes, mais sur le copier coller a tout casse... :/
    Si tu utilises les balises code, aucun problème. La preuve...
    Des corrections et des remarques...
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
     
    /* -ed-
       - reindentation
       - ajoute 'static' aux fonctions privees.
       - modifie' implantation pour respecter le principe :
     
       definir avant d'utiliser"
     
     */
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
       int **element;
       int nb_lignes;
       int nb_colonnes;
    }
    matrix;
     
    #define TRACE()\
       printf ("%s:%d\n", __FILE__, __LINE__);
     
    static matrix *allouer_matrice (int nbli, int nbcol)
    {
       /* -ed-
          matrix *m;
          m = (matrix *) malloc (sizeof (matrix));
     
          malloc() peut echouer...
          cast inutile.
     
          <a href="http://emmanuel-delahaye.developpez.com/notes.htm" target="_blank">http://emmanuel-delahaye.developpez.com/notes.htm</a>
     
        */
       matrix *m = malloc (sizeof *m);
     
       if (m != NULL)
       {
          /* -ed- enregistrer les tailles */
          m->nb_lignes = nbli;
          m->nb_colonnes = nbcol;
     
          /* -ed-
             m->element = (int **) calloc (nbli, sizeof (int **));
     
             calloc() peut echouer...
             fonction deconseillee (effet non portable)
             utiliser malloc()
           */
     
          m->element = malloc (nbli * sizeof *m->element);
     
          if (m->element)
          {
    /* -ed- deplace au titre de la reduction de la portee des objets */
             int i;
             for (i = 0; i < nbcol; i++)
             {
                /* -ed- pour l'initialisation */
                int j;
    /* -ed-
       m->element[i] = (int *) calloc (nbcol, sizeof (int *));
     */
                m->element[i] = malloc (nbcol * sizeof *m->element[i]);
     
     
                for (j = 0; j < m->nb_colonnes; j++)
                {
                   if (m->element[i] != NULL)
                   {
                      m->element[i][j] = 0;
                   }
                }
             }
     
          }
       }
       return m;
    }
     
    /* -ed- 'fp' est un nom usuel de pointeur FILE */
    static matrix *read_matrix (FILE * fp)
    {
    /* -ed-
       matrix *m;
       m = (matrix *) malloc (sizeof (matrix));
     
       NON! C'est 'allouer_matrice()' qui s'en charge...
     */
       matrix *m = NULL;
     
       if (fp != NULL)
       {
          /* -ed-
             printf ("haha\n");
     
             il y a plus efficace que ces traces debiles...
     
           */
          TRACE ();
     
    /* -ed-
       if (p == NULL)
       {
       return;                   //ouverture en lecture impossible
     
       le retour de la fonction est type'.
       Il faut donc retourner une valeur coherente.
       Disons NULL...
     
       Refonte du test. Passe en 'test sanitaire prealable'
     */
          int nb_lignes;
          int nb_colonnes;
    /* -ed-
       fscanf (p, "%i%i", &m->nb_lignes, &m->nb_colonnes);
     
       en principe on utilise pas fscanf(). Mais si tu le fais, fait le bien.
     
       suppression des refernces a m qui n'existe pas encore.
     */
          if (fscanf (fp, "%i%i", &nb_lignes, &nb_colonnes) == 2)
          {
     
             printf ("%i\n", nb_lignes);
             printf ("%i\n", nb_colonnes);
             {
                /* -ed- deplace la defintion de m... */
                m = allouer_matrice (nb_lignes, nb_colonnes);
     
                if (m != NULL)
                {
                   TRACE ();
    #if 1
                   int i;
                   for (i = 0; i < m->nb_lignes; i++)
                   {
                      int j;
                      for (j = 0; j < m->nb_colonnes; j++)
                      {
                         /* -ed- ajoute controle de lecture... */
                         int n = fscanf (fp, "%i", &m->element[i][j]);
     
                         if (n != 1)
                         {
                            printf ("read error\n");
                            break;
                         }
                      }
                   }
                   TRACE ();
                   printf ("%i %i %i\n", m->nb_lignes, m->nb_colonnes, m->element[1][1]);
    #endif
                }
             }
          }
       }
       return m;
    }
     
    static void affic_matrix (matrix * m)
    {
       int i, j;
       printf ("Matrice de taille : %i * %i\n", m->nb_lignes, m->nb_colonnes);
       for (i = 0; i < m->nb_lignes; i++)
       {
          /* -ed- j et non i... */
          for (j = 0; j < m->nb_colonnes; j++)
          {
             printf ("%i%s", m->element[i][j], " ");
          }
          printf ("\n");
       }
    }
     
    int main (void)
    {
    /* -ed-
       matrix *m1;
       m1 = (matrix *) malloc (sizeof (matrix));
     
       deja fait par read_matrix()
     */
     
       FILE *fic = fopen ("../../data/matrix.txt", "r");
     
       if (fic != NULL)
       {
          TRACE ();
          {
             matrix *m1 = read_matrix (fic);
     
             if (m1 != NULL)
             {
                TRACE ();
                printf ("%i %i\n", m1->nb_lignes, m1->nb_colonnes);
                affic_matrix (m1);
             }
          }
          /* -ed- tout fichier ouvert correctement doit etre referme */
     
          fclose (fic);
       }
       return 0;
    }
    Je te laisse ecrire le code de liberation...
    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
     
    ../main.c:204
    ../main.c:115
    3
    4
    ../main.c:148
    ../main.c:166
    3 4 6
    ../main.c:210
    3 4
    Matrice de taille : 3 * 4
    1 2 3 4
    5 6 7 8
    9 0 1 2
    SYSALLOC min=4294967295 max=4294967295 delta=0
    SYSALLOC Err: Not-matched list:
    SYSALLOC Bloc 008F0690 (12 bytes) malloc'ed at line 50 of '../main.c' not freed
    SYSALLOC Bloc 008F06A0 (12 bytes) malloc'ed at line 66 of '../main.c' not freed
    SYSALLOC Bloc 008F06B0 (16 bytes) malloc'ed at line 79 of '../main.c' not freed
    SYSALLOC Bloc 008F06C0 (16 bytes) malloc'ed at line 79 of '../main.c' not freed
    SYSALLOC Bloc 008F06D0 (16 bytes) malloc'ed at line 79 of '../main.c' not freed
    SYSALLOC Bloc 008F06E0 (16 bytes) malloc'ed at line 79 of '../main.c' not freed
    SYSALLOC Released Memory
    Pas de Wi-Fi à la maison : CPL

  13. #13
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par TeKa
    J'indentes, mais sur le copier coller a tout casse... :/
    Si tu utilises les balises code, aucun problème. La preuve...
    Des corrections et des remarques...
    Merci pour tout. Je vais repotasser ca et je vous tiens au courant pour la suite.

  14. #14
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    C'est encore moi.
    Emmanuel --> Bon, j'ai bien etudie le code que tu m'as fourni, et j'ai ete oblige de virer quelques trucs, notamment ceux que je ne connais pas du tout!
    Bref, j'ai continue mon exercice et je me retrouve avec un joli fichier .h desormais qui servira de librairie pour un autre fichier .c
    Et bien la encore la compilation ne marche pas! :/
    Je reposte les nouveaux fichiers...
    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
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
     
    //matrix_io.h
    #include <stdio.h>
    #include <stdlib.h>
     
    typedef struct
    {
       int **element;
       int nb_lignes;
       int nb_colonnes;
    } matrix;
     
    static matrix *allouer_matrice (int nbli, int nbcol) {
       matrix *m = malloc (sizeof *m);
     
       if (m != NULL) {
          m->nb_lignes = nbli;
          m->nb_colonnes = nbcol;
          m->element = malloc (nbli * sizeof *m->element);
          if (m->element) {
             int i;
             for (i = 0; i < nbcol; i++) {
                int j;
                m->element[i] = malloc (nbcol * sizeof *m->element[i]);
                for (j = 0; j < m->nb_colonnes; j++) {
                   if (m->element[i] != NULL) {
                      m->element[i][j] = 0;
                   }
                }
             }
     
          }
       }
       return m;
    }
     
    static matrix *read_matrix (FILE *fp) {
       matrix *m = NULL;
     
       if (fp != NULL) {
          int nb_lignes;
          int nb_colonnes;
          if (fscanf (fp, "%i%i", &nb_lignes, &nb_colonnes) == 2) {
             {
                m = allouer_matrice (nb_lignes, nb_colonnes);
                if (m != NULL) {
                   int i;
                   for (i = 0; i < m->nb_lignes; i++) {
                      int j;
                      for (j = 0; j < m->nb_colonnes; j++) {
                         int n = fscanf (fp, "%i", &m->element[i][j]);
                         if (n != 1) {
                            printf ("erreur de lecture\n");
                            break;
                         }
                      }
                   }
                }
             }
          }
       }
       return m;
    }
     
    static void affic_matrix (matrix * m) {
       int i, j;
       printf ("Matrice de taille : %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++) {
             printf ("%i%s", m->element[i][j], " ");
          }
          printf ("\n");
       }
    }
     
    static void write_matrix(FILE *fp,matrix *m) {
    	int i, j;
    	if (fp!=NULL){
    		fprintf(fp,"%i%s%i\n",m->nb_lignes," ",m->nb_colonnes);
    		for (i=0; i<m->nb_lignes; i++) {
    			for (j=0; j<m->nb_colonnes; j++) {
    				fprintf(fp,"%i%s",m->element[i][j]," ");
    			}
    			fprintf(fp,"\n");
    		}
    	}
    }
     
    void remplir_matrice(matrix *m){
    	int i,j;
    	printf("Remplissage de matrice %dx%d\n",m->nb_lignes,m->nb_colonnes);
    	for(i=0;i<m->nb_lignes;i++){
    		for(j=0;j<m->nb_colonnes;j++){
    			printf("element (%d,%d)? ",i,j);
    			scanf("%i",&(m->element[i][j]));
    		}
    	}
    }
    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
     
    //main.c
    #include <stdio.h>
    #include <stdlib.h>
    #include "matrix_io.h"
     
    int main(void) {
    	int choix;
    	printf("Que voulez-vous faire?\n");
    	printf("1 - Ecrire une matrice dans un fichier.\n");
    	printf("2 - Lire une matrice depuis un fichier.\n");
    	int n = scanf("%i",choix);
    	if (n == 1) {
    		if (choix==1) {
    			FILE *fp = fopen ("matrix.txt", "w");
    			if (fp != NULL) {
    				matrix *m1 = remplir_matrice(m1);
    				write_matrix(fp, m1);
    			}
    			fclose (fp);
    		}
    		else if (choix == 2) {
    			FILE *fp = fopen ("matrix.txt", "r");
    			if (fp != NULL) {
    				matrix *m1 = read_matrix (fp);
    				if (m1 != NULL) {
    					affic_matrix (m1);
    				}
    			}
    			fclose (fp);
    		}
    		else {
    			printf("Choisir 1 ou 2.\n");
    		}
    	}
    	return 0;
    }
    Je me suis bien inspire de ta correction pour eviter de faire des erreurs dans mon main.c.

    Encore merci pour votre aide a tous.

  15. #15
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par TeKa
    Bref, j'ai continue mon exercice et je me retrouve avec un joli fichier .h
    desormais qui servira de librairie pour un autre fichier .c
    Eeek! Non!

    A lire et à assimiler avant d'aller plus loin :

    http://emmanuel-delahaye.developpez....m#bibliotheque
    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser

    Maintenant, je veux voir 3 fichiers.
    Pas de Wi-Fi à la maison : CPL

  16. #16
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par TeKa
    Bref, j'ai continue mon exercice et je me retrouve avec un joli fichier .h
    desormais qui servira de librairie pour un autre fichier .c
    Eeek! Non!
    A lire et à assimiler avant d'aller plus loin.

    http://emmanuel-delahaye.developpez....m#bibliotheque
    http://emmanuel-delahaye.developpez....ganiser_source
    http://emmanuel-delahaye.developpez.....htm#organiser

    Maintenant, je veux voir 3 fichiers.
    Euh... On oublie le .h alors. Dans mon enonce en fait il fallait faire un matrix_io.c et le compiler avec le main.c, mais des potes avaient choisis de faire un .h, soi disant plus simple...
    On va dire que le .h est un .c en fait!

  17. #17
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par TeKa
    Euh... On oublie le .h alors. Dans mon enonce en fait il fallait faire un matrix_io.c et le compiler avec le main.c, mais des potes avaient choisis de faire un .h, soi disant plus simple...
    On va dire que le .h est un .c en fait!
    Ben non, On n'inclus pas un .c dans un .c. Apprends à coder correctement tout de suite. Ca mord pas.

    Un .h (interface)
    Un .c (implementation)
    Un .c (application)

    C'est pas compliqué et ça permet d'organiser son code de manière efficace immédiatement.
    Pas de Wi-Fi à la maison : CPL

  18. #18
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par TeKa
    Euh... On oublie le .h alors. Dans mon enonce en fait il fallait faire un matrix_io.c et le compiler avec le main.c, mais des potes avaient choisis de faire un .h, soi disant plus simple...
    On va dire que le .h est un .c en fait!
    Ben non, On n'inclus pas un .c dans un .c. Apprends à coder correctement tout de suite. Ca mord pas.

    Un .h (interface)
    Un .c (implementation)
    Un .c (application)

    C'est pas compliqué et ça permet d'organiser son code de manière efficace immédiatement.
    J'ai pas dit qu'on incluait! On vire la ligne fautive du main.c (#include "matrix_io.h") et on compile les 2 fichiers ensemble...

  19. #19
    Expert éminent sénior
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Points : 20 985
    Points
    20 985
    Par défaut
    Citation Envoyé par TeKa
    J'ai pas dit qu'on incluait! On vire la ligne fautive du main.c (#include "matrix_io.h") et on compile les 2 fichiers ensemble...
    Ensemble ? Un seul fichier (fusion des deux) ou 2 fichiers séparés ? Dans le deuxième cas, il faut ,un .h pour fournir les interfaces...

    Dans le premier cas, c'est reculer pour mieux sauter. un jour ou l'autre tu devras apprendre à utiliser la compilation séparée, seule façon d'écrire du code réutuilisable, maintenable, testable unitairement, bref, professionel...
    Pas de Wi-Fi à la maison : CPL

  20. #20
    Futur Membre du Club
    Profil pro
    Inscrit en
    Novembre 2005
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2005
    Messages : 18
    Points : 6
    Points
    6
    Par défaut
    Citation Envoyé par Emmanuel Delahaye
    Citation Envoyé par TeKa
    J'ai pas dit qu'on incluait! On vire la ligne fautive du main.c (#include "matrix_io.h") et on compile les 2 fichiers ensemble...
    Ensemble ? Un seul fichier (fusion des deux) ou 2 fichiers séparés ? Dans le deuxième cas, il faut ,un .h pour fournir les interfaces...

    Dans le premier cas, c'est reculer pour mieux sauter. un jour ou l'autre tu devras apprendre à utiliser la compilation séparée, seule façon d'écrire du code réutuilisable, maintenable, testable unitairement, bref, professionel...
    Je veux faire un 'gcc -o prog matrix_io.c main.c'.
    Et pour le reste, je m'en tiens a ce que le prof m'apprend et ce qu'il me demande... Pas la peine de vouloir aller trop vite.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Manipulation de matrices
    Par bernard6 dans le forum MATLAB
    Réponses: 8
    Dernier message: 07/08/2007, 14h46
  2. [Débutant] Manipulation de matrices
    Par MireilleC dans le forum MATLAB
    Réponses: 3
    Dernier message: 04/08/2007, 12h12
  3. manipulation des matrices sous SSRS
    Par linram dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 09/07/2007, 12h31
  4. [Manipulation de matrices] Elements adjacents
    Par Opérateur dans le forum Algorithmes et structures de données
    Réponses: 8
    Dernier message: 25/11/2006, 11h30
  5. Fonctions manipulant des matrices
    Par panda31 dans le forum C
    Réponses: 24
    Dernier message: 14/06/2006, 10h28

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