久久久久久久999_99精品久久精品一区二区爱城_成人欧美一区二区三区在线播放_国产精品日本一区二区不卡视频_国产午夜视频_欧美精品在线观看免费

 找回密碼
 立即注冊

QQ登錄

只需一步,快速開始

搜索
查看: 17224|回復: 3
收起左側

C語言回調函數熟練---使用方法(構建程序框架方便好用)

[復制鏈接]
ID:71477 發表于 2015-1-1 19:40 | 顯示全部樓層 |閱讀模式
通俗點不行嗎?啊,不行嗎?老外把國人玩的都不是人了。國人還自己玩自己。非把一個簡單的東西復雜化。叫那么難理解!!窩里斗。。。。。。典型!!!!!!!!
不說那么復雜的,誰是狗屎,豬屎。就說怎么用回調。
使用步驟:
1.寫一個函數A,A里面有一個參數是個指針函數 比如: int shao(int a,int (*Pcall)(void *p))
2.有個指針函數參數,那他要指向一個函數,OK,寫一個符合格式的函數B 比如 int CaoDan(int c)
3.使用A函數吧,參數賦值后,指針指向了一個函數地址,不就調用了嗎 比如 shao(36,CaoDan);
說明:A通過指針調用了B函數,函數執行語句里面,要用到指針才行啊。不然,光指向了。有個屁用啊!!
int shao(int a,int (*Pcall)(void *p))
{
    int PA;
    int PS;
    (*Pcall)(a); //指針函數的參數賦值,就看你了。想賦值誰都行。
    (*Pcall)(PS);
    (*Pcall)(PA);  
}
void main()
{
    shao(3,AFuc);//指向具體函數AFunc首地址
    shao(5,BFuc);
}
完畢,就是這么用的。
簡單說:函數參數里有函數指針,指針指向的是函數地址,不是變量地址。這樣,函數你就可以隨便寫,都可以用這個回調函數當一個參數來調用,多方便。程序通用性就更強了!!!哇哇哇!!!!

//注意:指針函數寫法,*函數名要用括號括起來啊
/****************************************************************************/

簡單舉例: void Callback_shao(int a , int (*diaoba) (int a,int b))//指針函數直接在參數里聲明
              {
                   int can;
(*diaoba)(can,a);//要用這指針函數啊,而且參數要賦值
    (*diaoba)(22,33); //參數要賦值
                (*diaoba)(a,can);//指針函數的參數寫什么,就隨便你了
                  
}
              這個指針參數,到時候指向哪個函數。函數里面執行的,就是哪個函數
        //下面是具體函數
void  nixie(int fan , int cao) //函數1,參數個數符合回調函數的那個指針函數
   {
     里面隨便你啦!!。。。。
}
Void nixiangxie(int  mei  ,int  zhao)//函數2
{
     里面隨便你啦。。。。
}
void main()  //主函數
{
     Callback_shao(1,nixie); //回調時,只寫函數名就行了。指針嘛,類似指向數組首地址寫法
     Callback_shao(324,nixiangxie);
}
/****************************************************************************/
也可以用typedef 自定義,下面使用指針函數就可以直接用函數名了
typdef int
(*diaoba) (int a,int b);
diaoba  PCallA;//重新定義一個函數指針
diaoba  PcallB;
void Callback_shao(int a ,PcallB); //參數里就可以直接寫函數名

主函數里。。。。
void main
{
   Callback_shao(3,nixie);
}

/**************************************************************/


回調函數例子:
#include <stdio.h>
void printWelcome(int len)  //函數實現,回調函數會調用它,要自己先寫好。
{
       printf("Welcom -- %d\n", len);
}
void printGoodbye(int len) //函數實現,回調函數會調用它,要自己先寫好。
{
       printf("Goodbye -- %d\n", len);
}
void callback(int times, void (* print)(int)) //回調函數,有個參數是個函數指針
{
       int i;
       print(i);//指針函數你要用到他,不用它,他回調個屁啊!!
       print(times);//指針函數你要用,不用它,他回調個屁啊!!!
}
void main(void)
{
       callback(10, printWelcome); //傳入具體的函數地址
      callback(10, printGoodbye);//傳入具體的函數地址
       printWelcome(5);
}
/******************************************************************************************************************/
回調函數的寫法,還有幾種,下面的參考

#include<stdio.h>
// 方法指針的格式為:int (*ptr)(char *p) 即:返回值(指針名)(參數列表)
typedef int (*CallBackFun)(char *p); // 為回調函數命名,類型命名為 CallBackFun,參數為char *p 。

