Allocation de matrice 3D pondérée

Allocation de matrice 3D pondérée - C - Programmation

Marsh Posté le 03-08-2009 à 16:42:55    

Bonjour

 

N'étant pas un expert en C  :sweat: , j'aimerai vous demander s'il n'y a pas de fautes dans le code suivant.
Pour faire simple j'ai un ensemble de points dans un espace 3D (x,y,z), et chacun possède un poids.
J'ai donc crée les structures qui me semblaient logiques dans le fichier structure.h:

  • Point3D
  • PointPondere
  • MatricePondere


Code :
  1. /** Point dans un referentiel 3D (x,y,z)   */
  2. typedef struct Point3D
  3. {
  4.   double dX;
  5.   double dY;
  6.   double dZ;
  7. }
  8. Point3D;
  9. /**un point 3D a qui l'on associe un poids */
  10. typedef struct PointPondere
  11. {
  12.     Point3D sLocalisation3D;
  13.     float fPoids;
  14. }PointPondere;
  15. /** Une matrice3D dont chaque point est pondéré.      */
  16. typedef struct Matrice3DPondere
  17. {
  18.     int iMaximumX, iMaximumY, iMaximumZ;
  19.     PointPondere ***matrice3D;
  20. }Matrice3DPondere;
 

Maintenant dans mon programme je dois allouer la place pour la matrice, afin de la remplir avec des point3D (enfin si je dis pas de bétises ;) ) Donc dans mon main.c j'ai ce bout de code : Ai-je raison ou bien tort?

 
Code :
  1. void Remplissagematrice(FILE *resultats,Matrice3DPondere *matrice){
  2.    int i, j, iMaxX, iMaxY, iMaxZ;
  3.    (...)
  4.     matrice->iMaximumX=iMaxX;
  5.     matrice->iMaximumY=iMaxY;
  6.     matrice->iMaximumZ=iMaxZ;
  7.     matrice->matrice3D = malloc( iMaxX * sizeof(PointPondere ***));
  8.     for( i = 0 ; i < matrice->iMaximumX ; i++ ){
  9.          matrice->matrice3D[i] = (PointPondere***)malloc (sizeof(PointPondere **)*matrice->iMaximumY);
  10.     }
  11.     for( i = 0 ; i < matrice->iMaximumX ; i++ ){
  12.         for( j = 0 ; j < matrice->iMaximumY ; j++ ){
  13.          matrice->matrice3D[i][j] =(PointPondere**) malloc (sizeof(PointPondere *)*matrice->iMaximumZ);
  14.         }
  15.     }
  16. }
 

Merci beaucoup de m'aider à faire ce code propre!

Message cité 1 fois
Message édité par Duc_onlajoy le 03-08-2009 à 17:30:58
Reply

Marsh Posté le 03-08-2009 à 16:42:55   

Reply

Marsh Posté le 03-08-2009 à 21:31:11    

Duc_onlajoy a écrit :

Bonjour
 
N'étant pas un expert en C  :sweat: , j'aimerai vous demander s'il n'y a pas de fautes dans le code suivant.
Pour faire simple j'ai un ensemble de points dans un espace 3D (x,y,z), et chacun possède un poids.
J'ai donc crée les structures qui me semblaient logiques dans le fichier structure.h:  

  • Point3D
  • PointPondere
  • MatricePondere


Code :
  1. /** Point dans un referentiel 3D (x,y,z)   */
  2. typedef struct Point3D
  3. {
  4.   double dX;
  5.   double dY;
  6.   double dZ;
  7. }
  8. Point3D;
  9. /**un point 3D a qui l'on associe un poids */
  10. typedef struct PointPondere
  11. {
  12.     Point3D sLocalisation3D;
  13.     float fPoids;
  14. }PointPondere;
  15. /** Une matrice3D dont chaque point est pondéré.      */
  16. typedef struct Matrice3DPondere
  17. {
  18.     int iMaximumX, iMaximumY, iMaximumZ;
  19.     PointPondere ***matrice3D;
  20. }Matrice3DPondere;


 
Maintenant dans mon programme je dois allouer la place pour la matrice, afin de la remplir avec des point3D (enfin si je dis pas de bétises ;) ) Donc dans mon main.c j'ai ce bout de code : Ai-je raison ou bien tort?
 

Code :
  1. void Remplissagematrice(FILE *resultats,Matrice3DPondere *matrice){
  2.    int i, j, iMaxX, iMaxY, iMaxZ;
  3.    (...)
  4.     matrice->iMaximumX=iMaxX;
  5.     matrice->iMaximumY=iMaxY;
  6.     matrice->iMaximumZ=iMaxZ;
  7.     matrice->matrice3D = malloc( iMaxX * sizeof(PointPondere ***));
  8.     for( i = 0 ; i < matrice->iMaximumX ; i++ ){
  9.          matrice->matrice3D[i] = (PointPondere***)malloc (sizeof(PointPondere **)*matrice->iMaximumY);
  10.     }
  11.     for( i = 0 ; i < matrice->iMaximumX ; i++ ){
  12.         for( j = 0 ; j < matrice->iMaximumY ; j++ ){
  13.          matrice->matrice3D[i][j] =(PointPondere**) malloc (sizeof(PointPondere *)*matrice->iMaximumZ);
  14.         }
  15.     }
  16. }


 
