[C] [resolu] lecture matrice alloué dynamiquement

lecture matrice alloué dynamiquement [C] [resolu] - C - Programmation

Marsh Posté le 12-11-2009 à 12:35:45    

Salut à tous!
 
j'arrive pas lire à lire ma matrice.
 
Résumé:
trois fonctions:
 
lecturematr => lit la matrice depuis un fichier texte de la forme et retourne la taille
 
3
1.0 2.0 3.0
4.0 5.0 6.0
7.0 8.0 9.0
 
affichagematr => affiche la matrice (celle qui marche pas)
 
et le main
 
ps: il y a des trucs inutles a l'interieur, c'est parce que seul une partie du code marche pas
mon compilateur me fait la gueule et m'aime pas  :bounce:  (meme si la plus grande source d'erreur en informatique se situe entre la chaise et le clavier  :sol: )
voici le code:
 

Code :
  1. int lecturematr(char * nom, double ** matr)
  2. {
  3.     double val, * cour1, * cour2;
  4.     int i, taille, j,cpt;
  5.     FILE * fic;
  6.     fic = fopen(nom,"r" );
  7.     if ( fic != NULL)
  8.     {
  9.         fscanf(fic, "%d",&taille);
  10.         matr = malloc (sizeof(double *) * taille );
  11.         for (cpt = 0; cpt < taille;cpt++)
  12.         {
  13.             matr[cpt] = calloc ( taille, sizeof(double));
  14.             for (i = 0; i < taille;i++)
  15.             {
  16.                 fscanf(fic,"%lf",&matr[cpt][i]);
  17.                 printf("%f   ", matr[cpt][i]);
  18.             }
  19.             printf("\n" );
  20.         }
  21.     }
  22.     else
  23.     {
  24.         printf("erreur ouverture" );
  25.     }
  26.     return taille;
  27. }
  28. void affichagematr(int taille, double * matr)
  29. {
  30.     int i, j;
  31.     for (i=0; i < taille; i++)
  32.     {
  33.         for (j=0 ; j < taille ; j++)
  34.         {
  35.             printf("%10.4f\n", *(matr + i * taille + j));
  36.         }
  37.         printf("\n\n" );
  38.     }
  39. }
  40. int main(int argc, char * argv[])
  41. {
  42.     /*char * nomfic1 = argv[1], * nomfic2 = argv[2], * nomfic3 = argv[3], * nomfic4 = argv[4];*/
  43.     char * nomfic1 = "vecteur1.txt", * nomfic2="vecteur2.txt", * nomfic3= "matr.txt";
  44.     double * tab1, * tab2, ** matr;
  45.     int taille, psc;
  46.     /* **************************************************************** */
  47.     //                             PARTIE 2                            //
  48.     /* **************************************************************** */
  49.     printf("\n PARTIE 2 \n" );
  50.     taille = lecturematr(nomfic3, matr);
  51.     printf("\nla taille de la matrice est: %d\n", taille);
  52.     affichagematr(taille, *matr);
  53.     return 0;
  54. }


 
merci d'avance


Message édité par karlakir le 13-11-2009 à 20:10:52

---------------
Si vous avez rien à faire, cliquez ici:
Reply

Marsh Posté le 12-11-2009 à 12:35:45   

Reply

Marsh Posté le 12-11-2009 à 12:57:29    

les messages du compilos svp

Reply

Marsh Posté le 12-11-2009 à 13:07:32    

Ta matrice n'étant pas allouée de manière contigüe, ton affichage ne peut pas fonctionner.
*(matr + i * taille + j) est faux;
Il faut écrire matr[i][j].
La signature de la fonction doit être void affichagematr(int taille, double ** matr) et tu dois écrire affichagematr(taille, matr);


Message édité par Trap D le 12-11-2009 à 13:09:40
Reply

Marsh Posté le 12-11-2009 à 14:48:19    

Re, merci pour votre aide mais j'ai toujours une erreur;
j'ai corrigé comme conseillé mais il ne veut toujours pas afficher la matrice :  
 
(bug avec la ligne:             printf("%10.4f\n", matr[i][j]);  avant tout marche)
meme si je la met dans le main (par exemple printf("%f   ", matr[0][0]); ca ne marche  :kaola: )
 
 
J'ai inséré les bibliotheques: "stdio" et "stdlib";
Je n'ai aucune erreur a la compilation;
j'utilise codeblocks;
 
lors du bug, j'ai le message vista classique: "tp3.exe a cessé de fonctionner ..."
 
merci d'avance!
code corrigé avec les bibliothques

