C/Visual C - ¿Qué problema hay en esta línea de código C++?

 
Vista:

¿Qué problema hay en esta línea de código C++?

Publicado por BluSky (10 intervenciones) el 04/07/2005 13:36:02
Este código funciona perfectamente para grabar en un fichero objetos de la clase Persona

do {
cout << "Nombre:"; cin >> Nom;
cout << "Edad:"; cin >> Ed;
Persona P(Nom, Ed);
Fichero.write(( unsigned char *) &P, sizeof P);
cout << endl << "Mas registros?";
cin >> Respuesta;
} while (Respuesta=='s');

Pero este NO:
Persona *P;
do {
cout << "Nombre:"; cin >> Nom;
cout << "Edad:"; cin >> Ed;
P=new Persona(Nom, Ed);
Fichero.write(( unsigned char *) P, sizeof P);
cout << endl << "Mas registros?";
cin >> Respuesta;
} while (Respuesta=='s');

La única diferencia entre ambos es que el objeto a grabar (P) en el primer caso es una variable y en el segundo un puntero. Por lo que interpreto que el error debe estar en la llamada a "write". Si pongo &P graba cosas rarísimas y si pongo P me guarda solo los nombres...
¿Veis qué fallo puede tener este último código?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿Qué problema hay en esta línea de código C++?

Publicado por fernando.gomez (1603 intervenciones) el 04/07/2005 17:02:10
En el primer código, sizeof(P) te regresará el tamaño en bytes de la instancia de Persona --que viene de sumar los tamaños de las variables internas, además de alineaciones de bytes, etc--, mientras que en el segundo código, sizeof(P) te regresa el tamaño en bytes DEL PUNTERO a una instancia de Persona. Por ejemplo,

struct Valor { int a, b, c; };
struct Valor objValor;
struct Valor* pValor;

si consideramos que el siguiente código se ejecuta en un compilador estándar de 32 bits, y despreciamos los valores que surjan de la alineación de bytes, tendríamos que sizeof(objValor) sería la suma de sus tres miembros a, b y c, que tentativamente sería de 2+2+2=6 bytes. Sin embargo, sizeof(pValor) evaluará el tamaño del puntero, no del objeto. Los punteros usualmente son de 4 bytes.

Ese sería un problemo que le veo a tu código. En lugar de guardar en el archivo el tamaño del objeto, guardas tan sólo 4 bytes. Claro, en el primero te funciona, porque sizeof(P) sí devuelve el tamaño del objeto, mientras que en el segundo código es el tamaño del puntero.

Capizcas?

Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Qué problema hay en esta línea de código C++?

Publicado por BluSky (10 intervenciones) el 04/07/2005 21:25:50
Perfectamente claro
¿Y cómo tendría que hacer para poder guardar el contenido de los punteros?; porque en mi caso necesito guardar en el fichero cada una de las instancias de clase que voy creando...
Saludos!
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Qué problema hay en esta línea de código C++?

Publicado por fernando.gomez (1603 intervenciones) el 04/07/2005 22:08:14
Así como le haces me parece bien, sólo que en lugar de emplear sizeof(P), emplea sizeof(*P). Por otro lado, como sabes a qué clase pertenece P: Persona, también puedes hacer algo como sizeof(Persona). Este último método debería ser el empleado; el hacer el sizeof a una variable en lugar de al nombre de la clase no se conoce (por ejemplo, que emplees una clase derivada con un puntero a clase base). Saludos.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Qué problema hay en esta línea de código C++?

Publicado por BluSky (10 intervenciones) el 06/07/2005 09:28:48
Clarísimo Fernando.
Montón de gracias
Sebas
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Qué problema hay en esta línea de código C++?

Publicado por elchulojose (1 intervención) el 08/07/2005 21:18:59
un posible problema pueded ser el tipo de dato antes de P.
y tambien algo importante el uso de -> ya que p es un pointer a un tipo de dato
creado por ti, asi que deberias guardarlo con p->nom,p-edad, obviamente en 2 lineas de codigo.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Qué problema hay en esta línea de código C++?

Publicado por israel (2 intervenciones) el 13/07/2005 06:16:25


Sabes, la verdad es que yo no se programar pero intento ayudar a mo hermana que estudia informatica en el segundo semestre y no sabe como hacer el siguiente programa

construya un programa que permita leer los numeros y despues obtenga el promedio y la frecuencia: Captura los siguientes numeros 3,2,8,2,3,8,1,8,3,1
promedio
frecuencia 1 2
2 2
3 3
8 3

la verdad es que yo no entiendo nada pero ya me interese he estado revisando algunos manuales aqui pero creo que para resolver ese problemita me va a tomar mas de las cinco horas que he estado metido aqui.

te agradeceria que me ayudaras o me aconsejaras, mi nombre es israle
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿Qué problema hay en esta línea de código C++?

Publicado por fernando.gomez (1603 intervenciones) el 13/07/2005 18:30:26
Bueno, como no me gusta hacerle la tarea a nadie, te pediría le preguntes a tu hermana cuáles son sus dudas exáctamente, y con gusto os echo la mano.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar