Basicamente, quero ter uma lista de funções como uma matriz de ponteiros de função; então, gostaria de gerenciar uma variável de índice nessa matriz e uma variável de ponteiro que aceitaria valores dessa matriz. Considere o seguinte código C ilustrando isso, que compila bem:
#include <stdio.h>
void func_01() {
printf("func_01\n");
}
void func_02() {
printf("func_02\n");
}
void func_03() {
printf("func_02\n");
}
enum func_choice_e {
eFUNC01 = 0,
eFUNC02 = 1,
eFUNC03 = 2,
#define _NUM_FUNC_CHOICE 3
NUM_FUNC_CHOICE = _NUM_FUNC_CHOICE,
};
typedef enum func_choice_e func_choice_t;
void* funcs_ptrs[_NUM_FUNC_CHOICE] = {
&func_01,
&func_02,
&func_03,
};
func_choice_t my_func_choice_idx = eFUNC01;
void* my_func_choice_ptr = &func_01;
int main()
{
my_func_choice_idx = eFUNC02;
my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
printf("Hello World %p\n", my_func_choice_ptr);
return 0;
}
Como mostra o código acima, dentro do código posso definir a variável de ponteiro por meio da variável de índice ( my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
).
No entanto, gostaria de fazer algo semelhante, também para a inicialização - em última análise, gostaria apenas de inicializar os valores da matriz e my_func_choice_idx
manualmente primeiro - e, em seguida, fazer com que o ponteiro fosse inicializado automaticamente para o elemento my_func_choice_idx
th correspondente na matriz; então, em vez do inicializador de ponteiro de trabalho:
void* my_func_choice_ptr = &func_01;
... Eu tentei estes:
//void* my_func_choice_ptr = funcs_ptrs[my_func_choice_idx]; // error: initializer element is not constant
//void* my_func_choice_ptr = funcs_ptrs[eFUNC01]; // error: initializer element is not constant
//void* my_func_choice_ptr = funcs_ptrs[0]; // error: initializer element is not constant
... e como as mensagens de erro nos comentários sugerem, nada disso funciona.
Eu meio que entendo por que funcs_ptrs[my_func_choice_idx]
pode falhar - my_func_choice_idx
afinal, é uma variável - mas quando o compilador chega a my_func_choice_ptr = funcs_ptrs[0];
, ele já deve "saber" o endereço, o tamanho e os valores iniciais de funcs_ptrs
-> então não vejo por que não pode definir my_func_choice_ptr
a primeira entrada de funcs_ptrs
?!
Então - existe alguma sintaxe que eu possa usar para inicialização, que me permitirá inicializar a variável de ponteiro para um determinado valor inicial de uma entrada na matriz (semelhante à atribuição my_func_choice_ptr = funcs_ptrs[my_func_choice_idx];
que funciona no código normal)?
Você está declarando os ponteiros de função errados. Os ponteiros de função não são
void*
, mas precisam ter a assinatura adequada:que você pode usar assim:
Se você deseja inicializá-lo usando
my_func_choice_idx
, não pode fazê-lo globalmente, pois não é uma constante, mas pode fazê-lo emmain
: