找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 4545|回復(fù): 0
打印 上一主題 下一主題
收起左側(cè)

C語言函數(shù)指針,函數(shù)動態(tài)回調(diào)

[復(fù)制鏈接]
跳轉(zhuǎn)到指定樓層
樓主
ID:91442 發(fā)表于 2015-10-29 15:34 | 只看該作者 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式
      經(jīng)常有人問,學(xué)習(xí)這些理論有什么用?我無語了。因?yàn)槎械娜瞬粫䥺栠@種問題;不懂行的人,你再怎么解釋人家也不會明白這個(gè)道理。如果人家追問:“這個(gè)能換錢嗎?”,我就直接SB了。

       這是一個(gè)經(jīng)典的C語言函數(shù)指針,函數(shù)動態(tài)回調(diào)callback例程。寫出來,閑暇時(shí)刻自己可以隨時(shí)學(xué)習(xí),溫故。通過不斷深入學(xué)習(xí)C語言,了解到C++,C#,java都是C語言的兒孫輩,他們都繼承了C語言的至少90%基因。越來越感受到C語言的博大精深。在嵌入式學(xué)習(xí)的路上正真的絆腳石和瓶頸通常都是因?yàn)?/span>C語言不扎實(shí),導(dǎo)致感覺越學(xué)越難。函數(shù)指針與函數(shù)動態(tài)回調(diào)在系統(tǒng)軟件如uc/os-ii操作系統(tǒng),STemWin以及fat32文件系統(tǒng)中常常遇到。函數(shù)動態(tài)回調(diào)的這種程序設(shè)計(jì)模式值得學(xué)習(xí)。

        本例程主要知識點(diǎn):1,冒泡排序算法,2,結(jié)構(gòu)體數(shù)組,3,指向函數(shù)的指針變量,4,函數(shù)回調(diào),5,通過輸入與函數(shù)名相同的字符串調(diào)用相對應(yīng)的函數(shù)(重點(diǎn)!)。


////////////////////////////////////////
.c源碼:////////////////////////////////////////////////////////////


 
#include"stdio.h"
#include"string.h"
//#include"stdlib.h"

/*  函數(shù)指針;即指向函數(shù)的指針變量,函數(shù)名就是函數(shù)的入口地址
int (*PFUN)(int x,int y)=NULL;//3部分:類型,變量名,初值
如:typedef int(*PFUN)(int x,int y);//PFUN就代表返回值是int類型并且?guī)в?個(gè)形參x,y的函數(shù)的入口地址;PFUN就是函數(shù)名
 */
struct Student
char *name;
float score;
int age;
    
};
//typedef struct  Student ST;//這樣定義一個(gè)類型也可以“ST st[4];”

Student st[4]={
{"zhangsan",89,28},
{"lisi",90,24},
{"wangwu",79,20},
{"zhaoda",77,18}
};//結(jié)構(gòu)體數(shù)組

