76 votes

Copier struct à struct en C

Je souhaite copier une structure identique dans une autre et l'utiliser plus tard comme comparaison avec la première. Le truc, c'est que mon compilateur me donne un avertissement quand je fais comme ça ! Dois-je le faire d'une autre manière ou est-ce que je le fais mal :

Dans le fichier d'en-tête :

 extern struct RTCclk
{
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t mday;
uint8_t month;
uint8_t year;
}
RTCclk;

Dans le fichier C :

 struct RTCclk RTCclk;
struct RTCclk RTCclkBuffert;

void FunctionDO(void)
{
   ... // Some Code
   /* Copy first struct values into the second one */
   memcpy(&RTCclk, &RTCclkBuffert, sizeof RTCclk);
}

18voto

Graham Borland Points 27556

Votre code est correct. Vous pouvez également attribuer l'un directement à l'autre (voir la réponse de Joachim Pileborg ).

Lorsque vous en venez plus tard à comparer les deux structs, vous devez faire attention à comparer les structs sur le long terme, un membre à la fois, au lieu d'utiliser memcmp ; voir Comment comparer les structures pour l'égalité en C?

3voto

Hemant Metalia Points 8325

copier la structure en c, il vous suffit d'affecter les valeurs comme suit :

 struct RTCclk RTCclk1;
struct RTCclk RTCclkBuffert;

RTCclk1.second=3;
RTCclk1.minute=4;
RTCclk1.hour=5;

RTCclkBuffert=RTCclk1;

maintenant RTCclkBuffert.hour aura la valeur 5,

RTCclkBuffert.minute aura la valeur 4

RTCclkBuffert.second aura la valeur 3

2voto

newrev426 Points 11

Un bon exemple aussi.....

 struct point{int x,y;};
typedef struct point point_t;
typedef struct
{
    struct point ne,se,sw,nw;
}rect_t;
rect_t temp;


int main()
{
//rotate
    RotateRect(&temp);
    return 0;
}

void RotateRect(rect_t *givenRect)
{
    point_t temp_point;
    /*Copy struct data from struct to struct within a struct*/
    temp_point = givenRect->sw;
    givenRect->sw = givenRect->se;
    givenRect->se = givenRect->ne;
    givenRect->ne = givenRect->nw;
    givenRect->nw = temp_point;
}

1voto

undur_gongor Points 7431

Votre memcpy est correct.

Je suppose qu'il vous manque une inclusion de string.h. Ainsi, le compilateur suppose un mauvais prototype de memcpy et donc l'avertissement.

Quoi qu'il en soit, vous devez simplement affecter les structures par souci de simplicité (comme l'a souligné Joachim Pileborg).

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