Duda con structs C/C++

Iniciado por SARGE553413, 21 Junio 2013, 01:45 AM

0 Miembros y 2 Visitantes están viendo este tema.

SARGE553413

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.

ralymontes

Para copiar estructuras se tiene que hacer elemento a elemento. En el caso de los strings tienes que usar strcpy().

Saludos!

amchacon

Cita de: 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!
Depende, en C++ se puede definir un operador = específico para la estructura:

Código (cpp) [Seleccionar]
struct Tonteria
{
   int Miau;
   int* Cosa;

   Tonteria operator=(const Tonteria &t) // Operador =
   {
       Miau = t.Miau;
       *Cosa = *t.Cosa;

       return *this; // Devuelvo una referencia a la misma clase, esto me sirve para concatenar varios =
   }
};


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

Código (cpp) [Seleccionar]
Tonteria1 = Tonteria2;
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

Pues a mi esto me funciona perfectamente...

#include <stdio.h>
#include <string.h>

struct prueba {
int a;
char b;
char c[100];
};

int main()
{
struct prueba p1, p2, *p3, p4;

// se inicializa p1
p1.a = 10;
p1.b = 'A';
strcpy(p1.c, "ola k ase");

// se copia p1 a p2 y se imprime
p2 = p1;
printf("p2: %d %c %s\n", p2.a, p2.b, p2.c);

// p3 apunta a p1
p3 = &p1;

// se copia *p3 a p4 y se imprime
p4 = *p3;
printf("p4: %d %c %s\n", p4.a, p4.b, p4.c);
return 0;
}


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

Saludos.

amchacon

Cita de: xiruko en 21 Junio 2013, 14:42 PM
Pues a mi esto me funciona perfectamente...

#include <stdio.h>
#include <string.h>

struct prueba {
int a;
char b;
char c[100];
};

int main()
{
struct prueba p1, p2, *p3, p4;

// se inicializa p1
p1.a = 10;
p1.b = 'A';
strcpy(p1.c, "ola k ase");

// se copia p1 a p2 y se imprime
p2 = p1;
printf("p2: %d %c %s\n", p2.a, p2.b, p2.c);

// p3 apunta a p1
p3 = &p1;

// se copia *p3 a p4 y se imprime
p4 = *p3;
printf("p4: %d %c %s\n", p4.a, p4.b, p4.c);
return 0;
}


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

Saludos.
¿Seguro? Prueba esto:

#include <stdio.h>
#include <string.h>

struct prueba {
int a;
char b;
char c[100];
};

int main()
{
struct prueba p1, p2, *p3, p4;

// se inicializa p1
p1.a = 10;
p1.b = 'A';
strcpy(p1.c, "ola k ase");

// se copia p1 a p2 y se imprime
p2 = p1;
printf("p2: %d %c %s\n", p2.a, p2.b, p2.c);

// p3 apunta a p1
p3 = &p1;

// se copia *p3 a p4 y se imprime
p4 = *p3;
printf("p4: %d %c %s\n", p4.a, p4.b, p4.c);

       // Ahora modifico c en p4)
       p4.c[2] = 'z';

       // Compruebo p1... WTF QUE HA PASADO?
       
      printf("p1: %d %c %s\n", p1.a, p1.b, p1.c);

return 0;
}


Estas usando la misma cadena en las 4 estructuras. Si modificas un dato en una la modificaras en todas ;)
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

#5
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.

amchacon

#6
Cita de: 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
Cierto, creo que ya he pillado el problema (un array no responda igual que un puntero al parecer).

Prueba ahora:

Código (cpp) [Seleccionar]
#include <stdio.h>
#include <string.h>

struct prueba {
int a;
char b;
char* c;
};

int main()
{
struct prueba p1, p2, p3, p4;

// se inicializa p1
p1.a = 10;
p1.b = 'A';
p1.c = new char[100];
strcpy(p1.c, "ola k ase");

// se copia p1 a p2 y se imprime
p2 = p1;
printf("p2: %d %c %s\n", p2.a, p2.b, p2.c);

// p3 apunta a p1
p3 = p1;

// se copia *p3 a p4 y se imprime
p4 = p3;
printf("p4: %d %c %s\n", p4.a, p4.b, p4.c);

   // Ahora modifico c en p4)
  p4.c[2] = 'z';

   // Compruebo p1... WTF QUE HA PASADO?

     printf("p1: %d %c %s\n", p1.a, p1.b, p1.c);

return 0;
}


Cita de: xiruko en 21 Junio 2013, 14:58 PMDe 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++.
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

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

memcpy( &array[i], hostent_puntero, sizeof(hostent) );
o algo asi jeje


rir3760

Cita de: amchacon en 21 Junio 2013, 15:13 PM
Cita de: xiruko en 21 Junio 2013, 14:58 PMPues 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
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

Desconocía el punto A, creía que un array se tomaba como puntero ;)
Por favor, no me manden MP con dudas. Usen el foro, gracias.

¡Visita mi programa estrella!

Rar File Missing: Esteganografía en un Rar