Ponteiros para Funções

Posted on jun 23, 2008 under C, Sem categoria | 1 Comentário

Ponteiros 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/

One Response to “Ponteiros para Funções”

Leave a Reply