回調函數

話說這是我的第一篇技術博客....................好吧,廢話還是不多說,進入正題:

回調函數,也是反反覆覆反反覆覆琢磨了好久,感覺還是沒有深刻理解到,現在寫出來,和大家一起討論..........

簡單一點說,如果函數的參數是一個函數指針,調用者通過調用該函數向它傳入一個函數的地址,讓該函數去實現它,這就稱爲回調函數如:函數A有一個參數爲函數指針類型,那麼我們就可以傳入一個函數的地址給A,A就會去執行這個函數。不懂?呵呵,我們舉個例子:

例如我有一個API函數A,張三需要我的A函數爲他調用B來實現某個功能,那麼我就可以在程序A中寫道:

A()
{
   ......
   B();
   ......
}
過了幾天,李四想用我的A函數來調用C來實現某個功能,那麼我就得把A的程序改一下,變成
A()
{
  ......
   C();
   ......
}

又過了幾天,王五也想用我的A函數來調用D來實現某個功能,這下我就煩了,整天改來改去多麻煩啊,有沒有好的方法讓我提供一個統一的API呢?這裏就體現出回調函數的好處來了!

下面是我利用回調函數的特性來寫的一個泛型函數,該函數的功能是在任意一組對象中求出其最大值,該對象可以是char型,也可以是int型......不多說了,直接看程序吧:

#include <stdio.h>
 
typedef int (*cmp_t) (void*, void*);

typedef struct student
{   
	char* name; 
	int score;
}student_t;
 
int cmp_char_data(void* a, void* b)
{   
	char para1 = *((char*)a);
	char para2 = *((char*)b); 
	
	if(para1 > para2) {
		return 1;
	}
	else if(para1 == para2)	{
		return 0;  
	} 
	else{
		return -1;
	}     
}
                       
int cmp_int_data(void* a, void* b)
{   
	int para1 = *((int*)a);
	int para2 = *((int*)b);
	
	if(para1 > para2) {
		return 1;
	}
	else if(para1 == para2){
		return 0;
	}
	else	{
		return -1;
	}
}
	
int cmp_double_data(void* a, void* b)
{   
	double para1 = *((double*)a);
	double para2 = *((double*)b);
	
	if(para1 > para2) {
		return 1;
	}
	else {
		return -1;
	}  
}

int cmp_struct_data(void* a, void* b)
{   
	student_t* para1 = (student_t*)a;
	student_t* para2 = (student_t*)b;
	
	if(para1->score > para2->score) {
		return 1; 
	}
	else if(para1->score == para2->score) {
		return 0;
	
	}
	else	{
		return -1;
	}  
}

void* max(void* data, int num, int size, cmp_t cmp)
{
	void *temp = data;
	int i; 
	    
	for(i = 1; i < num; i++) {   
		if(cmp(temp, data + size*i) < 0) {     
			temp = data+size*i;
		}   
	}
	   
	return temp;
}

int main()
{ 
	char c_data[5] = {'a', 'n', 'k', 'p', 'c'};
	int i_data[5]={1, 20, 50, 300,12};
	double d_data[5] = {20.2, 130.5, 100.12, 200.23, 45.6};
	student_t st_data[5] = {{"stu1", 56}, {"stu1", 85}, {"stu1", 65}, {"stu1", 96}, {"stu1", 72}}; 
  
	char max1 = *((char*)max(c_data, 5, sizeof(char), cmp_char_data));
	int max2 = *((int*)max(i_data, 5, sizeof(int), cmp_int_data)); 
	double max3 = *((double*)max(d_data, 5, sizeof(double), cmp_double_data)); 
	student_t* max4 = (student_t*)max(st_data, 5, sizeof(student_t), cmp_struct_data); 
  
	printf("%c\t%d\t%lf\t%d\n", max1, max2, max3, max4->score); 
	getchar();
  
	return 0;
}


歡迎大家指正,無論是格式,邏輯.....什麼都好,共同進步!


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章