Я столкнулся с тем, что мне совершенно непонятно. Есть прототип функции:
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 или это более или менее случайно? Или есть лучший (и рабочий) способ решить эту задачу?
Большое спасибо за любую подсказку. Walter