un problème d'adressage! (enfin!peut etre )

un problème d'adressage! (enfin!peut etre ) - C - Programmation

Marsh Posté le 09-05-2005 à 13:20:58    

onjour tout le monde
voilà je vous passe une petite procédure permettant de calculé limage d'un vecteur par une matrice(Y=mat*X) :
void image_vect(matrice mat,double *x,double **y){
int i;
*y=malloc(3*sizeof(double));
int j;
for(i=0;i<3;i++)
    {
      for(j=0;j<3;j++){
 *(y[i]) =*(y[i])+ mat[i][j]*x[j];
 
 }
     }
 
 }
  ......> c'est sensé remplir le vecteur ("le tableau" ) Y à partir d'une matrice mat  et un vecteur X donnés.  
et voiçi mon main :
 
int main (){
  int i;  
  matrice mat;
  double *x;
  double *y;
  x=malloc(sizeof(double));
     y=malloc(sizeof(double));
  *x=2;
  *(x+1)=2;
  *(x+2)=9;
 
   
  mat= malloc( sizeof(double *) *3 );
 
  for(i = 0;i < 4;i++)
    {
      mat[i] = malloc( sizeof(double) *3 );
    }
 
  mat[0][0]=4;
  mat[0][1]=0;
  mat[0][2]=0;
  mat[1][0]=0;
  mat[1][1]=1;
  mat[1][2]=0;
  mat[2][0]=0;
  mat[2][1]=0;
  mat[2][2]=2;
   
al_prod_mat_vect(mat,x,&y);
 
 
 printf("les cordonnées de l'image sont %f %f  %f",*y,y[1],y[2]);
 
 
 
  return EXIT_SUCCESS;
}
MAIS  malheureusement  en sortant de la procédure le vecteur y n'est pas le bon! sachant qu'il est bien calculé à l'intérieur de la procédure . c'est probablement un problème d'adressage. :whistle:  
Vous en pensez quoi ?
MERCI

Reply

Marsh Posté le 09-05-2005 à 13:20:58   

Reply

Marsh Posté le 09-05-2005 à 13:24:53    

sam15 a écrit :


*y=malloc(3*sizeof(double));


 [:alfone]


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 09-05-2005 à 13:26:41    

pas compris !
désolée!

Reply

Marsh Posté le 09-05-2005 à 13:33:59    

as tu lu l'explication d'Emmanuel Delahaye à propos de l'allocation de tableaux de pointeurs ? en plus, c'est toi qui avait ouvert le topic !
http://forum.hardware.fr/forum2.ph [...] ash_post=0


---------------
J'ai un string dans l'array (Paris Hilton)
Reply

Marsh Posté le 09-05-2005 à 13:34:38    

Je dirais (*y)[i] à la place de *(y[i]).
 
PS : Harkonnen : Je ne pense pas que ce soit un tableau à 2D ici, mais il passe juste un double pointeur pour modifier le pointeur de la fonction appelante.


Message édité par Tarabiscote le 09-05-2005 à 13:38:27
Reply

Marsh Posté le 09-05-2005 à 13:37:44    

oui mais là c pas un problème d'allocation de mémoire mais de passage par adresse ! mon vecteur Y de main ne se remplit pas après ma procédure .  

Reply

Marsh Posté le 09-05-2005 à 13:41:18    

Par contre je comprend pas la ligne la :
 
y=malloc(sizeof(double));
 
dans le main car le malloc doit être fait dans la fonction.
 
En plus la fonction "image_vect" n'est même pas appelée...


Message édité par Tarabiscote le 09-05-2005 à 13:43:58
Reply

Marsh Posté le 09-05-2005 à 13:45:40    

j'ai essayé ce que t'as dit "tarabiscote" (merci).
mais bizarrement, juste la première coordonnée est transmise au vecteur  y du main.  

Reply

Marsh Posté le 09-05-2005 à 13:48:30    

c'est juste que j'ai fait copier coller à 2 instants différents (entre temps j'ai changé les nom en fait dans  le main c
image_vect(mat,x,&y)au lieu al_prod_mat_vect(mat,x,&y)) dc j'appelle bien la procédure au dessus !

Reply

Marsh Posté le 09-05-2005 à 13:55:13    

Tu peux modifier ce que t'as fait dans le 1er post et en profiter pour mettre les balises [fixed] ?
 
PS :
*(y[i]) =*(y[i])+ mat[i][j]*x[j];
après correction ->
(*y)[i] =(*y)[i]+ mat[i][j]*x[j];
 
(*y)[i] n'est pas initialisé donc la valeur sera totalement arbitraire.


