• Domingo 19 de Mayo de 2024, 04:23

Autor Tema:  Se puede aplicar un memcpy a dos estructuras diferentes  (Leído 2009 veces)

truliano

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Se puede aplicar un memcpy a dos estructuras diferentes
« en: Viernes 17 de Junio de 2011, 23:29 »
0
Esta es mi primera consulta, he estado programando hace tiempo pero por fin he estado utilzando el memcpy de modo de optimizar mi desarrollo, la consulta es por ejemplo:

si tengo

Código: C++
  1.  
  2. typedef struct A
  3. {
  4. int a;
  5. float b, c;
  6. int b;
  7. }
  8.  
  9. typedef struct A
  10. {
  11. int a;
  12. float b, c;
  13. }
  14.  
  15. A a;
  16. B b;
  17. size_t sizea = sizeof(float) * 2 + sizeof(int);
  18. size_t sizeb = sizeof(float) + sizeof(int);
  19. memcpy(&a, &b, sizea);
  20. memcpy(&a, &b, sizeb);
  21.  
  22.  

Lo ecribi a la rapida unicamente para realizar la pregunta, lo que me interesa es saber si es que la copya de esa forma me realiza una copia de los datos uno a uno como han sido guardados,
o sea con el primer memcpy copia los valores de de a, b y c de la estructura "b" a "a", y con el segundo memcpy los valores de a y b de la estructura "b" a "a"


Saludos,

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Se puede aplicar un memcpy a dos estructuras diferentes
« Respuesta #1 en: Sábado 18 de Junio de 2011, 01:52 »
0
En tu ejemplo, estas definiendo struct A dos veces, supongo que la segunda en realidad era struct B, ademas en la primer estructura A, pones dos miembros b, supongo tambien que debio ser miembro d el cuarto, pero bueno dices que lo escribiste a la rapida, sin embargo, te lo aclaro, no sea que te vayas con una idea errada si no esta bien definido.

Ahora, respondiendo a tu pregunta, suponiendo que defines tu estructura A, con sus miembros exactamente del mismo tipo y en el mismo orden que estructura B, de la siguiente manera:

Código: C++
  1.  
  2. typedef struct A
  3. {
  4.     int a;
  5.     float b, c;
  6.     int d;
  7. };
  8.  
  9. typedef struct B
  10. {
  11.     int a;
  12.     float b, c;
  13. };
  14.  
  15.  

dire que SI, tu suposicion es correcta, el contenido de los miembros a, b y c se copiaran de B a A en el primer caso, y el contenido de a y b, en el segundo caso.

Pero cuidado aqui, usar memcpy puede ser peligroso a menos que sepas exactamente lo que estas haciendo, ya que no comprueba la variable destino, para verificar que sea del tamaño adecuado, ni tampoco que lo que estes haciendo sea lo correcto o este en el orden correcto.

Por ejemplo, supongamos que inviertes la definicion de los miembros, de la siguiente manera:

Código: C++
  1.  
  2. typedef struct A
  3. {
  4.     int a;
  5.     float b, c;
  6.     int d;
  7. };
  8.  
  9. typedef struct B
  10. {
  11.     // invierto la definicion
  12.     float b, c;
  13.     int a;
  14. };
  15.  
  16.  

Entonces en este caso, lo que sucederia es que el contenido de struct B float b, se guardaria en struct A int a, y el contenido de struct B float c se guardaria en struct A float b, ya que ambos tipos float e int, se almacenan en 4 bytes. Ocurriria algo mas grave si en lugar de float utilizaras double, ya que double ocupa 8 bytes, entonces no coincidiria el tamaño del tipo origen con el tipo destino, ¿te das cuenta a que me refiero?

Dicho eso, y como dije antes, solo ten cuidado al usar memcpy y asegurate de saber lo que haces.

Saludos :)

NOTA:
==================================================================
Este foro es para ayudar, aprender, compartir... usenlo para eso,
NO SE RESUELVEN DUDAS POR MENSAJE PRIVADO Y MENOS POR CORREO
==================================================================

truliano

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Se puede aplicar un memcpy a dos estructuras diferentes
« Respuesta #2 en: Domingo 19 de Junio de 2011, 00:51 »
0
Muchas gracias,

Realmente como lo escribi a la rapida lo entendiste perfecto, y si era eso lo que tenia pensado pero no lo habia probado.
Esto me permite realizar un paso de los datos de mi estructura simulacion a mi estructura guardado que son distintas.