Sve@r | Duc_onlajoy a écrit :
Bonjour
N'étant pas un expert en C , 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 :
- /** Point dans un referentiel 3D (x,y,z) */
- typedef struct Point3D
- {
- double dX;
- double dY;
- double dZ;
- }
- Point3D;
- /**un point 3D a qui l'on associe un poids */
- typedef struct PointPondere
- {
- Point3D sLocalisation3D;
- float fPoids;
- }PointPondere;
- /** Une matrice3D dont chaque point est pondéré. */
- typedef struct Matrice3DPondere
- {
- int iMaximumX, iMaximumY, iMaximumZ;
- PointPondere ***matrice3D;
- }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 :
- void Remplissagematrice(FILE *resultats,Matrice3DPondere *matrice){
- int i, j, iMaxX, iMaxY, iMaxZ;
- (...)
- matrice->iMaximumX=iMaxX;
- matrice->iMaximumY=iMaxY;
- matrice->iMaximumZ=iMaxZ;
- matrice->matrice3D = malloc( iMaxX * sizeof(PointPondere ***));
- for( i = 0 ; i < matrice->iMaximumX ; i++ ){
- matrice->matrice3D[i] = (PointPondere***)malloc (sizeof(PointPondere **)*matrice->iMaximumY);
- }
- for( i = 0 ; i < matrice->iMaximumX ; i++ ){
- for( j = 0 ; j < matrice->iMaximumY ; j++ ){
- matrice->matrice3D[i][j] =(PointPondere**) malloc (sizeof(PointPondere *)*matrice->iMaximumZ);
- }
- }
- }
|
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 :
- typedef struct {
- double dX;
- double dY;
- double dZ;
- } t_point3D
- typedef struct {
- t_point3D sLocalisation3D;
- float fPoids;
- } t_pointPondere;
- typedef struct {
- int iMaximumX, iMaximumY, iMaximumZ;
- t_pointPondere ***matrice3D;
- }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 :
- void Remplissagematrice(FILE *resultats, t_matrice3DPondere *matrice){
- int i, j, iMaxX, iMaxY, iMaxZ;
- (...)
- matrice->iMaximumX=iMaxX;
- matrice->iMaximumY=iMaxY;
- matrice->iMaximumZ=iMaxZ;
- matrice->matrice3D=(t_pointPondere ***)malloc(sizeof(t_pointPondere **) * iMaxX;
- for( i = 0 ; i < iMaxX ; i++ ){
- matrice->matrice3D[i] = (t_pointPondere**)malloc (sizeof(t_pointPondere *) * iMaxY);
- for( j = 0 ; j < iMaxY ; j++ ){
- matrice->matrice3D[i][j] =(t_pointPondere*) malloc (sizeof(t_pointPondere) * iMaxZ);
- }
- }
- }
|
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.
|