量化交易系統開發程式碼部署方案丨合約量化系統開發技術成熟原始碼流程

Tg_StPv888發表於2023-02-22

回撥函式其實就是在一個函式裡面呼叫了另一個函式,而呼叫哪個函式是由呼叫回撥函式的人決定,舉個簡單例子:

int add(int a,int b){
    return a+b;}int sub(int a,int b){
    return a-b;}typedef int (*pfunc)(int a,int b);int func_callback(pfunc p,int a,int b){
	return(*p)(a,b);}void main(void){
    func_callback(add,1,2);//return 3
    func_callback(sub,2,1);//return 1}
複製

這裡的func_callback就是回撥函式,它的執行結果根據傳進來的函式指標p的實際指向函式不同而不同,即傳入加法add得到的是加法計算,傳入減法sub得到的是減法計算結果。

回撥函式的使用使得上層呼叫時僅需要同一個介面(func_callback)即可,而根據傳入的引數不同而呼叫到不同的底層結果。

例如add和sub是作業系統或BSP提供的一個功能。我們希望上層應用在呼叫時具有擴充性,即如果底層新增了新的功能例如乘除法(mul,div),我們無需修改上層應用的介面,僅需在傳入引數時增加新的引數(mul,div)即可。這樣底層提供的API具有了通用性,應用層無需修改呼叫api的介面即可增加新的使用方式。

回撥函式還有一個很好用的功能是和表驅動法結合:

表驅動法

表驅動法顧名思義就是類似 查表的方式實現功能,簡單地說,將程式中的分支判斷變為查表操作,簡單例子:

char getCharfromHex(unsigned char ucNum){
    char ucNumChar = 0;
    if(ucNum < 10)
    {
        ucNumChar = ucNum + '0';
    }
    else if(ucNum == 10)
    {
        ucNumChar = 'A';
    }
    else if(ucNum == 11)
    {
        ucNumChar = 'B';
    }
    else if(ucNum == 12)
    {
        ucNumChar = 'C';
    }
    else if(ucNum == 13)
    {
        ucNumChar = 'D';
    }
    else if(ucNum == 14)
    {
        ucNumChar = 'E';
    }
    else if(ucNum == 15)
    {
        ucNumChar = 'F';
    }
    else
    {
    	return 0;    
    }
    return ucNumChar;}
複製

上面的操作是將一個16進位制數變為ASCII表示的字元,如果使用表驅動,則可以實現為:

CHAR aNumChars[] = {'0', '1', '2', /*3~9*/'A', 'B', 'C', 'D', 'E', 'F'};CHAR ucNumChar = aNumChars[ucNum % sizeof(aNumChars)];
複製

這樣一個較多的 if else或者 switch case語句變為簡單的查表操作。

使用表驅動法,則可以將很多功能介面進行排列後按查表方式進行執行,當功能介面較多時能夠比switch語句更加簡潔。

由表驅動和回撥函式組成的通用功能介面

首先將對外的功能進行一個排列,構造一個功能介面表,並對功能介面編碼(dispatch.h):

typedef enum {
	ChipCheck = 0x41,
	DataTrans = 0x01,
	/*others*/
	DataSave = 0x77,} FunctionCode_t;
複製

根據功能函式的格式,宣告一個函式指標(dispatch.h):

typedef u32 (*pFunc)(u8 *cmd_in, u8 *cmd_out);
複製

實現功能函式,注意功能函式的介面儘量保持一致,可以透過傳入一個通用的結構體或指標陣列方式,具體功能處理上的區別介面內部對資料進行細分處理。

標頭檔案(dispatch.h):

u32 func_ChipCheck(u8 *cmd_in, u8 *cmd_out);u32 func_DataTrans(u8 *cmd_in, u8 *cmd_out);u32 func_DataSave(u8 *cmd_in, u8 *cmd_out);


來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/70016646/viewspace-2936463/,如需轉載,請註明出處,否則將追究法律責任。

相關文章