initialize - structs in java
Copiar struct a struct en C (7)
Quiero copiar una estructura idéntica en otra y luego usarla como una comparación con la primera. ¡El problema es que mi compilador me advierte cuando estoy haciendo esto! Debería hacerlo de otra manera o estoy haciendo esto mal:
En el archivo de encabezado:
extern struct RTCclk
{
uint8_t second;
uint8_t minute;
uint8_t hour;
uint8_t mday;
uint8_t month;
uint8_t year;
}
RTCclk;
En el archivo 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);
}
Creo que deberías lanzar los punteros a (vacío *) para deshacerte de las advertencias.
memcpy((void *)&RTCclk, (void *)&RTCclkBuffert, sizeof RTCclk);
También debe usar sizeof sin paréntesis, puede usar esto con variables pero si RTCclk se definió como una matriz, sizeof of devolverá el tamaño completo de la matriz. Si usa use sizeof con type, debe usarlo con corchetes.
sizeof(struct RTCclk)
Para estructuras simples, puede usar memcpy
como lo hace o simplemente asignar de uno a otro:
RTCclk = RTCclkBuffert;
El compilador creará código para copiar la estructura por usted.
Una nota importante sobre la copia: es una copia superficial, al igual que con memcpy
. Eso significa que si tienes, por ejemplo, una estructura que contiene punteros, solo se copiarán los punteros reales y no lo que señalan, por lo que después de la copia tendrás dos punteros apuntando a la misma memoria.
También un buen ejemplo .....
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;
}
Tu código memcpy
es correcto.
Supongo que te falta una inclusión de string.h. Entonces el compilador asume un prototipo incorrecto de memcpy
y por lo tanto la advertencia.
De todos modos, solo debes asignar las estructuras en aras de la simplicidad (como señaló Joachim Pileborg).
Tu código es correcto También puede asignar uno directamente al otro (ver la respuesta de Joachim Pileborg ).
Cuando más tarde compartas las dos estructuras, debes tener cuidado de comparar las estructuras a lo largo, un miembro a la vez, en lugar de usar memcmp
; ver ¿Cómo se comparan las estructuras para la igualdad en C?
copiar la estructura en c solo necesita asignar los valores de la siguiente manera:
struct RTCclk RTCclk1;
struct RTCclk RTCclkBuffert;
RTCclk1.second=3;
RTCclk1.minute=4;
RTCclk1.hour=5;
RTCclkBuffert=RTCclk1;
ahora RTCclkBuffert.hour tendrá valor 5,
RTCclkBuffert.minute tendrá valor 4
RTCclkBuffert.second tendrá valor 3
memcpy espera que los dos primeros argumentos sean nulos *.
Pruebe: memcpy( (void*)&RTCclk, (void*)&RTCclkBuffert, sizeof(RTCclk) );
PD aunque no es necesario, la convención dicta los corchetes para el operador sizeof. Puede salirse con la suya en C que deja el código imposible de mantener, por lo que seguir la convención es la marca de un buen programador C (utilizable).