Я столкнулся с чем-то, чего совершенно не понимаю. Есть прототип функции:
typedef void ( * TMain ) ( void );
и функциональная переменная:
TMain myFunc = MyFunc;
...
myFunc ();
Это, конечно, отлично работает. Почему бы и нет.
Из MAP-файла я знаю, что MyFunc находится по адресу 0x20100. А теперь самое смешное. После присвоения «myFunc = MyFunc;» переменная "myFunc" не содержит значение 0x20100, а скорее 0x20101!
Моя проблема в том, что мне нужно вызвать функцию, адрес которой я знаю из таблицы. Так что я подумал, что смогу сделать это так
myFunc = ( TMain ) myTable [ 5 ]; // that would be 0x20100
myFunc (); // which produces a proper crash
Однако если я это сделаю
myFunc = ( TMain ) ( ( Int8 * ) myTable [ 5 ] + 1 );
myFunc ();
тогда это работает.
Что здесь происходит? Всегда ли мне нужно добавлять смещение 1 или это более или менее случайно? Или есть лучший (и рабочий) способ выполнить задачу?
Большое спасибо за любой намек. Уолтер
myTable
типаTMain[]
? Я предполагаю, что это не так, поскольку вы его разыгрываете. - person Blagovest Buyukliev   schedule 01.02.2012int myTable[N]
вы можете сделатьTMain myTable[N]
, а позже вам не понадобится приведение:myfunc = myTable[5]
, или вы вызываете напрямуюmytable[5]()
, даже если вы выполняете приведение функций для заполнения массива, это будет работать правильно. - person Bort   schedule 01.02.2012