當前位置:首頁 » 編程語言 » c語言狀態機和回調函數
擴展閱讀
webinf下怎麼引入js 2023-08-31 21:54:13
堡壘機怎麼打開web 2023-08-31 21:54:11

c語言狀態機和回調函數

發布時間: 2022-11-03 06:32:33

c語言的回調函數怎麼用,請幫忙舉例說明

看一下這個例子吧,我是這樣理解的:
#include
"iostream.h"
#include
"windows.h"
typedef
void
(CALLBACK
*MyFun)(void);//回調函數定義
void
CALLBACK
callback()
//
回調函數
{
cout<<"****callback****\n";
}
void
Call_CallBack(MyFun
mycb)
{
cout<<"****Call_CallBack****\n";
mycb();
cout<<"__________________\n";
}
void
main()
{
Call_CallBack(callback);
}
//
其他人需要修改的話只要修改callback函數里的內容就行了,一般sdk封裝後都會有回調,這樣他人在調用sdk的時候就可以實現回調函數里的內容。
如果你需要理論的,網上搜回調函數,內容哈多隨便看

㈡ 回調函數(callback)是什麼 ,,

回調函數就是一個被作為參數傳遞的函數。在C語言中,回調函數只能使用函數指針實現,在C++、Python、ECMAScript等更現代的編程語言中還可以使用仿函數或匿名函數。

回調函數的使用可以大大提升編程的效率,這使得它在現代編程中被非常多地使用。同時,有一些需求必須要使用回調函數來實現。

最著名的回調函數調用有C/C++標准庫stdlib.h/cstdlib中的快速排序函數qsort和二分查找函數bsearch中都會要求的一個與strcmp類似的參數,用於設置數據的比較方法。

意義

因為可以把調用者與被調用者分開,所以調用者不關心誰是被調用者。它只需知道存在一個具有特定原型和限制條件的被調用函數。簡而言之,回調函數就是允許用戶把需要調用的函數的指針作為參數傳遞給一個函數,以便該函數在處理相似事件的時候可以靈活的使用不同的方法。

㈢ c++ c語言回調函數怎麼辦

1、回調類似於事件相應。當系統在某個事情發生的時候會調用你指定的方法。這個方法先定義好,並等待系統來調用。比如Hook(系統鉤子)就是給窗口設置一個函數地址,然後系統會自動的調用你的函數。這就是回調了。

㈣ c語言的回調函數

你的問題是什麼

㈤ C語言中的回調函數實在搞不懂

typedef struct
{
int a;
void (*pshow)(int);
}TMP;

void func(TMP *tmp)
{
if(tmp->a >10)//如果a>10,則執行回調函數。
{
(tmp->pshow)(tmp->a);
}
}

void show(int a)
{
printf("a的值是%d\n",a);
}

void main()
{
TMP test;
test.a = 1;
test.pshow = show;
func(&test);
}

這只是舉例,一般回調函數的用法為:
甲方進行結構體的定義(成員中包括回調函數的指針)

乙方定義結構體變數,並向甲方注冊,
甲方收集N個乙方的注冊形成結構體鏈表,在某個特定時刻遍歷鏈表,進行回調。

㈥ C語言的回調函數怎麼用,請幫忙舉例說明

看一下這個例子吧,我是這樣理解的:
#include
"iostream.h"
#include
"windows.h"
typedef
void
(CALLBACK
*MyFun)(void);//回調函數定義
void
CALLBACK
callback()
//
回調函數
{
cout<<"****callback****\n";
}
void
Call_CallBack(MyFun
mycb)
{
cout<<"****Call_CallBack****\n";
mycb();
cout<<"__________________\n";
}
void
main()
{
Call_CallBack(callback);
}
//
其他人需要修改的話只要修改callback函數里的內容就行了,一般sdk封裝後都會有回調,這樣他人在調用sdk的時候就可以實現回調函數里的內容。
如果你需要理論的,網上搜回調函數,內容哈多隨便看

㈦ 關於回調函數的詳細講解

回調函數2010年03月09日 星期二 上午 10:20
對指針的應用是C語言編程的精髓所在,而回調函數就是C語言裡面對函數指針的高級應用。簡而言之,回調函數是一個通過函數指針調用的函數。如果你把函數指針(函數的入口地址)傳遞給另一個函數,當這個函數指針被用來調用它所指向的函數時,我們就說這個函數是回調函數。
為什麼要使用回調函數呢?我們先看一個小例子:
Node * Search_List (Node * node, const int value)
{
while (node != NULL)
{
if (node -> value == value)
{
break;
}
node = node -> next;
}
return node;
}

這個函數用於在一個單向鏈表中查找一個指定的值,返回保存這個值的節點。它的參數是指向這個鏈表第一個節點的指針以及要查找的值。這個函數看上去很簡單,但是我們考慮一個問題:它只能適用於值為整數的鏈表,如果查找一個字元串鏈表,我們不得不再寫一個函數,其實大部分代碼和現在這個函數相同,只是第二個參數的類型和比較的方法不同。

其實我們更希望令查找函數與類型無關,這樣它就能用於查找存放任何類型值的鏈表了,因此必須改變比較的方式,而藉助回調函數就可以達到這個目的。我們編寫一個函數(回調函數),用於比較兩個同類型的值,然後把一個指向這個函數的指針作為參數傳遞給查找函數,查找函數調用這個比較函數來執行比較,採用這個方法,任何類型的值得都可以進行比較。

我們還必須給查找函數傳遞一個指向待比較的值的指針而不是值本身,也就是一個void *類型的形參,這個指針會傳遞給回調函數,進行最終的比較。這樣的修改可以讓我們傳遞指向任何類型的指針到查找函數,從而完成對任何類型的比較,這就是指針的好處,我們無法將字元串、數組或者結構體作為參數傳遞給函數,但是指向它們的指針卻可以。

