回調(diào)函數(shù)用簡單例子解釋說明書_第1頁
回調(diào)函數(shù)用簡單例子解釋說明書_第2頁
回調(diào)函數(shù)用簡單例子解釋說明書_第3頁
回調(diào)函數(shù)用簡單例子解釋說明書_第4頁
回調(diào)函數(shù)用簡單例子解釋說明書_第5頁
已閱讀5頁,還剩1頁未讀 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(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)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

最新文檔

評論

0/150

提交評論