void sort(Student *s,int count)//另一種冒泡排序,從小到大排序;注意:只能傳遞指針!
{
for(int i=0;i<count-1;i++)//第一層循環(huán):從數(shù)列中找出最大數(shù)放到數(shù)列末尾
{
  for(int j=0;j<(count-1-i);j++)//第二層循環(huán):從數(shù)列中找出次大數(shù)放到數(shù)列尾部排序
                {
if(s[j].age>s[j+1].age)
{
 Student temp;
 temp.age=s[j].age;
 s[j].age=s[j+1].age;
                          s[j+1].age=temp.age;//大的往后排一個(gè)位置,通過這一輪count-1-i次循環(huán)就將數(shù)列中最大數(shù)排到了末尾
}
}
 
}
//printf("%s\n\r %.2f\n\r %d\n\r",st[i].name,st[i].score,st[i].age);

}
void display(void)
{
for(int i=0;i<4;i++)
{
    //  sort(st,4);
//  printf("%s\n\r %.2f\n\r %d\n\r",st[i].name,st[i].score,st[i].age);
printf("4個(gè)結(jié)構(gòu)體學(xué)生的年齡從小到大排序: %d\n\r",st[i].age);
     printf("4個(gè)結(jié)構(gòu)體學(xué)生的score從小到大排序: %.2f\n\r",st[i].score);
     printf("4個(gè)結(jié)構(gòu)體學(xué)生的name從小到大排序: %s\n\r",st[i].name);
}

}
typedef int (*PFUN)(int x,int y);//typedef后定義的新類型名
int Sum(int x,int y)//求和函數(shù)
{
return (x+y);
}
int Maxvalue(int x,int y)//求最大值函數(shù)
{
return x>y?x:y;//三目運(yùn)算符,如果x大于y則輸出x,否則輸出y
}
int Minus(int x,int y)//求差值函數(shù)
{
return x-y;//
}
/*
如:Sum1(int x,int y,Sum);//這句就代表實(shí)際上運(yùn)行的是Sum(int x,int y)函數(shù)即“求和”
*/
int Sum1(int x,int y,PFUN Funname)//求和函數(shù)
{
return Funname(x,y);
}
int Maxvalue1(int x,int y,PFUN Funname_Max)//求最大值函數(shù)
{
return Funname_Max(x,y);
//return x>y?x:y;//三目運(yùn)算符,如果x大于y則輸出x,否則輸出y
}
int Minus1(int x,int y,PFUN Funname_Minus)//求差值函數(shù)
{
    return  Funname_Minus(x,y);
//return x-y;//
}
struct FuntionPair
{
   char name[20];
   PFUN Pfun_name;
};
//typedef struct FuntionPair FP;
/* 
定義并初始化一個(gè)FuntionPair結(jié)構(gòu)體數(shù)組;
*/
FuntionPair FPs[3]={
    {"Summ",Sum},
    {"Minus",Minus},
     {"Maxvalue",Maxvalue}
};
//函數(shù)指針,動態(tài)回調(diào),將傳入的字符串名與結(jié)構(gòu)體數(shù)組的字符串
PFUN CallBackWithName(char * Name)
{  
for(int i=0;i<3;i++)//循環(huán)比較
{
      if(strcmp(FPs[i].name,Name)==0)//FPs[i].name是字符串
 {
   return FPs[i].Pfun_name;
  
 }
};
 // return FP[i].Pfun_name;
return Maxvalue;//如果沒有匹配的函數(shù)名,就返回Maxvalue函數(shù),即運(yùn)行該函數(shù)

}
void main(void)
{
   
   PFUN p=Minus;//這里p就可以以int類型函數(shù)函數(shù)名賦值
   int a=p(30,50);
   printf("差值:%d\n\r",a);
   
   PFUN p1=Sum;//這里p就可以以int類型函數(shù)函數(shù)名賦值
   int b=p1(30,50);
   printf("求和:%d\n\r",b);

   PFUN p2=Maxvalue;//這里p就可以以int類型函數(shù)函數(shù)名賦值
   int c=p2(30,50);
   printf("最大值:%d\n\r",c);

   
   int d=Minus1(90,80,Sum);
   printf("回調(diào)函數(shù)例程:%d\n\r",d);
///////////////////////函數(shù)動態(tài)回調(diào)////////////////////
   PFUN p3=CallBackWithName("summ");
   int e=p3(90,80);
   printf("函數(shù)指針例程:%d\n\r",e);
////////////注意打印結(jié)果區(qū)別///////////
   PFUN p4=CallBackWithName("Summ"); //傳入與函數(shù)名相同的字符串就相當(dāng)于執(zhí)行了對應(yīng)的函數(shù)
   int f=p4(90,80);
   printf("函數(shù)指針例程:%d\n\r",f);



   sort(st,4);
   display();


} 

////////////////////////////////////////.c源碼:////////////////////////////////////////////////////////////

   “有修行的人是高尚的!” 。 這句話
送給那些默默無聞的學(xué)習(xí)者,探索者。
                                                                                          by   GKXW
分享到:  QQ好友和群QQ好友和群 QQ空間QQ空間 騰訊微博騰訊微博 騰訊朋友騰訊朋友
收藏收藏 分享淘帖 頂 踩

相關(guān)帖子

回復(fù)

使用道具 舉報(bào)

您需要登錄后才可以回帖 登錄 | 立即注冊

本版積分規(guī)則

手機(jī)版|小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術(shù)交流QQ群281945664

Powered by 單片機(jī)教程網(wǎng)

快速回復(fù) 返回頂部 返回列表