C массивы указателей на функции - PullRequest
0 голосов
/ 25 мая 2018

У меня есть три массива функций, каждый из которых указывает на несколько функций.

Я могу вызвать любую из этих функций из трех таблиц.

Теперь я хотел бы разыменовать три массива водин массив указателей на функции, но я просто не могу заставить его работать!

void afunc1(void);
void afunc2(void);
void afunc3(void);
void bfunc1(void);
void bfunc2(void);
void bfunc3(void);
void cfunc1(void);
void cfunc2(void);
void cfunc3(void);

void(*FuncTbla[])(void) = { afunc1, afunc2, afunc3 };
void(*FuncTblb[])(void) = { bfunc1, bfunc2, bfunc3 };
void(*FuncTblc[])(void) = { cfunc1, cfunc2, cfunc3 };

void (*AllFuncTbls[])(void) = { &FuncTbla, &FuncTblb, &FuncTblc };

int TblNo = 1, FuncNo = 1; // tblNo 1 = table b

bFunc2(); // calls bFunc2 directly

FuncTblb[FuncNo](); // Calls Function bFunc2 via function table b

// Call same function using table of function tables
AllFuncTbls[TblNo][FuncNo](); // Does not compile - expression must be a pointer to a complete object type!!!

Ответы [ 3 ]

0 голосов
/ 25 мая 2018

Если вы используете typedefs, это работает:

void afunc1(void);
// ...

typedef void (*funcPtr)(void);
// void(*FuncTbla[])(void) = { afunc1, afunc2, afunc3 };
// ...
funcPtr FuncTbla[] = { afunc1, afunc2, afunc3 };
funcPtr FuncTblb[] = { bfunc1, bfunc2, bfunc3 };
funcPtr FuncTblc[] = { cfunc1, cfunc2, cfunc3 };

//void (*AllFuncTbls[])(void) = { &FuncTbla, &FuncTblb, &FuncTblc };
funcPtr* AllFuncTbls[] = { FuncTbla, FuncTblb, FuncTblc };
// Use an Array of pointers to function pointers here, not an array of function pointers!

// ...    

// Call same function using table of function tables
AllFuncTbls[TblNo][FuncNo](); // Compiles now

Я закомментировал строки, которые нужно было изменить.

0 голосов
/ 25 мая 2018

Использование typealiases - лучший подход, но если вы были бодры, как это сделать без него:

void(**AllFuncTbls[])(void) = { FuncTbla, FuncTblb, FuncTblc};
0 голосов
/ 25 мая 2018

Две вещи: прежде всего помните, что массивы естественным образом распадаются на указатели на их первый элемент;И во-вторых, это станет намного проще, если вы будете использовать псевдонимы типов для типов функций.

Вооружившись этими знаниями, вы можете сделать это, например,

// Type-alias to simplify using function pointers
typedef void (*function_type)(void);

// The three tables
function_type FuncTbla[] = { &afunc1, &afunc2, &afunc3 };
function_type FuncTblb[] = { &bfunc1, &bfunc2, &bfunc3 };
function_type FuncTblc[] = { &cfunc1, &cfunc2, &cfunc3 };

// A table of pointers to the first elements of each array
function_type *AllFuncTbls[] = { FuncTbla, FuncTblb, FuncTblc };

Для вызова функции с помощью AllFuncTbls так же просто, как

AllFuncTbls[TblNo][FuncNo]();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...