首页 > 代码库 > c语言 ,回调函数[个人理解]

c语言 ,回调函数[个人理解]

回调函数:把需要调用的方法的指针pCallBackFuncX作为参数传递给一个函数UsrFunction,以便该UsrFunction函数在处理相似事件的时候可以灵活的使用不同的方法。

 

 

以在flash中存储有序的交易记录为例:

先假定交易记录的构成为,我们要对其排序然后存储到flash当中去。

这个函数写作: int SortReclist(RECLIST_ST * reclist);

typedef struct {    char cityCode[2] ;            //城市代码 + 应用序列号    char usrName[10];    unsigned char tradeTime[7];      //交易时间【bcd】 年 月 日 时 分 秒    unsigned char TerminalCode[6];   //终端硬件序列号    unsigned char reserve[1];} RECS_ST ;//交易记录typedef struct {    unsigned char count[2] ;    unsigned char max[2] ;    unsigned char data[N_MAX_RECORD][SIZE_OF_RECS];// sizeof(RECS_ST); //要对这里的数据进行排序、去重。    unsigned char check ;} RECLIST_ST;//交易记录列表

我们使用冒泡排序的方法对其中的数据进行排序:

        bubble_sort((unsigned char*)(reclist->data) ,  //pointer to data to sort  待排列的数据                    *(signed short*)( count) ,        //number of elements        待排列的数据个数                    size_rec_element ,                //size of each element == sizeof(RECS_ST) 数据宽度                     (FUNC_AFC_DATA_COMPARE ) reclistcmp , //cmp_func: pointer to comparison function  判定其排列次序的方法,这个是根据需要变换的。                    (FUNC_MEM_SWAP )mem_swap) ;           //mem_swap: pointer to swap function or NULL 内存交换的方法

然后我的函数可以这样写:

int SortReclist(RECLIST_ST * reclist) {    int ret;    unsigned char count[2];     int size_rec_element = sizeof( RECS_ST ) ; //size of each element        do{        memcpy(count , reclist->count , sizeof( count )); //这里是解决mdk对外部全局变量不能正确强转的解决办法,无视
bubble_sort((unsigned
char*)(reclist->data) , //pointer to data to sort *(signed short*)( count) , //number of elements size_rec_element , //size of each element (FUNC_AFC_DATA_COMPARE ) reclistcmp , //cmp_func: pointer to comparison function (FUNC_MEM_SWAP )mem_swap) ; //mem_swap: pointer to swap function or NULL //暂且无视去重 }while(ret!=0) ;
return 0;}
bubble_sort的一般实现如下:
//ret==1: error
//ret==0: ok
int bubble_sort(void *base , //pointer to data to sort int n_elements , //number of elements int size_element , //size of each element FUNC_AFC_DATA_COMPARE cmp_func ,//cmp_func: pointer to comparison function FUNC_MEM_SWAP mem_swap )//mem_swap: pointer to swap function or NULL{ int i, j, flag , cmp ; if( base==0 || cmp_func==0 || mem_swap==0 ){ return 1 ; } for (i=0; i<n_elements-1; i++) { flag = 0; for (j=0; j<n_elements-1-i; j++) { cmp = cmp_func( ((char *)base+size_element*j ) , ((char *)base+size_element*(j+1)) ) ; if ( cmp > 0 ) { mem_swap( ((char *)base+j*size_element) , ((char *)base+(j+1)*size_element) , size_element ); flag = 1; } } if ( !flag ) { break ; } } return 0;}
最后,我们才来关注具体用什么方式来比较数据项。
int
reclistcmp(char *before ,char *next ) { int ret ; ret = memcmp(before ,next , 2); //citycode[2] 简单判定 return ret ;}
typedef void (*FUNC_MEM_SWAP)(void *, void *, int n_bytes)  ;typedef int (*FUNC_AFC_DATA_COMPARE)(const void *, const void *)  ;

 

以回调函数的方式,在写上层函数时,可以不用关心底层某种功能的具体实现,而只是提出这个需求。

这样在处理具体业务时有更高的灵活性,这个功能的具体实现甚至可以交给其他人去完成。

 

c语言 ,回调函数[个人理解]