[C con Clase] Serializar variables

Ferran Ferri ferranferri en gmail.com
Sab Mar 13 12:01:23 CET 2010


Hola Steven,
muchas grecias por tu respuesta. Mi forma de hacerlo cuando fallaba era asi:

void toArray(unsigned char* data)
{
	int a = 3;
	long b = 444;
	int *pA = &a;
	long *pB = &b;

	cout << "Valor de *pA " <<*pA <<endl;
	memcpy(data,(unsigned char*)pA,sizeof(int));
	data+=sizeof(int);
	cout << "Valor de *pB " <<*pB <<endl;
	memcpy(data,(unsigned char*)pB,sizeof(long));
	data+=sizeof(long);
}
Y fallaba por el incremento de data (lo hacia mal aunque no se por
que. Asi se corregia:

void toArray(unsigned char* data)
{
	int a = 3;
	long b = 444;
	int *pA = &a;
	long *pB = &b;

	cout << "Valor de *pA " <<*pA <<endl;
	memcpy(data,(unsigned char*)pA,sizeof(int));
	cout << "Valor de *pB " <<*pB <<endl;
	memcpy(data + sizeof(int),(unsigned char*)pB,sizeof(long));
	data+=sizeof(long);
}

Tu solucion, sin embargo, me parece mucho mas elegante. Pero me genera
dudas. Que diferencia hay entre reinterpret cast y static cast ademas
de que static cast fuerza el que se haga en tiempo de compilacion?
Y la segunda duda es que cuando se acumulan variables no puedo ir
sumando cada vez para ponerme en la posicion del array. Serviria algo
como
*reinterpret_cast< int * >( data++ ) = a;
*reinterpret_cast< long * >( data++ ) = b;  // si tuvieramos que meter
mas variables
Al haber reinterpretado el puntero, y hacer post incremento,
avanzariamos un int en la primera sentencia y un long en la segunda,
no es asi?

La tercera es mas offtopic. Si la funcion toArray la tengo en una
clase (es un metodo), donde deberia hacer la reserva de memoria. El
borrado es responsabilidad de quien usa la funcion cuando ya no la
necesita. Pero la creacion podriamos hacerla dentro de la funcion
(esta seria mi eleccion), puesto que ya sabemos cuanto espacio
necesitamos, o exigir que se cree fuera, y comprobar que o sea null,
puesto que tenemos que separar responsabilidades. Que opinais?
Ferran



2010/3/12 Steven Davidson <srd4121 en njit.edu>:
> *reinterpret_cast< int * >( data ) = a;
> *reinterpret_cast< long * >( data+sizeof(int) ) = b;




Más información sobre la lista de distribución Cconclase