Ver Mensaje Individual
  #36 (permalink)  
Antiguo 24/09/2006, 03:03
Nivel7
 
Fecha de Ingreso: abril-2006
Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 1 mes
Puntos: 2
Bueno, en realidad me refiero a que he probado tu algoritmo, y no me funciona, mas que con los miembros char.

con los miembros int, e incluso char*, no funciona.


(puntero_miembro-(long)(&((nombre_estructura *)0)->nombre_miembro))

esta es la base de tu algoritmo.

como podemos ver, el offset siempre sera un long, entonces:

el offset de Nombre es = 0;
el offset de Edad es = 4;
el offset de Pais es = 8;
el offset de Ciudad es = 12;
el offset de calle es = 16;
el offset de Piso es = 20;
el offset de Letra es = 21;

Direccion de miFicha: (&miFicha) = 2293584; (0x22FF50 en exadecimal).

la direccion del miembro Nombre(&miFicha.Nombre) es = 2293584;
en decimal(0x22FF50 en exadecimal).

la operacion es: 2293584 - 0 = 2293584;
en este caso vemos que funciona, pero no por que la operacion este bien sino que se estan restando 0.

con el miembro Edad la operacion sería:
la operacion es: 2293588 - 4 = (en este caso pensariamos: correcto el resultado el 2293584).
pero no, ya que estamos restado a un puntero a int.(la direccion de int)
es decir la resta en bytes será:
2293588 - 4* (sizeof(tipo)). y en este caso tipo es int.(la operacion real es esta: 2293588 - 16);
el resultado es: 2293572; y la direccion buscada es 2293584;(error).

esto ocurrira con todos los miembros a escepcion de char.
ya que sizeof de char es 1 y no causa problemas en la aritmetica.

en mi algoritmo evito tener este problema, haciendo el casting a char*, esto le permite al compilador ver al miembro de la estructura como un array de caracteres, y la resta se hace byte a byte.

otra opcion sin castings tan orribles es convertir a long la direccion del miembro de la estructura en cuestion:

por tanto el algoritmo correcto sería:

((long)puntero_miembro-(long)(&((nombre_estructura *)0)->nombre_miembro))



Saludos.

Última edición por Nivel7; 24/09/2006 a las 03:42