
24/09/2006, 03:03
|
| | Fecha de Ingreso: abril-2006 Ubicación: Acapulco Gro. México
Mensajes: 483
Antigüedad: 18 años, 10 meses 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 |