程序舉例:
typedef int (*CallBackFun)(char *p); //這是回調函數,自定義成了一個別名CallBackFun
int Afun(char *p)
{
printf("Afun 回調打印出字符%s!\n", p);
return 0;
}
int Cfun(char *p)
{ // 方法 Bfun,格式符合 CallBackFun 的格式,因此可以看作是一個 CallBackFun
printf("Cfun 回調打印:%s, Nice to meet you!\n", p);
return 0;
}
/*********************************************************************/
//調用者要先寫好這個回調函數的實例。才能調用 回調函數。回調函數相當于制定規則的,但具體函數體,函數名,函數實現不細化,具體細則還得調用者自己實現(即回調函數的實現)。
int call(CallBackFun pCallBack, char *p)  //寫法1,
{    // 執行回調函數,方式一:通過命名方式
printf("call 直接打印出字符%s!\n", p);
pCallBack(p);//指針函數要寫在里面,不用它,回調個屁啊!!!
return 0;
}
/*********************************************************************/
int call2(char *p, int (*ptr)())
{     // 執行回調函數,方式二:直接通過方法指針
printf("==============\n", p);
(*ptr)(p);  //指針函數要寫在里面,不用它,回調個屁啊!!!
}
/*********************************************************************/
int call3(char *p, CallBackFun pCallBack)
{      // 執行回調函數,方式一:通過命名方式
printf("--------------\n", p);
pCallBack(p); //指針函數要寫在里面,不用它,回調個屁啊!!!
}
/*********************************************************************/
int main()
{   
char *p = "hello";
call(Afun, p);   //調用Afun回調函數,傳遞參數*P給Afun函數
call(Cfun, p); //調用Cfun回調函數,傳遞參數*P給Afun函數
call2(p, Afun); //調用Afun回調函數,傳遞參數*P給Afun函數
    call2(p, Cfun); //調用Cfun回調函數,傳遞參數*P給Afun函數
call3(p, Afun);  //調用Afun回調函數,傳遞參數*P給Afun函數
    call3(p, Cfun); //調用Cfun回調函數,傳遞參數*P給Afun函數
// int i = getchar();
// printf("Input: %c \n", i);
return 0;
}
/*********************************************************************/
Linux下的編譯、輸出:
[jhliu@localhost src]$ gcc -o func_callback func_callback.c
[jhliu@localhost src]$ ./func_callback
call 直接打印出字符hello!
Afun 回調打印出字符hello!
==============
call 直接打印出字符hello!
Cfun 回調打印:hello, Nice to meet you!
==============
Afun 回調打印出字符hello!
==============
Cfun 回調打印:hello, Nice to meet you!
--------------
Afun 回調打印出字符hello!
--------------
Cfun 回調打印:hello, Nice to meet you!
[jhliu@localhost src]$
/*****************下面是少占魚測試通過的用法舉例(vc6.0)***********************************/
#include "iostream.h"
#define uint8 unsigned int
typedef void (*halCBack_t) (uint8 keys, uint8 state); //指針函數,注意加了自定義typedef后,下面才能重命名

void KeyCallback ( uint8 keys, uint8 state ); //具體實現函數
void LEDCallback ( uint8 keys, uint8 state ); //具體實現函數
int Ligback( uint8 keys, uint8 state ); //具體實現函數
void HalKeyConfig (uint8 st, halCBack_t cback);//注意指針函數加了typedef后,這里才能當關鍵字聲明
void ShiYong (uint8 ffff, int (*halCBack_t) (uint8 keys, uint8 state));//如果指針函數沒有typedef,要這樣使用
//注意指針函數加了自定義typedef后,這里才能定義,否則報錯
halCBack_t pHalKeyProcessFunction=KeyCallback; //聲明指針函數變量并指向一個具體函數地址

halCBack_t taskCall[]=
{
KeyCallback,
LEDCallback  
}; //指針函數數組

void main()
{
HalKeyConfig( 1, KeyCallback ); //調用該函數,參數里的指針函數指針指向具體函數即可
HalKeyConfig( 2, LEDCallback );  
taskCall[0](11,11);
taskCall[1](22,22);
ShiYong(33,Ligback);
(*pHalKeyProcessFunction)(44,44); //指針函數具體使用
}
void HalKeyConfig (uint8 st, halCBack_t cback)//某個函數,調用指針函數作參數
{
    cback(st,st);
}
void ShiYong (uint8 fa, int (*halCBack_t) (uint8 keys, uint8 state))
{
  (*halCBack_t) (fa, fa);
  cout<<"使用"<<endl;
}
void KeyCallback ( uint8 keys, uint8 state ) //具體實現函數
{
   cout<<"按鍵函數"<<keys<<state<<endl;
   
}

void LEDCallback ( uint8 keys, uint8 state ) //具體實現函數
{
  cout<<"LED函數"<<keys<<state<<endl;
}

int Ligback( uint8 keys, uint8 state ) //具體實現函數
{
  cout<<"Lig函數"<<keys<<state<<endl;
  return 1;
}

回復

使用道具 舉報

ID:62890 發表于 2015-1-4 08:48 | 顯示全部樓層
學習了
回復

使用道具 舉報

ID:476556 發表于 2020-3-18 09:40 | 顯示全部樓層
學習了,簡單粗暴的樓主
回復

使用道具 舉報

ID:89515 發表于 2020-6-1 15:35 來自觸屏版 | 顯示全部樓層
學習了,干貨很好!!!!
回復

使用道具 舉報

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

本版積分規則

小黑屋|51黑電子論壇 |51黑電子論壇6群 QQ 管理員QQ:125739409;技術交流QQ群281945664

Powered by 單片機教程網

快速回復 返回頂部 返回列表
主站蜘蛛池模板: 嫩草视频网站 | 成人在线一区二区三区 | 国产欧美精品一区二区 | 国产特黄一级 | 欧美精品在线播放 | 成人小视频在线观看 | 欧美片网站免费 | 国产精品一区久久久 | 亚洲精品久久久久久一区二区 | 欧美aaaaa| 天天天天天天操 | 欧美视频免费 | 国产成人精品免高潮在线观看 | 亚洲综合在 | 中日韩欧美一级片 | 欧美一区视频 | 亚洲一区二区 | 欧美一级在线观看 | 国产1区2区3区 | 中文字幕精品一区二区三区精品 | 欧美性猛交一区二区三区精品 | 天堂一区在线观看 | 国内精品在线视频 | 91色在线| 五月激情婷婷六月 | m豆传媒在线链接观看 | 看av网| 综合一区 | 欧美视频网| 久久久精品网 | 日韩天堂av | 尤物视频在线免费观看 | 一区二区三区av夏目彩春 | 激情a| 亚洲精品视频在线看 | 国产精品亚洲精品日韩已方 | 欧美日韩一区二区三区四区 | 日本精品一区二区三区在线观看视频 | 久久久久久久久久久久一区二区 | 亚洲国产精品一区二区第一页 | 超级碰在线 |