include typedef void (*fonction_t)(int); void fonction1(int bidon) { printf("%s\n",__PRETTY_FUNCTION__); } void fonction2(int bidon) { printf("%s\n",__PRETTY_FUNCTION__); } void fonction3(int bidon) { printf("%s\n",__PRETTY_FUNCTION__); } typedef struct { const char * commande; fonction_t fonction; } commande_t; commande_t commandes[]= { // triees! {"bong",fonction1}, {"bonjour",fonction1}, {"floc",fonction3}, {"ninja",fonction3}, {"ping",fonction2}, {"plop",fonction1}, {"salut",fonction2}, {"smoke",fonction2}, {"zonk",fonction3}, {0,0}, }; void call_back(const char * cette_commande) { int i=0; while (commandes[i].commande) { if (strcmp(commandes[i].commande,cette_commande)==0) { commandes[i].fonction(3); return; // on a fini! } else i++; } printf("commande inconnue!!1!\n"); } void binary_call_back( const char * cette_commande, int max_commandes ) { // on suppose qu'on connait // le maximum deja! int bas=0; int haut=max_commandes; // a chaque iteration on // choisit une motie de l'intervalle // courant jusqu'a ce que l'on ait // un interval "degenere" // while (bas0) // alors c'est l'intervalle du haut bas=milieu+1; else // sinon, r=0, on a trouve! { commandes[milieu].fonction(5); return; // fini! } } // si on arrive ici, c'est que la commande // n'existe pas! printf("commande inconnue, zutte.\n"); } int main() { call_back("ninja"); call_back("salut"); call_back("zigzig"); binary_call_back("plop",9); binary_call_back("floc",9); binary_call_back("zigzig",9); }