Título: Duda con structs C/C++ Publicado por: SARGE553413 en 21 Junio 2013, 01:45 am Hola a todos, expongo mi duda:
Tengo que usar la función gethostbyname(), que devuelve un struct hostent*. El problema es que este puntero está declarado como static, por tanto esta función devuelve SIEMPRE la misma dirección de memoria. Por tanto en sucesivas llamadas se van "pisando" datos. Quiero conseguir que ésto no pase. La solución que se me ocurre es hacer otra función que "construya" otro hostent* no static, copiarle los valores y devolverlo. Mi pregunta es si C/C++ tiene algún mecanismo para copiar estructuras (hacer "a=b" no me vale porque así se copian las direcciones de memoria). Gracias. Título: Re: Duda con structs C/C++ Publicado por: ralymontes en 21 Junio 2013, 05:19 am Para copiar estructuras se tiene que hacer elemento a elemento. En el caso de los strings tienes que usar strcpy().
Saludos! Título: Re: Duda con structs C/C++ Publicado por: amchacon en 21 Junio 2013, 13:08 pm Para copiar estructuras se tiene que hacer elemento a elemento. En el caso de los strings tienes que usar strcpy(). Depende, en C++ se puede definir un operador = específico para la estructura:Saludos! Código
Y ya podrías usar el operador = sin problemas: Código
Título: Re: Duda con structs C/C++ Publicado por: xiruko en 21 Junio 2013, 14:42 pm Pues a mi esto me funciona perfectamente...
Código
Así que sí, puedes copiar structs directamente. En el ejemplo que te he dado también lo tienes con punteros. Saludos. Título: Re: Duda con structs C/C++ Publicado por: amchacon en 21 Junio 2013, 14:48 pm Pues a mi esto me funciona perfectamente... ¿Seguro? Prueba esto:Código
Así que sí, puedes copiar structs directamente. En el ejemplo que te he dado también lo tienes con punteros. Saludos. Código
Estas usando la misma cadena en las 4 estructuras. Si modificas un dato en una la modificaras en todas ;) Título: Re: Duda con structs C/C++ Publicado por: xiruko en 21 Junio 2013, 14:58 pm Pues diciéndomelo tan seguro me esperaba que cambiara, pero si te soy sincero la salida de p1 es la del principio, sin la 'z' modificada xD
EDITO: De hecho poder se puede: http://stackoverflow.com/questions/9127246/copy-struct-to-struct-in-c (http://stackoverflow.com/questions/9127246/copy-struct-to-struct-in-c) Lo único que no sé a qué se refiere con estructuras simples. Esta noche con más calma lo miro bien, que desde siempre he creído que se podían copiar y ahora resulta que no es tan trivial... Saludos. Título: Re: Duda con structs C/C++ Publicado por: amchacon en 21 Junio 2013, 15:13 pm Pues diciéndomelo tan seguro me esperaba que cambiara, pero si te soy sincero la salida de p1 es la del principio, sin la 'z' modificada xD Cierto, creo que ya he pillado el problema (un array no responda igual que un puntero al parecer).Prueba ahora: Código
De hecho poder se puede: Se puede hacer directamente si las estructuras no tienen punteros. Si los tiene te compilará pero te puedes encontrar problemas extraños en la ejecución (como ya he planteado antes).http://stackoverflow.com/questions/9127246/copy-struct-to-struct-in-c (http://stackoverflow.com/questions/9127246/copy-struct-to-struct-in-c) Lo único que no sé a qué se refiere con estructuras simples. Esta noche con más calma lo miro bien, que desde siempre he creído que se podían copiar y ahora resulta que no es tan trivial... Saludos. Esta es una de las razones por las que se inventaron los operadores en C++. Título: Re: Duda con structs C/C++ Publicado por: kmilinh0 en 21 Junio 2013, 15:40 pm Debes reservar espacio en memoria para guardar las estructuras, lo mas directo es un array de estructuras hostent.
Posteriormente, puedes usar: memcpy( puntero1, puntero2, numeroBytes ) Esto es Ansi C, el clasico vamos. Esta funcion copia los bytes q quieras de una direccion de memoria a otra. Copiará de puntero2 a puntero1. Por tanto tu puntero1 es la posicion del array donde vayas a guardar la estructura hostent y puntero2 es el hostent*. Código: memcpy( &array[i], hostent_puntero, sizeof(hostent) ); Título: Re: Duda con structs C/C++ Publicado por: rir3760 en 21 Junio 2013, 17:33 pm Pues diciéndomelo tan seguro me esperaba que cambiara, pero si te soy sincero la salida de p1 es la del principio, sin la 'z' modificada xD EDITO: De hecho poder se puede: http://stackoverflow.com/questions/9127246/copy-struct-to-struct-in-c (http://stackoverflow.com/questions/9127246/copy-struct-to-struct-in-c) Cierto, creo que ya he pillado el problema (un array no responda igual que un puntero al parecer). A) Al copiarse un array se copia este como una unidad (el valor de todos sus elementos). B) Al copiarse un puntero (para el caso cualquier objeto) se copia el valor almacenado. En el ultimo caso y tratándose de punteros la dirección en memoria sera la misma y por ende un cambio en el objeto apuntado tendrá efecto en todas las estructuras (ya que todas apuntan a ese objeto). Un saludo Título: Re: Duda con structs C/C++ Publicado por: amchacon en 21 Junio 2013, 17:40 pm Desconocía el punto A, creía que un array se tomaba como puntero ;)
Título: Re: Duda con structs C/C++ Publicado por: SARGE553413 en 21 Junio 2013, 18:09 pm Gracias por las respuestas, sobre todo la del memcpy, muy interesante, no sabía que existiese esa función, gracias.
Pero supongamos que hago una funcion que devuelva un hostent*, en el cuerpo de esta función podría reservar memoria con malloc, y después usar el memcpy() sin necesidad de declarar y vector ¿cierto? Otra cosa, si la estructura tiene dentro punteros, al usar memcpy(), ¿estos punteros apuntan correctamente no?, es decir, si tengo 2 vectores a y b, uno de tam. 20 y otro de tam. 40, en ese caso tras usar memcpy(), mis nuevos a y b tendrán también 20 y 40 de tamaño, ¿cierto? Saludos y gracias de nuevo. Título: Re: Duda con structs C/C++ Publicado por: zonahurbana en 21 Junio 2013, 18:32 pm Depende, en C++ se puede definir un operador = específico para la estructura [...] Tal vez no sea muy adecuado preguntar por acá, pero es una pregunta corta: ¿Cómo puedo encontrar más acerca de estos temas? Es decir, ¿con qué nombre lo busco? Con ello podría determinar las acciones de usar '+=' en clases que yo mismo vaya creando, ¿verdad? Título: Re: Duda con structs C/C++ Publicado por: rir3760 en 21 Junio 2013, 18:45 pm Pero supongamos que hago una funcion que devuelva un hostent*, en el cuerpo de esta función podría reservar memoria con malloc, y después usar el memcpy() sin necesidad de declarar y vector ¿cierto? Tienes que explicarte de una forma mas clara, si puedes poner un ejemplo e indicar el lenguaje de programación que estas utilizando mejor.Otra cosa, si la estructura tiene dentro punteros, al usar memcpy(), ¿estos punteros apuntan correctamente no?, es decir, si tengo 2 vectores a y b, uno de tam. 20 y otro de tam. 40, en ese caso tras usar memcpy(), mis nuevos a y b tendrán también 20 y 40 de tamaño, ¿cierto? El tamaño de los campos depende de la declaración de la estructura, el uso de la función memcpy es tema aparte.---- Depende, en C++ se puede definir un operador = específico para la estructura [...] Tal vez no sea muy adecuado preguntar por acá, pero es una pregunta corta: ¿Cómo puedo encontrar más acerca de estos temas? Es decir, ¿con qué nombre lo busco? Un saludo Título: Re: Duda con structs C/C++ Publicado por: pacoperico en 21 Junio 2013, 18:50 pm Memcpy() copia literalmente un area de memoria en otro sitio de la memoria. Echale un ojo a su definicion para que lo tengas mas claro:
http://www.cplusplus.com/reference/cstring/memcpy/ (http://www.cplusplus.com/reference/cstring/memcpy/) |