哈哈哈哈哈操欧洲电影,久草网在线,亚洲久久熟女熟妇视频,麻豆精品色,久久福利在线视频,日韩中文字幕的,淫乱毛视频一区,亚洲成人一二三,中文人妻日韩精品电影

0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

C語(yǔ)言函數(shù)的回調(diào)函數(shù)

工程師 ? 來(lái)源:嵌入式客棧 ? 作者:嵌入式客棧 ? 2020-09-11 09:57 ? 次閱讀
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

來(lái)源:嵌入式客棧

1 什么是回調(diào)函數(shù)?首先什么是“回調(diào)”呢?

我的理解是:把一段可執(zhí)行的代碼像參數(shù)傳遞那樣傳給其他代碼,而這段代碼會(huì)在某個(gè)時(shí)刻被調(diào)用執(zhí)行,這就叫做回調(diào)。

如果代碼立即被執(zhí)行就稱為同步回調(diào),如果過(guò)后再執(zhí)行,則稱之為異步回調(diào)。

回調(diào)函數(shù)就是一個(gè)通過(guò)函數(shù)指針調(diào)用的函數(shù)。如果你把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),當(dāng)這個(gè)指針被用來(lái)調(diào)用其所指向的函數(shù)時(shí),我們就說(shuō)這是回調(diào)函數(shù)。

回調(diào)函數(shù)不是由該函數(shù)的實(shí)現(xiàn)方直接調(diào)用,而是在特定的事件或條件發(fā)生時(shí)由另外的一方調(diào)用的,用于對(duì)該事件或條件進(jìn)行響應(yīng)。