Merci beaucoup de m'aider à faire ce code propre!


 
Bon, déjà 2 remarques de base
1) perso je nomme toujours mes types "t_qqchose". Ca me permet de distinguer facilement type et variables et garder le token "qqchose" pour mes noms de variables
Donc tes types pourraient être

Code :
  1. typedef struct {
  2.   double dX;
  3.   double dY;
  4.   double dZ;
  5. } t_point3D
  6. typedef struct {
  7.   t_point3D sLocalisation3D;
  8.   float fPoids;
  9. } t_pointPondere;
  10. typedef struct {
  11.     int iMaximumX, iMaximumY, iMaximumZ;
  12.     t_pointPondere ***matrice3D;
  13. }t_matrice3DPondere;


 
 
2) ensuite, étant donné que le poids est lié au point, tu peux l'inclure dans le type "t_point3D" mais bon, cette remarque est à prendre avec recul vu que je ne connais pas ton besoin. Peut-être que pour toi c'est utile de distinguer un type "t_point3D" d'un type "t_pointPondere" (si par exemple t'utilises par ailleurs des points non pondérés...)
 
Sinon, pour en revenir à ta question principale, ton allocation est ratée. Tu as fait 2 boucles parallèles alors qu'il aurait fallu faire 3 boucles imbriquées. D'ailleurs t'aurais dû t'en rendre compte en réfléchissant à ce qu'est une matrice
- un tableau 3D contenant X tableaux 2D
- chaque tableau des X tableaux 2D contient Y tableaux 1D
- chaque tableau des Y tableaux 1D contient Z points pondérés
 
Ce qui donne
 

Code :
  1. void Remplissagematrice(FILE *resultats, t_matrice3DPondere *matrice){
  2.    int i, j, iMaxX, iMaxY, iMaxZ;
  3.    (...)
  4.     matrice->iMaximumX=iMaxX;
  5.     matrice->iMaximumY=iMaxY;
  6.     matrice->iMaximumZ=iMaxZ;
  7.     matrice->matrice3D=(t_pointPondere ***)malloc(sizeof(t_pointPondere **) * iMaxX;
  8.     for( i = 0 ; i < iMaxX ; i++ ){
  9.          matrice->matrice3D[i] = (t_pointPondere**)malloc (sizeof(t_pointPondere *) * iMaxY);
  10.         for( j = 0 ; j < iMaxY ; j++ ){
  11.              matrice->matrice3D[i][j] =(t_pointPondere*) malloc (sizeof(t_pointPondere) * iMaxZ);
  12.         }
  13.     }
  14. }


 
J'ai laissé les cast aux malloc pour que tu voies bien de quoi il s'agit mais normalement, il ne faut pas les mettre...
 
PS: Super ton pseudo !!!


Message édité par Sve@r le 03-08-2009 à 21:33:27

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 04-08-2009 à 08:43:30    

Très mauvaise technique d'allocation de matrice.
Y a plein de sujets sur le forum sur comment faire ça correctement.

Reply

Marsh Posté le 04-08-2009 à 09:26:45    

@ Sve@r : merci de ces conseils et commentaires. En effet je comprends bien maintenant que l'allocation ne pouvais pas être correcte! Et en effet j'utilise le t_Point3D dans une autre structure d'où sa réutilisation ici.
 
@ Taz : Merci de me dire que c'est mal mais pourrais tu me dire comment il vaut mieux faire? Si je pose la question c'est que je n'ai pas trouvé de sujet qui parle d'allocation de matrice 3D de structures imbriquées. Mais j'ai surement mal cherché :s

Reply

Marsh Posté le 04-08-2009 à 16:51:57    

http://forum.hardware.fr/hfr/Progr [...] 9254_1.htm
par exemple.
C'est pour un tableau 2D mais tu devrais pouvoir rajouter une dimension sans trop de problèmes je pense.

Message cité 1 fois
Message édité par ptitchep le 04-08-2009 à 16:52:29

---------------
deluser --remove-home ptitchep
Reply

Marsh Posté le 05-08-2009 à 13:12:21    

ptitchep a écrit :

http://forum.hardware.fr/hfr/Progr [...] 9254_1.htm
par exemple.
C'est pour un tableau 2D mais tu devrais pouvoir rajouter une dimension sans trop de problèmes je pense.


Tout a fait :o
La methode est recursive sur le nb de dimension.

Reply

Sujets relatifs:

Leave a Replay

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