首页 > 代码库 > 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: okint 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语言 ,回调函数[个人理解]
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。