Code :
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. //void affichage(double * tab);
  4. void affichagematr(int taille, double ** matr);
  5. int lecturematr(char * nom, double ** matr);
  6. //void lecturevect(double ** tab, char * nom);
  7. //double prod_scal( double * vect1, double * vect2);
  8. int lecturematr(char * nom, double ** matr)
  9. {
  10.     double val, * cour1, * cour2;
  11.     int i, taille, j,cpt;
  12.     FILE * fic;
  13.     fic = fopen(nom,"r" );
  14.     if ( fic != NULL)
  15.     {
  16.         fscanf(fic, "%d",&taille);
  17.         matr = malloc (sizeof(double *) * taille );
  18.         for (cpt = 0; cpt < taille;cpt++)
  19.         {
  20.             matr[cpt] = calloc ( taille, sizeof(double));
  21.             for (i = 0; i < taille;i++)
  22.             {
  23.                 fscanf(fic,"%lf", &matr[cpt][i]);
  24.                 printf("%f   ", matr[cpt][i]);
  25.             }
  26.             printf("\n" );
  27.         }
  28.     }
  29.     else
  30.     {
  31.         printf("erreur ouverture" );
  32.     }
  33.     return taille;
  34. }
  35. void affichagematr(int taille, double ** matr)
  36. {
  37.     int i, j;
  38.     for (i=0; i < taille; i++)
  39.     {
  40.         for (j=0 ; j < taille ; j++)
  41.         {
  42.             printf("%10.4f\n", matr[i][j]);
  43.         }
  44.         printf("\n\n" );
  45.     }
  46. }
  47. int main(int argc, char * argv[])
  48. {
  49.     /*char * nomfic1 = argv[1], * nomfic2 = argv[2], * nomfic3 = argv[3], * nomfic4 = argv[4];*/
  50.     char * nomfic1 = "vecteur1.txt", * nomfic2="vecteur2.txt", * nomfic3= "matr.txt";
  51.     double * tab1, * tab2, ** matr;
  52.     int taille, psc;
  53.     /* **************************************************************** */
  54.     //                             PARTIE 1                              //
  55.     /* **************************************************************** */
  56.     /*
  57.     printf(" PARTIE 1 \n" );
  58.     lecturevect(&tab1, nomfic1);
  59.     lecturevect(&tab2, nomfic2);
  60.     affichage(tab1);
  61.     affichage(tab2);
  62.     psc = prod_scal(tab1,tab2);
  63.     */
  64.     /* **************************************************************** */
  65.     //                             PARTIE 2                            //
  66.     /* **************************************************************** */
  67.     printf("\n PARTIE 2 \n" );
  68.     taille = lecturematr(nomfic3, matr);
  69.     printf("\nla taille de la matrice est: %d\n", taille);
  70.     affichagematr(taille, matr);
  71.     return 0;
  72. }


Message édité par karlakir le 12-11-2009 à 14:48:44

---------------
Si vous avez rien à faire, cliquez ici:
Reply

Marsh Posté le 12-11-2009 à 16:46:22    

Oui, je viens de tester chez moi, il faut passer l'adresse de matr à int lecturematr(char * nom, double ** matr) pour que les modifs sur matr soient effectives dans le main.
La signature de lecturematr est int lecturematr(char * nom, double *** matr)
Aprrès c'est un joli exercice sur les pointeurs !


Message édité par Trap D le 12-11-2009 à 16:47:39
Reply

Marsh Posté le 12-11-2009 à 17:31:16    

<hs> sauf que paye ta méthode d'allocation moisie des matrix 2D :/ </hs>

Reply

Marsh Posté le 12-11-2009 à 21:01:15    

d'accord avec toi, je trouve ca pourri mais mes profs me laissent pas le choix :D

 

sinon j'ai bien fait comme tu as dis

 

int lecture(..., *** matr)
puis appel avec: lecturematr(nomfic3, &matr) mais ca bug encore
"euh...hmm.. vous voyez?"  :sol:

 

desolé

 

si quelqu'un voie ou est l'erreur (a part moi faisant du C :) )

 

merci d'avance

 

lecture matr modifié:

 
Code :
  1. int lecturematr(char * nom, double *** adrmatr)
  2. {
  3.     double val;
  4.     int i, taille,cpt;
  5.     FILE * fic;
  6.     fic = fopen(nom,"r" );
  7.     if ( fic != NULL)
  8.     {
  9.         fscanf(fic, "%d",&taille);
  10.         (*adrmatr) = malloc (sizeof(double *) * taille );
  11.         for (cpt = 0; cpt < taille;cpt++)
  12.         {
  13.             *adrmatr[cpt] = calloc ( taille, sizeof(double));
  14.             for (i = 0; i < taille;i++)
  15.             {
  16.                 fscanf(fic,"%lf", adrmatr[cpt][i]);
  17.                 printf("%f   ", *adrmatr[cpt][i]);
  18.             }
  19.             printf("\n" );
  20.         }
  21.     }
  22.     else
  23.     {
  24.         printf("erreur ouverture" );
  25.     }
  26.     return taille;
  27. }


Message édité par karlakir le 12-11-2009 à 21:09:37

---------------
Si vous avez rien à faire, cliquez ici:
Reply

Marsh Posté le 12-11-2009 à 21:19:24    

Je dirais là, les [] ont priorité sur * :
 

Code :
  1. (*adrmatr)[cpt] = calloc (taille, sizeof(double));


Reply

Marsh Posté le 12-11-2009 à 21:24:30    

J'ai modifié les deux lignes comme tu l'as dit mais ca marche toujours pas (j'ai même réussi a faire bugger codeblocks)
 
(*adrmatr)[cpt] = calloc ( taille, sizeof(double));
...
printf("%f   ", (*adrmatr)[cpt][i]);
 
snif!
 
merci pour vos aides, ca avance!


---------------
Si vous avez rien à faire, cliquez ici:
Reply

Marsh Posté le 12-11-2009 à 22:15:36    

On t'a dit que les [] ont priorité sur *, il faut corriger partout.

Reply

Marsh Posté le 12-11-2009 à 22:15:36   

Reply

Marsh Posté le 13-11-2009 à 13:50:23    

je l'ai fait partout :D
 
mais c'est bon normalement, j'ai fait tout le reste de mon tp, j'ai plus que c eprobleme la et j'ai cours dans 1h, je verrais avec le prof et posterais la code final
 
merci pour vos aides, j'ai réappris pas mal de chose sur les pointeurs!


---------------
Si vous avez rien à faire, cliquez ici:
Reply

Marsh Posté le 13-11-2009 à 20:10:35    

ben en fait ca marche sur unix!
 
donc le code est le meme avec les parentheses
 
(par contre: ca marche pas sur codeblocks, bizarre)


---------------
Si vous avez rien à faire, cliquez ici:
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed