Ho riscontrato qualcosa che non capisco completamente. C'è un prototipo di funzione:Puntatore funzione con GCC, assegnazione di un indirizzo
typedef void (* TMain) (void);
e una variabile funzione di:
TMain myFunc = MyFunc;
...
myFunc();
Questo funziona bene, naturalmente. Perché non dovrebbe?
Dal file MAP so che "MyFunc" è in posizione 0x20100. E ora la cosa divertente. Dopo l'assegnazione "myFunc = MyFunc;" la variabile "myFunc" non contiene il valore 0x20100 ma piuttosto 0x20101!
Il mio problema è che devo chiamare una funzione di cui conosco l'indirizzo da una tabella. Così ho pensato che avrei potuto farlo in quel modo
myFunc = (TMain) myTable [ 5 ]; // that would be 0x20100
myFunc(); // which produces a proper crash
se faccio
myFunc = (TMain) ((Int8 *) myTable [ 5 ] + 1);
myFunc();
allora funziona.
Cosa succede qui? Devo sempre aggiungere un offset di 1 o è più o meno accidentale? Oppure c'è un modo migliore (e funzionante) per eseguire l'operazione?
Grazie mille per ogni suggerimento. Walter
Non sicuro, ma potrebbe dipendere dall'architettura. Quindi potrebbe voler dire quale sia l'architettura di destinazione. – phimuemue
L'array 'myTable' di tipo' TMain [] '? Presumo che non lo sia da quando lo stai lanciando. –
Alcune domande per voi: quale piattaforma state usando (ARM, x86 ...)? Hai mai controllato l'indirizzo effettivo della funzione con un debugger? Riesci a vedere come il compilatore genera la chiamata indiretta "myFunc()"? –