elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Entrar al Canal Oficial Telegram de elhacker.net


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  Duda con structs C/C++
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Duda con structs C/C++  (Leído 8,463 veces)
SARGE553413

Desconectado Desconectado

Mensajes: 176


Ver Perfil
Duda con structs C/C++
« 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.


« Última modificación: 21 Junio 2013, 02:06 am por SARGE553413 » En línea

ralymontes

Desconectado Desconectado

Mensajes: 47



Ver Perfil
Re: Duda con structs C/C++
« Respuesta #1 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!


En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con structs C/C++
« Respuesta #2 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().

Saludos!
Depende, en C++ se puede definir un operador = específico para la estructura:

Código
  1. struct Tonteria
  2. {
  3.    int Miau;
  4.    int* Cosa;
  5.  
  6.    Tonteria operator=(const Tonteria &t) // Operador =
  7.    {
  8.        Miau = t.Miau;
  9.        *Cosa = *t.Cosa;
  10.  
  11.        return *this; // Devuelvo una referencia a la misma clase, esto me sirve para concatenar varios =
  12.    }
  13. };

Y ya podrías usar el operador = sin problemas:

Código
  1. Tonteria1 = Tonteria2;
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Duda con structs C/C++
« Respuesta #3 en: 21 Junio 2013, 14:42 pm »

Pues a mi esto me funciona perfectamente...

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct prueba {
  5. int a;
  6. char b;
  7. char c[100];
  8. };
  9.  
  10. int main()
  11. {
  12. struct prueba p1, p2, *p3, p4;
  13.  
  14. // se inicializa p1
  15. p1.a = 10;
  16. p1.b = 'A';
  17. strcpy(p1.c, "ola k ase");
  18.  
  19. // se copia p1 a p2 y se imprime
  20. p2 = p1;
  21. printf("p2: %d %c %s\n", p2.a, p2.b, p2.c);
  22.  
  23. // p3 apunta a p1
  24. p3 = &p1;
  25.  
  26. // se copia *p3 a p4 y se imprime
  27. p4 = *p3;
  28. printf("p4: %d %c %s\n", p4.a, p4.b, p4.c);
  29. return 0;
  30. }

Así que sí, puedes copiar structs directamente. En el ejemplo que te he dado también lo tienes con punteros.

Saludos.
En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con structs C/C++
« Respuesta #4 en: 21 Junio 2013, 14:48 pm »

Pues a mi esto me funciona perfectamente...

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct prueba {
  5. int a;
  6. char b;
  7. char c[100];
  8. };
  9.  
  10. int main()
  11. {
  12. struct prueba p1, p2, *p3, p4;
  13.  
  14. // se inicializa p1
  15. p1.a = 10;
  16. p1.b = 'A';
  17. strcpy(p1.c, "ola k ase");
  18.  
  19. // se copia p1 a p2 y se imprime
  20. p2 = p1;
  21. printf("p2: %d %c %s\n", p2.a, p2.b, p2.c);
  22.  
  23. // p3 apunta a p1
  24. p3 = &p1;
  25.  
  26. // se copia *p3 a p4 y se imprime
  27. p4 = *p3;
  28. printf("p4: %d %c %s\n", p4.a, p4.b, p4.c);
  29. return 0;
  30. }

Así que sí, puedes copiar structs directamente. En el ejemplo que te he dado también lo tienes con punteros.

Saludos.
¿Seguro? Prueba esto:

Código
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct prueba {
  5. int a;
  6. char b;
  7. char c[100];
  8. };
  9.  
  10. int main()
  11. {
  12. struct prueba p1, p2, *p3, p4;
  13.  
  14. // se inicializa p1
  15. p1.a = 10;
  16. p1.b = 'A';
  17. strcpy(p1.c, "ola k ase");
  18.  
  19. // se copia p1 a p2 y se imprime
  20. p2 = p1;
  21. printf("p2: %d %c %s\n", p2.a, p2.b, p2.c);
  22.  
  23. // p3 apunta a p1
  24. p3 = &p1;
  25.  
  26. // se copia *p3 a p4 y se imprime
  27. p4 = *p3;
  28. printf("p4: %d %c %s\n", p4.a, p4.b, p4.c);
  29.  
  30.       // Ahora modifico c en p4)
  31.       p4.c[2] = 'z';
  32.  
  33.       // Compruebo p1... WTF QUE HA PASADO?
  34.  
  35.      printf("p1: %d %c %s\n", p1.a, p1.b, p1.c);
  36.  
  37. return 0;
  38. }