2 為什么要用回調(diào)函數(shù)?因?yàn)榭梢园颜{(diào)用者與被調(diào)用者分開(kāi),所以調(diào)用者不關(guān)心誰(shuí)是被調(diào)用者。它只需知道存在一個(gè)具有特定原型和限制條件的被調(diào)用函數(shù)。

簡(jiǎn)而言之,回調(diào)函數(shù)就是允許用戶把需要調(diào)用的方法的指針作為參數(shù)傳遞給一個(gè)函數(shù),以便該函數(shù)在處理相似事件的時(shí)候可以靈活的使用不同的方法。

int Callback() ///《 回調(diào)函數(shù){ // TODO return 0;}int main() ///《 主函數(shù){ // TODO Library(Callback); ///《 庫(kù)函數(shù)通過(guò)函數(shù)指針進(jìn)行回調(diào) // TODO return 0;}

回調(diào)似乎只是函數(shù)間的調(diào)用,和普通函數(shù)調(diào)用沒(méi)啥區(qū)別。

但仔細(xì)看,可以發(fā)現(xiàn)兩者之間的一個(gè)關(guān)鍵的不同:在回調(diào)中,主程序把回調(diào)函數(shù)像參數(shù)一樣傳入庫(kù)函數(shù)。

這樣一來(lái),只要我們改變傳進(jìn)庫(kù)函數(shù)的參數(shù),就可以實(shí)現(xiàn)不同的功能,這樣有沒(méi)有覺(jué)得很靈活?并且當(dāng)庫(kù)函數(shù)很復(fù)雜或者不可見(jiàn)的時(shí)候利用回調(diào)函數(shù)就顯得十分優(yōu)秀。

3 怎么使用回調(diào)函數(shù)?int Callback_1(int a) ///《 回調(diào)函數(shù)1{ printf(“Hello, this is Callback_1: a = %d ”, a); return 0;}int Callback_2(int b) ///《 回調(diào)函數(shù)2{ printf(“Hello, this is Callback_2: b = %d ”, b); return 0;}int Callback_3(int c) ///《 回調(diào)函數(shù)3{ printf(“Hello, this is Callback_3: c = %d ”, c); return 0;}int Handle(int x, int (*Callback)(int)) ///《 注意這里用到的函數(shù)指針定義{ Callback(x);}int main(){ Handle(4, Callback_1); Handle(5, Callback_2); Handle(6, Callback_3); return 0;}

如上述代碼:可以看到,Handle()函數(shù)里面的參數(shù)是一個(gè)指針,在main()函數(shù)里調(diào)用Handle()函數(shù)的時(shí)候,給它傳入了函數(shù)Callback_1()/Callback_2()/Callback_3()的函數(shù)名,這時(shí)候的函數(shù)名就是對(duì)應(yīng)函數(shù)的指針,也就是說(shuō),回調(diào)函數(shù)其實(shí)就是函數(shù)指針的一種用法。

4 回調(diào)函數(shù)實(shí)例(很有用)一個(gè)GPRS模塊聯(lián)網(wǎng)的小項(xiàng)目,使用過(guò)的同學(xué)大概知道2G、4G、NB等模塊要想實(shí)現(xiàn)無(wú)線聯(lián)網(wǎng)功能都需要經(jīng)歷模塊上電初始化、注冊(cè)網(wǎng)絡(luò)、查詢網(wǎng)絡(luò)信息質(zhì)量、連接服務(wù)器等步驟,這里的的例子就是,利用一個(gè)狀態(tài)機(jī)函數(shù)(根據(jù)不同狀態(tài)依次調(diào)用不同實(shí)現(xiàn)方法的函數(shù)),通過(guò)回調(diào)函數(shù)的方式依次調(diào)用不同的函數(shù),實(shí)現(xiàn)模塊聯(lián)網(wǎng)功能,如下:

/********* 工作狀態(tài)處理 *********/typedef struct{ uint8_t mStatus; uint8_t (* Funtion)(void); //函數(shù)指針的形式} M26_WorkStatus_TypeDef; //M26的工作狀態(tài)集合調(diào)用函數(shù)/************************************************ 》M26工作狀態(tài)集合函數(shù)***********************************************/M26_WorkStatus_TypeDef M26_WorkStatus_Tab[] ={ {GPRS_NETWORK_CLOSE, M26_PWRKEY_Off }, //模塊關(guān)機(jī) {GPRS_NETWORK_OPEN, M26_PWRKEY_On }, //模塊開(kāi)機(jī) {GPRS_NETWORK_Start, M26_Work_Init }, //管腳初始化 {GPRS_NETWORK_CONF, M26_NET_Config }, /AT指令配置 {GPRS_NETWORK_LINK_CTC, M26_LINK_CTC }, //連接調(diào)度中心 {GPRS_NETWORK_WAIT_CTC, M26_WAIT_CTC }, //等待調(diào)度中心回復(fù) {GPRS_NETWORK_LINK_FEM, M26_LINK_FEM }, //連接前置機(jī) {GPRS_NETWORK_WAIT_FEM, M26_WAIT_FEM }, //等待前置機(jī)回復(fù) {GPRS_NETWORK_COMM, M26_COMM }, //正常工作 {GPRS_NETWORK_WAIT_Sig, M26_WAIT_Sig }, //等待信號(hào)回復(fù) {GPRS_NETWORK_GetSignal, M26_GetSignal }, //獲取信號(hào)值 {GPRS_NETWORK_RESTART, M26_RESET }, //模塊重啟}/************************************************ 》M26模塊工作狀態(tài)機(jī),依次調(diào)用里面的12個(gè)函數(shù) ***********************************************/uint8_t M26_WorkStatus_Call(uint8_t Start){ uint8_t i = 0; for(i = 0; i 《 12; i++) { if(Start == M26_WorkStatus_Tab[i].mStatus) { return M26_WorkStatus_Tab[i].Funtion(); } } return 0;}

所以,如果有人想做個(gè)NB模塊聯(lián)網(wǎng)項(xiàng)目,可以copy上面的框架,只需要修改回調(diào)函數(shù)內(nèi)部的具體實(shí)現(xiàn),或者增加、減少回調(diào)函數(shù),就可以很簡(jiǎn)潔快速的實(shí)現(xiàn)模塊聯(lián)網(wǎng)。

聲明:本文內(nèi)容及配圖由入駐作者撰寫或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    183

    文章

    7645

    瀏覽量

    146056
  • 函數(shù)
    +關(guān)注

    關(guān)注

    3

    文章

    4420

    瀏覽量

    67788
收藏 人收藏
加入交流群
微信小助手二維碼

掃碼添加小助手

加入工程師交流群

    評(píng)論

    相關(guān)推薦
    熱點(diǎn)推薦

    函數(shù)指針與調(diào)函數(shù)解讀

    函數(shù)指針是指向函數(shù)的指針變量。通過(guò)函數(shù)指針C語(yǔ)言可以實(shí)現(xiàn)各種強(qiáng)大的功能與設(shè)計(jì)方法。而回調(diào)
    發(fā)表于 01-19 07:34

    C語(yǔ)言函數(shù)指針的六個(gè)高級(jí)的應(yīng)用場(chǎng)景

    函數(shù)指針是一種非常強(qiáng)大的編程工具,它可以讓我們以更加靈活的方式編寫程序。在本文中,我們將介紹 6 個(gè)函數(shù)指針的高級(jí)應(yīng)用場(chǎng)景,并貼出相應(yīng)的代碼案例和解釋。 調(diào)
    發(fā)表于 01-04 12:25

    C語(yǔ)言調(diào)函數(shù)原來(lái)這么簡(jiǎn)單

    ” 這個(gè)概念,它是調(diào)函數(shù)能夠?qū)崿F(xiàn)的重要基礎(chǔ)。 1、函數(shù)指針學(xué)習(xí)過(guò)C語(yǔ)言的伙伴都知道,
    發(fā)表于 12-30 06:45

    調(diào)函數(shù)例子的應(yīng)用

    1、一個(gè)四則運(yùn)算的簡(jiǎn)單調(diào)函數(shù)例子: #include #include /**************************************** * 函數(shù)指針結(jié)
    發(fā)表于 12-11 07:23

    怎么使用回調(diào)函數(shù)

    : b = %d \", b); return 0; } int Callback_3(int c)///< 調(diào)函數(shù)3 { printf(\"Hello
    發(fā)表于 12-11 06:22

    LUA例程-常用的調(diào)函數(shù)使用說(shuō)明

    詳細(xì)說(shuō)明LUA腳本函數(shù)功能和對(duì)應(yīng)的應(yīng)用實(shí)例。對(duì)于LUA腳本編程有很大的幫助和提高技能。
    發(fā)表于 11-24 16:43 ?0次下載

    大彩講堂:VisualHMI-LUA教程-on_screen_change調(diào)函數(shù)使用指南

    on_screen_change調(diào)函數(shù)使用指南
    的頭像 發(fā)表于 08-31 16:32 ?1086次閱讀
    大彩講堂:VisualHMI-LUA教程-on_screen_change<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>使用指南

    大彩講堂:VisualHMI-LUA教程-on_update調(diào)函數(shù)使用指南

    調(diào)函數(shù)使用指南
    的頭像 發(fā)表于 08-31 16:25 ?1035次閱讀
    大彩講堂:VisualHMI-LUA教程-on_update<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>使用指南

    詳解hal_entry入口函數(shù)

    當(dāng)使用RTOS時(shí),程序從main函數(shù)開(kāi)始進(jìn)行線程調(diào)度;當(dāng)沒(méi)有使用RTOS時(shí),C語(yǔ)言程序的入口函數(shù)main函數(shù)調(diào)用了hal_entry
    的頭像 發(fā)表于 07-25 15:34 ?2187次閱讀

    C語(yǔ)言中的內(nèi)聯(lián)函數(shù)與宏

    C編程中,內(nèi)聯(lián)函數(shù)和宏都用于避免函數(shù)調(diào)用的開(kāi)銷并編寫可復(fù)用的邏輯部分,但它們?cè)诠ぷ鞣绞胶桶踩苑矫娲嬖陲@著差異。
    的頭像 發(fā)表于 07-25 15:10 ?2036次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>中的內(nèi)聯(lián)<b class='flag-5'>函數(shù)</b>與宏

    大彩講堂:VisualHMI-LUA教程-on_press調(diào)函數(shù)使用指南

    一、適合范圍本文檔適用于VisualHMI平臺(tái),Lua腳本語(yǔ)言為V5.3版本,配合工程可以完成大部分的內(nèi)部邏輯處理。二、概述on_press(state,x,y)觸摸回調(diào)函數(shù),當(dāng)帶觸摸的串口屏,點(diǎn)擊
    的頭像 發(fā)表于 07-23 16:32 ?1356次閱讀
    大彩講堂:VisualHMI-LUA教程-on_press<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>使用指南

    大彩講堂:VisualHMI-LUA教程-on_run調(diào)函數(shù)使用指南

    一、適合范圍本文檔適用于VisualHMI平臺(tái),Lua腳本語(yǔ)言為V5.3版本,配合工程可以完成大部分的內(nèi)部邏輯處理。二、概述on_run(screen)周期調(diào)函數(shù),用該回
    的頭像 發(fā)表于 07-23 15:25 ?1241次閱讀
    大彩講堂:VisualHMI-LUA教程-on_run<b class='flag-5'>回</b><b class='flag-5'>調(diào)</b><b class='flag-5'>函數(shù)</b>使用指南

    為什么中斷調(diào)函數(shù)中不能使用接收中斷開(kāi)啟函數(shù)

    我看(書(shū)是基于stm32f407編寫)書(shū)上說(shuō)在串口接收中斷調(diào)函數(shù)里面不能使用 接收中斷開(kāi)啟函數(shù),書(shū)上是利用自己創(chuàng)建了空閑中斷
    發(fā)表于 05-28 07:19

    如何使用自定義設(shè)置調(diào)函數(shù)

    你好,我正在嘗試編寫自己的自定義設(shè)置調(diào)函數(shù),并使用 fastEnum=false。 是否有任何代碼示例或資料可供我參考? void CyU3PUsbRegisterSetupCallback
    發(fā)表于 05-21 06:11

    為什么中斷調(diào)函數(shù)中不能使用接收中斷開(kāi)啟函數(shù)

    我看(書(shū)是基于stm32f407編寫)書(shū)上說(shuō)在串口接收中斷調(diào)函數(shù)里面不能使用 接收中斷開(kāi)啟函數(shù),書(shū)上是利用自己創(chuàng)建了空閑中斷
    發(fā)表于 04-22 08:19
    泊头市| 玛纳斯县| 呼图壁县| 镇原县| 揭西县| 新邵县| 威海市| 如东县| 历史| 清丰县| 通州区| 广东省| 和龙市| 皋兰县| 海门市| 札达县| 莒南县| 澳门| 卓资县| 昆明市| 保定市| 濮阳市| 铜梁县| 云和县| 大新县| 昔阳县| 闵行区| 宜昌市| 聂拉木县| 阳城县| 江山市| 莒南县| 沙坪坝区| 留坝县| 南开区| 平陆县| 依安县| 新乡市| 博兴县| 商城县| 宜章县|