Fonction qui retourne une structure

Fonction qui retourne une structure - C - Programmation

Marsh Posté le 06-08-2009 à 11:42:26    

Bonjour
 
Je pensais qu'une fonction ne pouvais renvoyer qu'un type simple et non une structure et que pour renvoyer une structure il faut forcement passer par un void.
Mais voici le code que je viens de lire (il est pas de moi) et qui fonctionne :  
 

Code :
  1. s_Point3D psInterpo_lineaire(double dIsoval,s_Point3D sP1,s_Point3D sP2,
  2.    double dV1,double dV2)
  3. {
  4.   s_Point3D sP;
  5.   sP.dX=sP1.dX+(dIsoval-dV1)/(dV2-dV1)*(sP2.dX-sP1.dX);
  6.   sP.dY=sP1.dY+(dIsoval-dV1)/(dV2-dV1)*(sP2.dY-sP1.dY);
  7.   sP.dZ=sP1.dZ+(dIsoval-dV1)/(dV2-dV1)*(sP2.dZ-sP1.dZ);
  8.   return sP;
  9. }
  10. s_Point3D* psPointsIntersection(unsigned char iIndexCube,s_Cellule sCel,double dIsoval)
  11. {
  12.   int i;
  13.   s_Point3D *psListePointsIntersection=malloc(sizeof(s_Point3D)*12);
  14.   for(i=0;i<12;i++){
  15.     psListePointsIntersection[i].dX=FLT_MAX;
  16.     psListePointsIntersection[i].dY=FLT_MAX;
  17.     psListePointsIntersection[i].dZ=FLT_MAX;
  18.   }
  19.    psListePointsIntersection[0]=psInterpo_lineaire(dIsoval,sCel.psP[0],sCel.psP[1],sCel.pdVal[0],sCel.pdVal[1]);
  20.    (...)
  21.    return psListePointsIntersection;
  22. }
  23. void vCalculTriangles(s_Cellule sCel,double dIsoval,s_Triangle3D *psTriangles)
  24. /* Fournit les coordonnées des triangles      */
  25. {
  26.   int i;
  27.   int iN_Triangles=0;
  28.   unsigned char iIndex=iIndexCube(sCel,dIsoval);
  29.   s_Point3D *psListeDesPointsIntersection=psPointsIntersection(iIndex,sCel,dIsoval);
  30.   for(i=0;ppiTableDesTriangles[iIndex][i]!=-1;i+=3){
  31.     psTriangles[iN_Triangles].psP[0] = psListeDesPointsIntersection[ppiTableDesTriangles[iIndex][i]];
  32.     psTriangles[iN_Triangles].psP[1] = psListeDesPointsIntersection[ppiTableDesTriangles[iIndex][i+1]];
  33.     psTriangles[iN_Triangles].psP[2] = psListeDesPointsIntersection[ppiTableDesTriangles[iIndex][i+2]];
  34.     iN_Triangles++;
  35.   }
  36.   free(psListeDesPointsIntersection);
  37. }


 
 
Donc on peut passer un structure en type de retour pour une fonction[:airforceone]??
 
Merci de vos commentaires

Reply

Marsh Posté le 06-08-2009 à 11:42:26   

Reply

Marsh Posté le 06-08-2009 à 12:05:57    

Tout à fait. Mais quand la taille de la structure devient importante (genre + de 2 pointeurs/double), c'est moins intéressant en termes de performances que de passer un argument out vers une structure.
 
Sauf si ta fonction est inline, le compilateur risque alors de bien optimiser tout ça.
 
La 3 double, ça passe sans trop de difficulté.

Reply

Marsh Posté le 06-08-2009 à 14:02:06    

D'accord, merci de ces précisions.
 
Pensez-vous que je peut adapter ce qui est fait là à une structure de type "s_Point3DPondere" définit ainsi :

Code :
  1. typedef struct s_PointPondere
  2. {
  3.     s_Point3D sLocalisation3D;
  4.     double fPoids;
  5. }s_PointPondere;


 
Avec un s_Point3D :  

Code :
  1. typedef struct s_Point3D
  2. {
  3.   double dX;
  4.   double dY;
  5.   double dZ;
  6. }
  7. s_Point3D;


 
Est-ce que ce serais utile? Ou vaut-il mieux que je passe par un argument en sortie?

Reply

Marsh Posté le 06-08-2009 à 14:07:59    

Comme je te disais, ça commence à être une taille conséquente et donc c'est mieux de passer ça par pointeur, pour éviter une recopie par valeur couteuse.

Reply

Marsh Posté le 06-08-2009 à 14:08:48    

OK, merci bien.

Reply

Marsh Posté le 06-08-2009 à 15:04:40    

perso, j'aime bien faire du pseudo objet en C avec des fonction qui prennent un 1er parametre du type de la structure à bidouiller, quelque soit la taille.


Message édité par Joel F le 06-08-2009 à 15:04:48
Reply

Sujets relatifs:

Leave a Replay

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