• Sábado 14 de Diciembre de 2024, 14:00

Autor Tema:  Error al asignar un puntero char a un struct  (Leído 1898 veces)

pr35t0

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Error al asignar un puntero char a un struct
« en: Domingo 24 de Abril de 2011, 13:17 »
0
Hola. Es mi primer mensaje en el foro y lo hago para pedir ayuda, espero que no os parezca mal..xD

Estoy implementando un clienteARP para una práctica que tengo que entregar en 2 días. Lo tengo terminado pero al compilar me da un error que no se como resolver porque mi nivel de c++ es bastante bajo.

Para poder plantear mi duda defino primero las funciones que uso en donde me da error:

- La función hwaddr() de la clase linklayer(LLL en mi código) se define como:

struct ether_addr hwaddr() y devuelve los 6 bytes de la dirección ethernet de la interfaz.

- La función ether_ntoa devuelve una cadena con la representación normalizada de la dirección para poder mostrarla por pantalla y se define como:

char *ether_ntoa(const struct ether_addr *addr)

- El struct ether_addr se define en net/ethernet.h como sigue:

struct ether_addr {

u_int8_t ether_addr_octet[6]}

Pues una vez definidos los datos que uso, necesito almacenar los 6 bytes que devulve la función LLL.hwaddr() tanto en un struct del tipo ether_addr(para poder mostrarla por pantalla) como en un char(para poder usarla a la hora de crear el paquete ARP). Mi problema viene en que no soy capaz de guardarlos en un char sin que me dé error.

Mi código sería el siguiente:

struct ether_addr MAC_propia; //defino un struct del tipo ether_addr
MAC_propia=LLL.hwaddr(); // Le asigno el otro struct que devuelve la función hwaddr()
char *MAC_propia_c[6]=MAC_propia.ether_addr_octet; //Uso un char * para que apunte al contenido del struct

Al asignar *MAC_propia_c[6] a la variable ether_addr_octet en la que está la dirección de 6 bytes me da el siguiente error:
error: array must be initialized with a brace-enclosed initializer

Alguién sabe como puedo resolverlo y pasar el contenido del struct a un char¿?

Gracias por adelantado
Código: C++
  1. [code=cpp]
[/code]

ProfesorX

  • Moderador
  • ******
  • Mensajes: 796
  • Nacionalidad: mx
    • Ver Perfil
Re: Error al asignar un puntero char a un struct
« Respuesta #1 en: Domingo 24 de Abril de 2011, 20:32 »
0
El problema viene de que tu no puedes asignar directamente una estructura a un arreglo, de la misma forma en que no puedes asignar directamente un arreglo a otro arreglo.

La solucion seria utilizar la funcion memcpy, que copia el contenido de una direccion de memoria a otra direccion de memoria esta funcion se encuentra en la libreria string.h (cstring)

Trate de ponerte un ejemplo utilizando tu codigo, pero debido a que esta incompleto y faltan definiciones no lo pude hacer, pero te dejo un ejemplo parecido para que te des una idea de como funciona.

Código: C++
  1.  
  2. #include <cstdio>
  3. #include <cstdlib>
  4. #include <cstring>
  5. #include <cmath>
  6.  
  7. typedef unsigned char u_int8_t;
  8.  
  9. struct ether_addr
  10. {
  11.     u_int8_t ether_addr_octet[6];
  12. };
  13.  
  14. struct ether_addr estructura;
  15. char cadena[6];
  16.  
  17. int main()
  18. {
  19.     // La siguientes lineas daran error
  20.     //estructura.ether_addr_octet = "hola";
  21.     //cadena = estructura;
  22.    
  23.     // La siguientes lineas compilaran correctamente
  24.     memcpy (estructura.ether_addr_octet, "Hola", 6);
  25.     // Nota como le paso la direccion (&) de la estructura a la funcion memcpy, si no lo hago, no funciona
  26.     memcpy (cadena, &estructura, 6);
  27.  
  28.     return 0;
  29. }
  30.  
  31.  

Ojala te funcione.

Saludos :)

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

pr35t0

  • Nuevo Miembro
  • *
  • Mensajes: 2
    • Ver Perfil
Re: Error al asignar un puntero char a un struct
« Respuesta #2 en: Domingo 24 de Abril de 2011, 21:15 »
0
Mil gracias por lo del memcpy lo había usado en otros programas pero no caia de usarlo ahí.

Ya me funciona!!! Lo he probado con 2 pcs de la universidad y tira. Ahora solo me falta lo que creo que se llama iteratividad(que es opcional) que es para que el usuario pueda volver a introducir un host a resolver, ahi supongo que lo mejor será hacer un do while no??

Muchas gracias