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

  FORUM HardWare.fr
  Programmation
  C

  Allocation de matrice 3D pondérée

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Allocation de matrice 3D pondérée

n°1911359
Duc_onlajo​y
Posté le 03-08-2009 à 16:42:55  profilanswer
 

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
mood
Publicité
Posté le 03-08-2009 à 16:42:55  profilanswer
 

n°1911428
Sve@r
Posté le 03-08-2009 à 21:31:11  profilanswer
 

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.
n°1911467
Taz
bisounours-codeur
Posté le 04-08-2009 à 08:43:30  profilanswer
 

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

n°1911486
Duc_onlajo​y
Posté le 04-08-2009 à 09:26:45  profilanswer
 

@ 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

n°1911688
ptitchep
Posté le 04-08-2009 à 16:51:57  profilanswer
 

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
n°1911955
Joel F
Real men use unique_ptr
Posté le 05-08-2009 à 13:12:21  profilanswer
 

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.


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

  Allocation de matrice 3D pondérée

 

Sujets relatifs
recherche matrice phpAdressage de matrice, performances
Programmation 2D et 3DApprendre la 2D et 3D
produit des matrice en vba[PHP] Matrice php
Problème d'allocation mémoire sur gros vecteurallocation mémoire optimisée au niveau bit
[C] Matrice de structures : probleme de remplissageBouchage de trous dans des images 3D
Plus de sujets relatifs à : Allocation de matrice 3D pondérée


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