回调函数在泛型算法中的应用---同步机制

来源:互联网 发布:瘦小腿 知乎 编辑:程序博客网 时间:2024/06/06 09:29
/* generics.h */#ifndef GENERICS_H#define GENERICS_Htypedef int (*cmp_t)(void *, void *);extern void *max(void *data[], int num, cmp_t cmp);#endif
/* generics.c */#include "generics.h"void *max(void *data[], int num, cmp_t cmp){     int i;     void *temp = data[0];     for(i=1; i<num; i++) {  if(cmp(temp, data[i])<0)       temp = data[i];     }     return temp;}
/* main.c */#include <stdio.h>#include "generics.h"typedef struct {     const char *name;     int score;} student_t;int cmp_student(void *a, void *b){     if(((student_t *)a)->score > ((student_t *)b)->score)  return 1;     else if(((student_t *)a)->score == ((student_t *)b)->score)  return 0;     else  return -1;}int main(void){     student_t list[4] = {{"Tom", 68}, {"Jerry", 72},       {"Moby", 60}, {"Kirby", 89}};     student_t *plist[4] = {&list[0], &list[1], &list[2], &list[3]};     student_t *pmax = max((void **)plist, 4, cmp_student);     printf("%s gets the highest score %d/n", pmax->name, pmax->score);     return 0;}


max函数之所以能对一组任意类型的对象进行操作,关键在于传给max的是指向对象的指针所构成的数组,而不是对象本身所构成的数组,这样max不必关心对象到底是什么类型,只需转给比较函数cmp,然后根据比较结果做相应操作即可,cmp是调用者提供的回调函数,调用者当然知道对象是什么类型以及如何比较。



原创粉丝点击