• Miércoles 6 de Noviembre de 2024, 10:21

Autor Tema:  Punteros a estructuras  (Leído 992 veces)

Quity_Ibias

  • Nuevo Miembro
  • *
  • Mensajes: 7
    • Ver Perfil
Punteros a estructuras
« en: Miércoles 13 de Agosto de 2008, 19:48 »
0
Hola!!!

Tengo un problema y si alguien puede ayudarme o pasarme alguna pagina donde pueda encontrar información se lo agradecería.

Tengo un puntero a una estructura que yo cree. Y necesito convertir el puntero a la estructura en un char* (ya que necesito enviarlo mediante una cola de mensajes), a continuación, deseo convertir el char* en un puntero a mi estructura (ya que se supone que desde otro proceso recibo los datos de la cola de mensajes) o por lo menos obtener los campos de ese char * de una forma facil.

Aqui les dejo lo más importante del codigo a ver si saben como podría solucionarlo.

//DEFINICION DE ESTRUCTURAS
typedef struct
{
   char blanco;
   char letra[2];
   
}letras;
typedef struct
{
   char tipo_mensaje[2];
   char id_servtomo[10];
   char dir_ip[16];
   int PID;
   int puerto;
   letras lista_de_letras[28];

}datos_alta;



datos_alta* datos_cola;

//DIMENSIONO LOS PUNTEROS A LAS ESTRUCTURAS
datos_cola = (datos_alta*)malloc(sizeof(datos_alta));


//ESTO CORRESPONDE A LA FUNCION QUE ENVIA LOS DATOS--> Estos datos los copio correctamente en datos_cola (ya que los muestro por pantalla y salen bien)
datos_cola->tipo_mensaje[1]='';
datos_cola->tipo_mensaje[0]='A';
datos_cola->PID=pid;
strcpy(datos_cola->dir_ip, ip);
datos_cola->puerto=puerto;
memcpy(datos_cola->lista_de_letras,(char*)list, sizeof(letras));
strcpy(datos_cola->id_servtomo, id);

//Para enviarlo mediante la cola de mensajes
char datos[2048];
memcpy(datos, datos_cola, sizeof(datos_cola));


//se supone que recibo los datos de una cola de mensajes en otra función distinta, lo más basico es lo siguiente.

datos_alta * peticion_recibida = (datos_alta*)malloc(sizeof(datos_alta));
//en datos es un char y obtengo los distintos datos.
char datos [2048]
memcpy(peticion_recibida, datos, sizeof(datos));
peticion_recibida->dir_ip;
peticion_recibida->id_servtomo;
peticion_recibida->PID;
El unico dato que se me muestra correctamente es peticion_recibida->tipo_mensaje . El resto de los datos sale 0,
excepto peticion_recibida->id_servtomo que muestra IDTOMO cuando debería mostrar IDTOMOS.

¿Alguna idea de donde esta el error?.

Gracias de todas formas por las molestias

chuidiang

  • Miembro MUY activo
  • ***
  • Mensajes: 123
  • Nacionalidad: es
    • Ver Perfil
    • http://www.chuidiang.com
Re: Punteros a estructuras
« Respuesta #1 en: Jueves 14 de Agosto de 2008, 21:19 »
0
Hola:

No he revisado tu código con detalle, pero así por encima un par de cosas que pueden darte problemas.

En las estructuras, cuando se van a enviar a algún sitio y recogerlas, suele ser conveniente hacer que todos los campos sean múltiplos de 4 bytes. Eso afecta especialmente a los arrays de char que tienes de tamaño 2 o tamaño 10, que no son múltiplos de 4. El motivo es que el compilador de C/C++ para ajustar la estructura en memoria puede dejar los huecos necesarios entre medias para hacer que esos 2 bytes del array ocupen en realidad 4, dos de ellos con basura y no utilizados. Esto puede darte problemas, por ejemplo, si en un lado "envías" la estructura completa con una sola llamada a un "send" o "write" y en el otro lado te dedicas a leer los campos uno a uno (o al revés, envías campos uno a uno y lees de golpe).

La otra cosa que también debes tener en cuenta es asegurarte en los strcpy() y demás funciones de manejo de caracteres que también copias el del fin de cadena y que ese también va de un lado a otro y se tiene en cuenta, igual que el resto de caracteres.

Se bueno.