Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2492 connectés 

  FORUM HardWare.fr
  Programmation
  C

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1076232
sam15
Posté le 09-05-2005 à 13:20:58  profilanswer
 

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

mood
Publicité
Posté le 09-05-2005 à 13:20:58  profilanswer
 

n°1076235
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 09-05-2005 à 13:24:53  profilanswer
 

sam15 a écrit :


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


 [:alfone]


---------------
J'ai un string dans l'array (Paris Hilton)
n°1076236
sam15
Posté le 09-05-2005 à 13:26:41  profilanswer
 

pas compris !
désolée!

n°1076246
Harkonnen
Modérateur
Un modo pour les bannir tous
Posté le 09-05-2005 à 13:33:59  profilanswer
 

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)
n°1076247
Tarabiscot​e
Posté le 09-05-2005 à 13:34:38  profilanswer
 

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
n°1076252
sam15
Posté le 09-05-2005 à 13:37:44  profilanswer
 

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 .  

n°1076257
Tarabiscot​e
Posté le 09-05-2005 à 13:41:18  profilanswer
 

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
n°1076262
sam15
Posté le 09-05-2005 à 13:45:40  profilanswer
 

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.  

n°1076266
sam15
Posté le 09-05-2005 à 13:48:30  profilanswer
 

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 !

n°1076273
Tarabiscot​e
Posté le 09-05-2005 à 13:55:13  profilanswer
 

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
mood
Publicité
Posté le 09-05-2005 à 13:55:13  profilanswer
 

n°1076285
++fab
victime du syndrome IH
Posté le 09-05-2005 à 13:59:05  profilanswer
 

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 ?

n°1076305
sam15
Posté le 09-05-2005 à 14:05:31  profilanswer
 

++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 ;

n°1076383
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-05-2005 à 14:49:34  profilanswer
 

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/
n°1076488
++fab
victime du syndrome IH
Posté le 09-05-2005 à 15:45:26  profilanswer
 

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

n°1076490
Emmanuel D​elahaye
C is a sharp tool
Posté le 09-05-2005 à 15:46:15  profilanswer
 

++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/

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

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

 

Sujets relatifs
problème de threadsproblème avec l'envoi de mail : caractères mangés
Problème avec un caddie (ajouter un article déjà dedans) [Résolu]Probleme de blocage d'appli avec IDFTP
Problème de positionnement de graphiqueProbleme avec l'interface MouseListener
Problème avec requète sur 2 champs ...[Jcreator] problème bizarre ....
Probleme de fichier jar avec jmf[c++] template -> sujet d'examen 2004 (problème de compréhension)
Plus de sujets relatifs à : un problème d'adressage! (enfin!peut etre )


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR