Ponteiros para Funções
Posted on jun 23, 2008 under C, Sem categoria | 2 ComentáriosPonteiros para funções é algo extremamente interessante, eficiente e elegante. Pode ser usado para substituir switch-case, definir em tempo de execução qual função deve ser chamada ou implementar callbacks.
Ponteiros para funções são na realidade ponteiros que apontam para o endereço de uma função. Uma função possui um endereço de memória. Quando o programa é executado todo seu conteúdo é colocado na memória, então uma função é como um variável do tipo inteira, nada mais que um endereço de memória.
Então para demonstrar esse conceito, desenvolvi um código em C ANSI , que tem a função de uma calculadora de 4 operações, onde o usuário informa o primeiro valor, o operador + – * ou /, e o segundo valor, e o programa em tempo de execução escolhe a função a ser chamada.
Este pequeno exemplo de código mostra como é possível substituir o switch-case e chamar funções em tempo de execução.
#include#include float adicao(float a, float b) {return a+b;}; float subtracao(float a, float b) {return a-b;}; float multiplicacao(float a, float b) {return a*b;}; float divisao(float a, float b) {return a/b;}; int main() { float(*pt2Func[4])(float, float) = {NULL}; float(*Func)(float, float) = NULL; pt2Func['+'] = &adicao; pt2Func['-'] = &subtracao; pt2Func['/'] = &divisao; pt2Func['*'] = &multiplicacao; float a; float b; char operator; while(1) { printf("Informe a: "); scanf("%f",&a); printf("\nInforme operador: "); scanf(" %c",&operator); printf("\nInforme b: "); scanf(" %f",&b); if(operator != '-' && operator != '+' && operator != '*' && operator != '/' ) { printf("Operação não implementada"); exit(-1); } Func = pt2Func[operator]; printf("\nResultado: %f\n", Func(a,b)); printf("\nDeseja Continuar (y/n):"); scanf(" %c",&operator); if(operator == 'n' || operator == 'N') break; Func = NULL; } exit(0); }
Como funciona
A partir da linha 3 até a linha 7 definimos as funções que irão realizar a adição, multiplicação, divisão e subtração note que todas as funções possuem o mesmo protótipo.
Na linha 11 declaramos um ponteiro array que também possui o mesmo protótipo das funções. Esse é uma detalhe importante. O nosso array de ponteiros tem 4 posições onde iremos informar o valor de cada posição e o endereço da função que é feito nas linhas 14,15,16 e 17. Definimos como posição os símbolos da operações matemáticas então quando o usuário escolher uma soma informa o símbolo + e o programa por sua vez aponta para a função desejada isso acontece na linha 40.
O restante do programa é um loop onde após cada cálculo é solicitado ao usuário se deseja continuar ou não.
Este programa foi compilado com o gcc no linux.
Caso tenha dúvida sobre o funcionamento deixe um comentário.
Para saber mais: O livro C completo e Total é muito bom vale a pena ter esse livro na estante.
UPDATE: Este código está disponível no repositório git http://github.com/petryx/

…
…
Sou um fã incondicional da linguagem C e quero parabenizá-lo pelo excelente post. Aliás, pelo excelente blog que a partir de agora constará em meus favoritos.