45 votes

Couler une structure C dans une autre

J'ai deux structures C identiques (mais nommées différemment) :

 typedef struct {
      double x;
      double y;
      double z;
} CMAcceleration;


typedef struct {
    double x;
    double y;
    double z;   
} Vector3d;

Maintenant, je veux affecter une variable CMAcceleration à une variable Vector3d (en copiant toute la structure). Comment puis-je faire ceci?

J'ai essayé ce qui suit mais j'obtiens ces erreurs de compilateur :

 vector = acceleration;           // "incompatible type"
vector = (Vector3d)acceleration; // "conversion to non-scalar type requested"

Bien sûr, je peux recourir à tous les membres individuellement :

 vector.x = acceleration.x;
vector.y = acceleration.y;
vector.z = acceleration.z;

mais cela semble assez gênant.

Quelle est la meilleure solution ?

54voto

Georg Schölly Points 63123

C'est votre seule solution (à part l'envelopper dans une fonction):

 vector.x = acceleration.x;
vector.y = acceleration.y;
vector.z = acceleration.z;

Vous pouvez en fait le lancer, comme ceci (en utilisant des pointeurs)

 Vector3d *vector = (Vector3d*) &acceleration;

mais ce n'est pas dans les spécifications et donc le comportement dépend du compilateur, du runtime et du gros monstre de l'espace vert.

15voto

David Gelhar Points 20703

Vous pouvez utiliser un pointeur pour effectuer le transtypage ;

 vector = *((Vector3d *) &acceleration);

7voto

groovingandi Points 1568

memcpy(&vector, &acceleration, sizeof(Vector3d));

Veuillez noter que cela ne fonctionne que si la disposition physique des structures en mémoire est identique. Cependant, comme l'a souligné @Oli, le compilateur n'est pas obligé de s'en assurer !

6voto

sharptooth Points 93379

Vous utilisez une fonction utilitaire pour cela :

 void AccelerationToVector( struct CMAcceleration* from, struct Vector3d* to )
{
     to->x = from->x;
     to->y = from->y;
     to->z = from->z;
}

5voto

SysAdmin Points 2257

Pourquoi n'utilisez-vous pas.

 typedef CMAcceleration Vector3d;

(au lieu de créer une toute nouvelle structure)

dans ce cas, vector = acceleration; compile très bien.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X