




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進(jìn)行舉報或認(rèn)領(lǐng)
文檔簡介
1/1回調(diào)函數(shù)用簡單例子解釋-說明書
回調(diào)函數(shù)的運(yùn)用
對指針的應(yīng)用是C語言編程的精髓所在,而回調(diào)函數(shù)就是C語言里面對函數(shù)指針的高級應(yīng)用。簡而言之,回調(diào)函數(shù)是一個通過函數(shù)指針調(diào)用的函數(shù)。假如你把函數(shù)指針(函數(shù)的入口地址)傳遞給另一個函數(shù),當(dāng)這個函數(shù)指針被用來調(diào)用它所指向的函數(shù)時,我們就說這個函數(shù)是回調(diào)函數(shù)。
為什么要使用回調(diào)函數(shù)呢?我們先看一個小例子:
Node*Search_List(Node*node,constintvalue)
{
while(node!=NULL)
{
if(node-value==value)
{
break;
}
node=node-next;
}
returnnode;
}這個函數(shù)用于在一個單向鏈表中查找一個指定的值,返回保存這個值的節(jié)點(diǎn)。它的參數(shù)是指向這個鏈表第一個節(jié)點(diǎn)的指針以及要查找的值。這個函數(shù)看上去很簡潔,但是我們考慮一個問題:它只能適用于值為整數(shù)的鏈表,假如查找一個字符串鏈表,我們不得不再寫一個函數(shù),其實(shí)大部分代碼和現(xiàn)在這個函數(shù)相同,只是其次個參數(shù)的類型和比較的方法不同。其實(shí)我們更盼望令查找函數(shù)與類型無關(guān),這樣它就能用于查找存放任何類型值的鏈表了,因此必需轉(zhuǎn)變比較的方式,而借助回調(diào)函數(shù)就可以達(dá)到這個目的。我們編寫一個函數(shù)(回調(diào)函數(shù)),用于比較兩個同類型的值,然后把一個指向這個函數(shù)的指針作為參數(shù)傳遞給查找函數(shù),查找函數(shù)調(diào)用這個比較函數(shù)來執(zhí)行比較,采納這個方法,任何類型的值得都可以進(jìn)行比較。
我們還必需給查找函數(shù)傳遞一個指向待比較的值的指針而不是值本身,也就是一個void*類型的形參,這個指針會傳遞給回調(diào)函數(shù),進(jìn)行最終的比較。這樣的修改可以讓我們傳遞指向任何類型的指針到查找函數(shù),從而完成對任何類型的比較,這就是指針的好處,我們無法將字符串、數(shù)組或者結(jié)構(gòu)體作為參數(shù)傳遞給函數(shù),但是指向它們的指針卻可以。
現(xiàn)在,我們的查找函數(shù)就可以這樣實(shí)現(xiàn):
NODE*Search_List(NODE*node,int(*compare)(voidconst*,voidconst*),\
voidconst*desired_value);
回調(diào)函數(shù)的運(yùn)用
while(node!=NULL)
{
if(compare((node-value_address),desired_value)==0)
{
break;
}
node=node-next;
}
returnnode;
}
可以看到,用戶將一個函數(shù)指針傳遞給查找函數(shù),后者將回調(diào)這個函數(shù)。
留意這里我們的鏈表節(jié)點(diǎn)是這樣定義的:
typedefstructlist
{
void*value_address;
structlist*next;
}NODE;這樣定義可以讓NODE*類型的指針指向存儲任何類型數(shù)據(jù)的鏈表節(jié)點(diǎn)。而
value_address就是指向詳細(xì)數(shù)據(jù)的指針,我們把它定義為void*,表示一個指向未知類型的指針,這樣鏈表就可以存儲任何類型的數(shù)據(jù)了,而我們傳遞給查找函數(shù)Search_List的第一個參數(shù)就可以統(tǒng)一表示為:NODE*,否則,還是要分別寫查找函數(shù)以適應(yīng)存儲不同數(shù)據(jù)類型的鏈表。
現(xiàn)在,查找函數(shù)與類型無關(guān),由于它不進(jìn)行實(shí)際的比較,因此,我們必需編寫針對不同類型的比較函數(shù),這是很簡單實(shí)現(xiàn)的,由于調(diào)用者知道鏈表中所包含的值的類型,假如創(chuàng)建幾個分別包含不同類型值的鏈表,為每種類型編寫一個比較函數(shù)就允許單個查找函數(shù)作用于全部類型的鏈表。
下面是一個比較函數(shù),用于在一個整型鏈表中查找:
留意強(qiáng)制類型轉(zhuǎn)換,比較函數(shù)的參數(shù)必需被聲明為void*以匹配查找函數(shù)的原型,然后強(qiáng)制轉(zhuǎn)換為(int*)類型用于比較整型。
intint_compare(voidconst*a,voidconst*b)
{
if(*(int*)a==*(int*)b)
回調(diào)函數(shù)的運(yùn)用
return0;
}
else
{
return-1;
}
}
這個函數(shù)可以這樣被使用:
desired_node=Search_List(root,int_compare,desired_int_value);假如你盼望在一個字符串鏈表中進(jìn)行查找,下面的代碼就可以完成任務(wù):
desired_node=Search_List(root,strcmp,“abcdefg”);正好庫函數(shù)strcmp所執(zhí)行的比較和我們需要的一樣,不過gcc會發(fā)出警告信息:由于strcmp的參數(shù)被聲明為constchar*而不是voidconst*。上面的例子展現(xiàn)了回調(diào)函數(shù)的基本原理和用法,回調(diào)函數(shù)的應(yīng)用是特別廣泛的。通常,當(dāng)我們想通過一個統(tǒng)一接口實(shí)現(xiàn)不同內(nèi)容的時候,用回調(diào)函數(shù)來實(shí)現(xiàn)就特別合適。任何時候,假如你所編寫的函數(shù)必需能夠在不同的時刻執(zhí)行不同的類型的工作或者執(zhí)行只能由函數(shù)調(diào)用者定義的工作,你都可以用回調(diào)函數(shù)來實(shí)現(xiàn)。很多窗口系統(tǒng)就是使用回調(diào)函數(shù)連接多個動作,如拖拽鼠標(biāo)和點(diǎn)擊按鈕來指定調(diào)用用戶程序中的某個特定函數(shù)。
「回調(diào)函數(shù)是由系統(tǒng)調(diào)用的」——callback不是由系統(tǒng)調(diào)用的。正確的流程為:
1.
2.
3.
4.
5.
6.用戶的輸入設(shè)備發(fā)送信息給devicedriver。Devicedriver將信息發(fā)給某些manager程序。比如說,大多數(shù)鼠標(biāo)和鍵盤動作都會傳給windowmanager。Windowmanager會把這些動作翻譯成event,通過IPC機(jī)制傳給app。App的UIframework會把這些通過IPC接受到的event放到event-queue中。你自己,或者UIframework會運(yùn)行一個loop。這個loop不停的去e
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 保山2025年云南保山施甸縣審計局招聘編外合同制崗位人員筆試歷年參考題庫附帶答案詳解
- 科技與環(huán)保的完美結(jié)合-太陽能技術(shù)的未來展望
- 兼職合同范本飯店
- 2025遼寧沈陽地鐵三號線招安檢員和安保員筆試參考題庫附帶答案詳解
- K-8794-生命科學(xué)試劑-MCE
- 中山2025年廣東中山市阜沙鎮(zhèn)人民政府招聘合同制工作人員筆試歷年參考題庫附帶答案詳解
- 東營2025年山東東營市市屬事業(yè)單位招聘81人筆試歷年參考題庫附帶答案詳解
- 現(xiàn)代醫(yī)療技術(shù)中的石墨烯研究進(jìn)展及市場預(yù)測
- 科技類培訓(xùn)課程實(shí)踐與成效的全面分析
- 電子商務(wù)安全技術(shù)在市場應(yīng)用中的探討
- DL∕T 712-2010 發(fā)電廠凝汽器及輔機(jī)冷卻器管選材導(dǎo)則
- 項(xiàng)賢明主編馬工程教材《教育學(xué)原理》第七章-課程
- (2024年秋季版)2024年七年級道德與法治下冊 4.9.1 生活需要法律教案 新人教版
- 血液透析安全注射臨床實(shí)踐專家共識解讀課件
- 2024年湖南大眾傳媒職業(yè)技術(shù)學(xué)院單招職業(yè)適應(yīng)性測試題庫附答案
- 旅游學(xué)概論(第五版)課件 第一章 旅游學(xué)概述
- 學(xué)生課后服務(wù)活動記錄表
- 義務(wù)教育信息科技課程標(biāo)準(zhǔn)(2022年版)解讀
- CRRT的精細(xì)化護(hù)理
- 部編小學(xué)語文單元作業(yè)設(shè)計一年級下冊第二單元
- (高清版)DZT 0282-2015 水文地質(zhì)調(diào)查規(guī)范(1:50000)
評論
0/150
提交評論