He encontrado algo que completamente no entiendo. Hay un prototipo de función:Puntero de función con GCC, asignando una dirección
typedef void (* TMain) (void);
y una variable de función:
TMain myFunc = MyFunc;
...
myFunc();
Esto funciona bien, por supuesto. ¿Por qué no debería?
Desde el MAP-archivo que he saben que "MyFunc" está en la localización 0x20100. Y ahora lo gracioso. Después de la asignación "myFunc = MyFunc;" la variable "myFunc" no contiene contiene el valor 0x20100, sino 0x20101!
Mi problema es que tengo que llamar a una función de la que sé que la dirección de una tabla. Así que pensé que podría hacerlo así
myFunc = (TMain) myTable [ 5 ]; // that would be 0x20100
myFunc(); // which produces a proper crash
Sin embargo Si hago
myFunc = (TMain) ((Int8 *) myTable [ 5 ] + 1);
myFunc();
entonces funciona.
¿Qué sucede aquí? ¿Siempre tengo que agregar un desplazamiento de 1 o esto es más o menos accidental? ¿O existe una forma mejor (y funcional) para realizar la tarea?
Gracias mucho por cualquier indicio. Walter
No estoy seguro, pero esto podría depender de la arquitectura. Por lo tanto, podría querer decir cuál es la arquitectura de destino. – phimuemue
¿La matriz 'myTable' del tipo' TMain [] '? Supongo que no es así porque lo estás lanzando. –
Algunas preguntas para usted: ¿Qué plataforma está usando (ARM, x86 ...)? ¿Alguna vez ha comprobado la dirección real de la función con un depurador? ¿Puedes ver cómo el compilador genera la llamada indirecta "myFunc()"? –