Message édité par Tarabiscote le 09-05-2005 à 13:59:12
Reply

Marsh Posté le 09-05-2005 à 13:55:13   

Reply

Marsh Posté le 09-05-2005 à 13:59:05    

1- met le code entre les balises.
2- Chercher l'erreur ...

Code :
  1. x=malloc(sizeof(double));
  2.    *x=2;
  3.    *(x+1)=2;
  4.    *(x+2)=9;


3- Chercher les erreurs :

Code :
  1. mat= malloc( sizeof(double *) *3 );
  2.   for(i = 0;i < 4;i++) //4 ?
  3.     {
  4.       mat[i] = malloc( sizeof(double) *3 );
  5.     }


matrice, c'est quoi ?

Reply

Marsh Posté le 09-05-2005 à 14:05:31    

++fab a écrit :

1- met le code entre les balises.
2- Chercher l'erreur ...

Code :
  1. x=malloc(sizeof(double));
  2.    *x=2;
  3.    *(x+1)=2;
  4.    *(x+2)=9;


3- Chercher les erreurs :

Code :
  1. mat= malloc( sizeof(double *) *3 );
  2.   for(i = 0;i < 4;i++) //4 ?
  3.     {
  4.       mat[i] = malloc( sizeof(double) *3 );
  5.     }


matrice, c'est quoi ?


 
 
c'est un type que j'ai déja défini :
typedef double **matrice ;

Reply

Marsh Posté le 09-05-2005 à 14:49:34    

sam15 a écrit :

onjour tout le monde
voilà je vous passe une petite procédure permettant de calculé limage d'un vecteur par une matrice(Y=mat*X) :
<...>
MAIS  malheureusement  en sortant de la procédure le vecteur y n'est pas le bon! sachant qu'il est bien calculé à l'intérieur de la procédure . c'est probablement un problème d'adressage. :whistle:  
Vous en pensez quoi ?


Un peu plus de rigueur et de simplicite dans le codage permet d'améliorer la qualité du code et de trouver les bugs.
 
http://mapage.noos.fr/emdel/notes.htm#malloc
http://mapage.noos.fr/emdel/notes.htm#portee
 
edit: Mise au point


typedef double **matrice;
#define N 3
 
void al_prod_mat_vect (matrice const mat, double const *x, double **py)
{
   double *y = malloc (N * sizeof *y);
 
   if (y != NULL)
   {
      int i;
 
      for (i = 0; i < N; i++)
      {
         y[i] = 0;
      }
 
      for (i = 0; i < N; i++)
      {
         int j;
 
         for (j = 0; j < N; j++)
         {
            y[i] = y[i] + mat[i][j] * x[j];
         }
      }
 
      if (py != NULL)
      {
         *py = y;
      }
   }
}
 
int main (void)
{
   double *x = malloc (sizeof *x * N);
 
   if (x != NULL)
   {
      x[0] = 2;
      x[1] = 2;
      x[2] = 9;
      {
         matrice mat = malloc (sizeof *mat * N);
 
         if (mat != NULL)
         {
            int err;
            int i;
             
            for (i = 0; i < N; i++)
            {
               mat[i] = malloc (sizeof *mat[i] * N);
               err = mat[i] == NULL;
            }
 
            if (!err)
            {
               mat[0][0] = 4;
               mat[0][1] = 0;
               mat[0][2] = 0;
 
               mat[1][0] = 0;
               mat[1][1] = 1;
               mat[1][2] = 0;
 
               mat[2][0] = 0;
               mat[2][1] = 0;
               mat[2][2] = 2;
 
               {
                  double *y;
                  al_prod_mat_vect (mat, x, &y);
 
                  if (y != NULL)
                  {
                     printf ("les coordonnees de l'image sont (%.2f, %.2f, %.2f)\n"
                     , y[0]
                     , y[1]
                     , y[2]);
                     
                     free (y), y = NULL;
                  }
               }
            }
             
            for (i = 0; i < N; i++)
            {
               free (mat[i]), mat[i] = NULL;
            }
            free (mat), mat = NULL;
         }
      }
      free (x), x = NULL;
   }
   return 0;
}


Mais si cette taille '3' est fixe, pourquoi utiliser de l'allocation dynamique ?


Message édité par Emmanuel Delahaye le 09-05-2005 à 15:45:36

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 09-05-2005 à 15:45:26    

for (i = 0; i < 3; i++) il me semble  :)

Reply

Marsh Posté le 09-05-2005 à 15:46:15    

++fab a écrit :

for (i = 0; i < 3; i++) il me semble  :)


Roasted!
 


---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Sujets relatifs:

Leave a Replay

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