現在,我們的查找函數就可以這樣實現:
NODE *Search_List(NODE *node, int (*compare)(void const *, void const *) , \
void const *desired_value);
{
while (node != NULL)
{
if (compare((node->value_address), desired_value) == 0)
{
break;
}
node = node->next;
}
return node;
}

可以看到,用戶將一個函數指針傳遞給查找函數,後者將回調這個函數。
注意這里我們的鏈表節點是這樣定義的:

typedef struct list
{
void *value_address;
struct list *next;
}NODE;

這樣定義可以讓NODE *類型的指針指向存儲任何類型數據的鏈表節點。而value_address就是指向具體數據的指針,我們把它定義為void *,表示一個指向未知類型的指針,這樣鏈表就可以存儲任何類型的數據了,而我們傳遞給查找函數Search_List的第一個參數就可以統一表示為:NODE *,否則,還是要分別寫查找函數以適應存儲不同數據類型的鏈表。

現在,查找函數與類型無關,因為它不進行實際的比較,因此,我們必須編寫針對不同類型的比較函數,這是很容易實現的,因為調用者知道鏈表中所包含的值的類型,如果創建幾個分別包含不同類型值的鏈表,為每種類型編寫一個比較函數就允許單個查找函數作用於所有類型的鏈表。

下面是一個比較函數,用於在一個整型鏈表中查找:

注意強制類型轉換,比較函數的參數必須被聲明為void *以匹配查找函數的原型,然後強制轉換為(int *)類型用於比較整型。
int int_compare(void const *a, void const *b)
{
if (*(int *)a == *(int *)b)
{
return 0;
}
else
{
return -1;
}
}

這個函數可以這樣被使用:

desired_node = Search_List(root, int_compare, &desired_int_value);

如果你希望在一個字元串鏈表中進行查找,下面的代碼就可以完成任務:

desired_node = Search_List(root, strcmp, 「abcdefg」);

正好庫函數strcmp所執行的比較和我們需要的一樣,不過gcc會發出警告信息:因為strcmp的參數被聲明為const char *而不是void const *。

上面的例子展示了回調函數的基本原理和用法,回調函數的應用是非常廣泛的。通常,當我們想通過一個統一介面實現不同內容的時候,用回調函數來實現就非常合適。任何時候,如果你所編寫的函數必須能夠在不同的時刻執行不同的類型的工作或者執行只能由函數調用者定義的工作,你都可以用回調函數來實現。許多窗口系統就是使用回調函數連接多個動作,如拖拽滑鼠和點擊按鈕來指定調用用戶程序中的某個特定函數。

㈧ c語言中有關回調函數的概念。

1. 是的。
2. 不直接在search_link內部調用compare的好處是:可以將任意名稱的函數當作參數傳遞,只要它們的返回類型,參數類型一致就OK,這樣更具靈活性。

㈨ C語言的回調函數

callback Function
回調函數是應用程序提供給Windows系統DLL或其它DLL調用的函數,一般用於截獲消息、獲取系統信息或處理非同步事件。應用程序把回調函數的地址指針告訴DLL,而DLL在適當的時候會調用該函數。回調函數必須遵守事先規定好的參數格式和傳遞方式,否則DLL一調用它就會引起程序或系統的崩潰。通常情況下,回調函數採用標准WindowsAPI的調用方式,即__stdcall,當然,DLL編制者可以自己定義調用方式,但客戶程序也必須遵守相同的規定。在__stdcall方式下,函數的參數按從右到左的順序壓入堆棧,除了明確指明是指針或引用外,參數都按值傳遞,函數返回之前自己負責把參數從堆棧中彈出。
理解回調函數!

程序在調用一個函數(function)時(通常指api).相當於程序(program)呼叫(Call)了一個函數(function)關系表示如下:
call(調用)
program --------------------→ dll

程序在調用一個函數時,將自己的函數的地址作為參數傳遞給程序調用的函數時(那麼這個自己的函數稱回調函數).需要回調函數的 DLL 函數往往是一些必須重復執行某些操作的函數.關系表示如下:

call(調用)
program --------------------→ dll
↑ ¦
¦_______________________________¦
callback(回調)

當你調用的函數在傳遞返回值給回調函數時,你就可以利用回調函數來處理或完成一定的操作。至於如何定義自己的回調函數,跟具體使用的API函數有關,很多不同類別的回調函數有各種各樣的參數,有關這些參數的描述一般在幫助中有說明回調函數的參數和返回值等.其實簡單說回調函數就是你所寫的函數滿足一定條件後,被DLL調用!

也有這樣的說法(比較容易理解):
回調函數就好像是一個中斷處理函數,系統在符合你設定的條件時自動調用。為此,你需要做三件事:
1. 聲明;
2. 定義;
3. 設置觸發條件,就是在你的函數中把你的回調函數名稱轉化為地址作為一個參數,以便於DLL調用。

㈩ c語言回調函數究竟有什麼用處我覺的用普通的函數調用替換也可以,謝謝

從功能上來說 普通函數也是可以的
但在比較大的程序設計中 會對很多功能模塊進行封裝
比如 上層一個模塊
底層一個模塊

同時規定,上層可以調用底層的函數,但是底層不可以調用上層函數。
這時就需要使用回調函數。
通過上層調用底層的注冊回調借口,傳入回調指針。
實現底層通知上層的作用。

另外 回調函數的一個好處是,可以通過回調函數,調用不同介面。
比如接收數據,不同數據需要不同的解析函數。
但是接收數據的流程是相同的
這樣 使用回調函數,在接收數據的時候就可以不用判斷,而是自動使用不同的解析函數。

總之 使用回調函數,可以降低耦合,實現多樣性。