Estas usando la misma cadena en las 4 estructuras. Si modificas un dato en una la modificaras en todas ;)
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
xiruko


Desconectado Desconectado

Mensajes: 438


Ver Perfil
Re: Duda con structs C/C++
« Respuesta #5 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

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.
« Última modificación: 21 Junio 2013, 15:02 pm por xiruko » En línea

amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con structs C/C++
« Respuesta #6 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
  1. #include <stdio.h>
  2. #include <string.h>
  3.  
  4. struct prueba {
  5. int a;
  6. char b;
  7. char* c;
  8. };
  9.  
  10. int main()
  11. {
  12. struct prueba p1, p2, p3, p4;
  13.  
  14. // se inicializa p1
  15. p1.a = 10;
  16. p1.b = 'A';
  17. p1.c = new char[100];
  18. strcpy(p1.c, "ola k ase");
  19.  
  20. // se copia p1 a p2 y se imprime
  21. p2 = p1;
  22. printf("p2: %d %c %s\n", p2.a, p2.b, p2.c);
  23.  
  24. // p3 apunta a p1
  25. p3 = p1;
  26.  
  27. // se copia *p3 a p4 y se imprime
  28. p4 = p3;
  29. printf("p4: %d %c %s\n", p4.a, p4.b, p4.c);
  30.  
  31.    // Ahora modifico c en p4)
  32.   p4.c[2] = 'z';
  33.  
  34.    // Compruebo p1... WTF QUE HA PASADO?
  35.  
  36.      printf("p1: %d %c %s\n", p1.a, p1.b, p1.c);
  37.  
  38. return 0;
  39. }

De hecho poder se puede:

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.
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).

Esta es una de las razones por las que se inventaron los operadores en C++.
« Última modificación: 21 Junio 2013, 15:15 pm por amchacon » En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
kmilinh0

Desconectado Desconectado

Mensajes: 16



Ver Perfil
Re: Duda con structs C/C++
« Respuesta #7 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) );
o algo asi jeje

En línea

rir3760


Desconectado Desconectado

Mensajes: 1.639


Ver Perfil
Re: Duda con structs C/C++
« Respuesta #8 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

Cierto, creo que ya he pillado el problema (un array no responda igual que un puntero al parecer).
No hay problema en utilizar el operador de asignación '=' para copiar estructuras pero se debe tener en cuenta el resultado de este:

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
En línea

C retains the basic philosophy that programmers know what they are doing; it only requires that they state their intentions explicitly.
--
Kernighan & Ritchie, The C programming language
amchacon


Desconectado Desconectado

Mensajes: 1.211



Ver Perfil
Re: Duda con structs C/C++
« Respuesta #9 en: 21 Junio 2013, 17:40 pm »

Desconocía el punto A, creía que un array se tomaba como puntero ;)
En línea

Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar
Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

Mensajes similares
Asunto Iniciado por Respuestas Vistas Último mensaje
Structs Y Clases
.NET (C#, VB.NET, ASP)
anion 1 2,444 Último mensaje 14 Julio 2007, 04:26 am
por MANULOMM
Duda con ficheros y structs en C
Programación C/C++
chica_23 9 5,817 Último mensaje 19 Marzo 2011, 20:24 pm
por chica_23
Problema structs
Programación C/C++
Ccomplica 1 2,143 Último mensaje 30 Octubre 2013, 05:53 am
por edr89
Array de structs duda con los nombres C#
.NET (C#, VB.NET, ASP)
RevolucionVegana 2 3,398 Último mensaje 3 Junio 2017, 05:31 am
por Eleкtro
Duda sobre structs!!!
Programación C/C++
pablombf 1 2,055 Último mensaje 10 Enero 2018, 03:23 am
por Serapis
WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines