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

  FORUM HardWare.fr
  Programmation
  C

  Fonction qui retourne une structure

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Fonction qui retourne une structure

n°1912254
Duc_onlajo​y
Posté le 06-08-2009 à 11:42:26  profilanswer
 

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

mood
Publicité
Posté le 06-08-2009 à 11:42:26  profilanswer
 

n°1912276
Taz
bisounours-codeur
Posté le 06-08-2009 à 12:05:57  profilanswer
 

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é.

n°1912342
Duc_onlajo​y
Posté le 06-08-2009 à 14:02:06  profilanswer
 

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?

n°1912348
Taz
bisounours-codeur
Posté le 06-08-2009 à 14:07:59  profilanswer
 

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.

n°1912349
Duc_onlajo​y
Posté le 06-08-2009 à 14:08:48  profilanswer
 

OK, merci bien.

n°1912400
Joel F
Real men use unique_ptr
Posté le 06-08-2009 à 15:04:40  profilanswer
 

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

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

  Fonction qui retourne une structure

 

Sujets relatifs
C++ fonction d'une ligne : besoin d'accolades ?Calcul d'aire: retourne 0!
récuperer le parametre value d'un bouton dans la fonction execapplicast sur un pointeur de fonction
prob fonction mail phpvariable vba et fonction excel
Communication iframe et fonction parent javascript sur deux serveurs[Visual C++] Problème conversion System::String ^ et structure
Petit problème de structure / chaine de caractèrefonction qui retourne une structure
Plus de sujets relatifs à : Fonction qui retourne une structure


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