Сблъсках се с нещо, което напълно не разбирам. Има прототип на функция:
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