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