16 de jun de 2012

Ponteiro para função em C

Quando temos a necessidade de criar uma aplicação que realiza operações genéricas em C, princpipalmente as que representam algorítimos como de busca e ordenação, pode surgir uma dificuldade na hora de fazer algumas operações como de comparação de estruturas desconhecidas, para isto utilizamos o ponteiro para função, e este é o intuito deste artigo mostrar como implementar um ponteiro para função.



Em C tudo é representado por endereços de memória, e as funções são as mesmas coisas, desta forma podemos passar uma função como parametro para outra função e utilizarmos ela ao longo da execução.

Para isso vamos utilizar como exemplo uma função que realiza busca de itens em uma arvore binária, para realizar a comparação dos items devemos utilizar uma função compare, criada em um arquivo:

compare.c



#include "compare.h"


int compare(void *x, void *y)
{
  int *a = (int*)x;
  int *b = (int*)y;
  if(*a == *b)
    return 1;
  if(*a < *b)
    return 0;
  if(*a > *b)
    return 2;
}




Este arquivo deve conter o seu respectivo compare.h


#include <stdlib.h>
#include <stdio.h>

int compare(void *x, void *y);




Agora vamos utulizar essa função, para isto devemos importar a função em um arquivo:

tree.c



#include "compare.h"



NODE search_tree(NODE raiz, int elem, int *compare(void *, void *))
{
  if(compare(raiz->info.key, elem) == 1)
    return raiz;
  if(compare(raiz->info.key, elem) == 0)
    search_tree(raiz->left, elem, compare);
  if(compare(raiz->info.key, elem) == 2)
    search_tree(raiz->right, elem, compare);
}


Desta forma, podemos alterar a forma de comparação na árvore, recebendo qualquer tipo de dados, porém o algorítmo de busca continua intacto.
Pq utilizamos *compare(void *, void *), pois assim como qualquer ponteiro é apenas uma referência para o endereço de memória onde esta a função compare.

Nenhum comentário:

Postar um comentário