Eu tenho um PIC18F46K22 e programo -o com o compilador XC8. No final, terei um sistema como um PC com stdin
e stdout
. Portanto, no loop principal, haverá uma função que está verificando se há novas entradas. Se houver entrada, uma função será chamada de acordo. Por exemplo, quando eu insiro um A stdin
ativado, o PIC executará uma função como em function_A
vez da function_B
qual é chamada quando insiro um B.
Quando o PIC for concluído com a função, desejo que a nova entrada seja enviada para a função. Portanto, ao pressionar A, o transmissor RS232 é aberto, a partir desse momento todas as entradas serão enviadas pelo RS232. No final, o projeto é um editor de texto independente. Portanto, ao pressionar A, o sistema de arquivos é aberto. A partir desse momento, você não está mais editando textos, mas procurando uma lista de arquivos. Isso significa que pressionar Cima e Baixo significa algo diferente do ambiente de edição de texto.
Pensei muito em como programar isso em C. Pensei nisso ontem à noite e gostaria de saber se é possível e, em caso afirmativo, como. O que eu quero fazer é:
- A
main
função chama uma função comofunction_A
function_A
altera uma variável globalfunction_addr
para o ponteiro de endereço da funçãoin_function_A
- A partir desse momento,
main
chama a funçãofunction_addr
quando houver uma nova entrada.
Então, o que eu precisaria é de uma main
função que verifique se function_addr
é zero. Se for, uma função 'normal' deve ser chamada, como function_A
. Caso contrário, a função at function_addr
deve ser chamada. Eu também preciso de um function_A
que muda function_addr
para um ponteiro para in_function_A
.
Nota: quando a função do sistema de arquivos deve ser fechada, is_function_A
basta mudar function_addr
para 0.
Então, basicamente, minha pergunta é como posso
- Obter o endereço de uma função (e armazená-lo em uma variável)
- Chamar uma função em um endereço especificado
Respostas:
Uma função
Obter o endereço de uma função (e armazená-lo em uma variável)
Chamar uma função em um endereço especificado
fonte
fp(12)
não aumenta a legibilidade(*fp)(12)
. Eles têm legibilidade diferente.(*fp)(12)
lembra o leitor quefp
é um ponteiro e também se assemelha à declaração defp
. Na minha opinião, esse estilo está associado a fontes antigas, como X11 internals e K&R C. Um possível motivo para associar-se ao K&R C é porque, no ANSI C, é possível declararfp
usando a sintaxe da função, sefp
for um parâmetro:int func(int fp(double)) {}
. Em K&R C isso seriaint func(fp) int (*fp)(double); { ... }
.Embora a resposta da Wouters esteja absolutamente correta, talvez isso seja mais amigável para iniciantes e um exemplo melhor em relação à sua pergunta.
Se não for óbvio que o ponteiro da função realmente tem um endereço de função de destino atribuído, é aconselhável executar uma verificação NULL.
fonte
fp
ocupe seja realmente NULL inicialmente. Eu fariaint (*fp)(int) = NULL;
como uma declaração e inicialização combinadas para ter certeza - você não deseja pular para algum local de memória aleatória por causa de algum valor bobo que simplesmente estava lá. Então apenas atribuafp
como em suaExample()
função.fp
for uma "variável global" (como no código acima), é garantido que ela será inicializadaNULL
(sem ter que fazê-lo explicitamente).