Ver Mensaje Individual
  #47 (permalink)  
Antiguo 26/09/2006, 11:54
fightmx
 
Fecha de Ingreso: febrero-2003
Ubicación: D.F.
Mensajes: 163
Antigüedad: 21 años, 3 meses
Puntos: 22
Cita:
Claro pero a ver, una solución sin macros, es posible alcanzarla, pero como lo propones lo único que haces es perder simplicidad, velocidad, memoria, y de todo.

Si no te gustan las "macros" porque leíste que son "malas", no hagas mucho caso a eso ;)

Hay cosas, como esta, en las que son necesarias.
Estoy de acuerdo con eso.


Ahora en lo que refiere Nivel7 yeap, si solo queda:
Código:
(nombre_estructura *)(puntero_miembro-(long)(&((nombre_estructura *)0)->nombre_miembro));
de esta forma esta bien a medias, solo funciona cuando el tipo del puntero_miembro es char.
(Ya se ha explicado del porque)

Lo comento porque yo en mi tercer intento de solución(jejeje) me di cuenta de eso, y la solución que mandé fue:
Código:
(nombre_estructura *)((char*)puntero_miembro-(int)(&((nombre_estructura *)0)->nombre_miembro));

solo vease que si

void * p = 0;

entonces

(char*)p + 1 seria igual a 1
(short*)p + 1 seria igual a 2
(int*)p + 1 seria igual a 4

no es lo mismo sumarle 1 a un puntero de tipo char a que a uno de tipo short o que a uno de tipo int, lo mismo si le sumamos un entero n(avanzariamos el puntero n elementos del tipo del puntero mas allá del actualmente apuntado), y lo mismo si fuera el caso de la resta.

viendolo asip podemos decir que no es lo mismo

(char*)puntero_miembro - offset
que...
(short*)puntero_miembro - offset
que...
(int*)puntero_miembro - offset
...por ejemplo.

Por otro lado tiene sentido la resta entre 2 punteros del mismo tipo mas no la suma, por ejemplo

int *a = (int*)0x04;
int *b = (int*)0x10;

de donde b - a = -(a - b) = 3; (para este caso)

Que seria como preguntarse cuantos elementos del mismo tipo se pueden almacenar entre una dirección y otra.
Pero la suma??...creo que ni siquiera se permite.

Saludos.