實(shí)用貼:用宏實(shí)現(xiàn)函數(shù)功能映射
? ??
此實(shí)例代碼旨在提供一種處理類似事務(wù)時(shí)的一種函數(shù)映射關(guān)系。
函數(shù)功能不同,但函數(shù)結(jié)構(gòu)一樣,通過數(shù)組和結(jié)構(gòu)體進(jìn)行函數(shù)功能的映射,在函數(shù)體內(nèi)處理數(shù)據(jù),實(shí)現(xiàn)對(duì)變量的賦值,通過函數(shù)指針調(diào)用函數(shù),因?yàn)榻Y(jié)構(gòu)類似可以用for循環(huán)遍歷所有映射函數(shù)。
當(dāng)修改功能時(shí),只需要修改函數(shù),映射結(jié)構(gòu)不用改變,為代碼的維護(hù)提供了很大的方便。
? ??
1)實(shí)現(xiàn)代碼
下面代碼模擬下AD通道采樣,轉(zhuǎn)換的映射調(diào)用方式,只是模擬,沒有實(shí)際的應(yīng)用價(jià)值,大家根據(jù)需要進(jìn)行修改就可以移植到自己的工程中去了。
????下面代碼重要的是結(jié)構(gòu)和思路,很有必要學(xué)習(xí)下哈,。
#include?
#include?
#define??uint32_t??unsigned?int?
/*?此宏的順序要與結(jié)構(gòu)RawToVal_Map_t中變量順序一一對(duì)應(yīng),不然會(huì)報(bào)錯(cuò)?*/??
#define?VAL_SWAP(Ch,?Convert)??{?&(Ch.wRawInValue),?Convert,?&(Ch.dwInValue)?}
//?函數(shù)聲明
void?AD_CH1(uint32_t?*pRawValue,?uint32_t?*pValue);
void?AD_CH2(uint32_t?*pRawValue,?uint32_t?*pValue);
void?AD_CH3(uint32_t?*pRawValue,?uint32_t?*pValue);
void?AD_CH4(uint32_t?*pRawValue,?uint32_t?*pValue);
typedef?struct?_AD_Ch_t?
{
??????uint32_t?dwInValue;??????//?轉(zhuǎn)換值
??????uint32_t?wRawInValue;????//?原始值?
???????
}?AD_Ch_t;
//?定義不同通道數(shù)據(jù)的結(jié)構(gòu)變量
AD_Ch_t?in_AD_1,in_AD_2,in_AD_3,in_AD_4;
//?定義函數(shù)指針
typedef?void?(*RawToVal_t)(uint32_t?*pRawValue,?uint32_t?*pValue);???
//?數(shù)組數(shù)據(jù)對(duì)應(yīng)的映射結(jié)構(gòu)?
typedef?struct?_RawToVal_Map_t?
{
?
??????uint32_t????*pRawValue;
??????RawToVal_t???RawToVal;
??????uint32_t????*pValue;
?
}?RawToVal_Map_t;
/*?數(shù)據(jù)映射數(shù)組?*/?
RawToVal_Map_t?MapArray[2][2]?=?
{??????//?下面映射一一對(duì)應(yīng),可以根據(jù)需要進(jìn)行交叉映射?
???????
???????{
????????????VAL_SWAP(in_AD_1,AD_CH1),??//?通道1映射到通道1的功能?
????????????VAL_SWAP(in_AD_2,AD_CH2)???//?通道2映射到通道2的功能?
???????},
????
???????{
????????????VAL_SWAP(in_AD_3,AD_CH3),??//?通道3映射到通道3的功能?
????????????VAL_SWAP(in_AD_4,AD_CH4)???//?通道4映射到通道4的功能?
???????}
};
int?main(int?argc,?char?*argv[])?
{
?
??????uint32_t?i,?j,?ch?=?1,bCh;
?
??????RawToVal_Map_t?*pMap;
?
??????for(j?=?0;?j?2;?j++)
??????{
????????????for(i?=?0;?i?2;?i++)
????????????{
??????
??????????????????pMap?=?&(MapArray[j][i]);?//?指向映射數(shù)組中的數(shù)據(jù)??????????????????????????
??????????????????(*(pMap->RawToVal))(pMap->pRawValue,pMap->pValue);???????//?函數(shù)調(diào)用?
??
??????????????????printf("\nCh%d?RawVal?is?%d.",ch,*(pMap->pRawValue));????//?打印原始值??
??????????????????printf("\nCh%d?SwapVal?is?%d.?\n",ch,*(pMap->pValue));???//?打印轉(zhuǎn)換值?
???
??????????????????//?專門給通道一個(gè)變量,用于上面的打印?
??????????????????if(ch?<=?4)
??????????????????{
???????????????????????ch++;
??????????????????}
??????????????????else
??????????????????{
???????????????????????ch?=?1;
??????????????????}
??
????????????}
??????}
??????return?0;
}
/*?下面四個(gè)函數(shù)特別簡(jiǎn)單,只做系數(shù)乘法和賦值,實(shí)際中可以變?yōu)閷?shí)際的工程運(yùn)算*/?
void?AD_CH1(uint32_t?*pRawValue,?uint32_t?*pValue)
{
?
??????*pRawValue?=?1;
??????*pValue?=?*pRawValue?*?2;
?????
??????in_AD_1.wRawInValue?=?*pRawValue;
??????in_AD_1.dwInValue?=?*pValue;
}
void?AD_CH2(uint32_t?*pRawValue,?uint32_t?*pValue)
{
??????*pRawValue?=?1;
??????*pValue?=?*pRawValue?*?4;
?
??????in_AD_2.wRawInValue?=?*pRawValue;
??????in_AD_2.dwInValue?=?*pValue;
?
}
void?AD_CH3(uint32_t?*pRawValue,?uint32_t?*pValue)
{
??????*pRawValue?=?1;
??????*pValue?=?*pRawValue?*?8;
?
??????in_AD_3.wRawInValue?=?*pRawValue;
??????in_AD_3.dwInValue?=?*pValue;
}
void?AD_CH4(uint32_t?*pRawValue,?uint32_t?*pValue)
{
??????*pRawValue?=?1;
??????*pValue?=?*pRawValue?*?16;
?
??????in_AD_4.wRawInValue?=?*pRawValue;
??????in_AD_4.dwInValue?=?*pValue;
?
}
2)運(yùn)行結(jié)果
總結(jié)
? ? 今天給大家介紹了一種用宏封裝結(jié)構(gòu)體變量和函數(shù)入口,實(shí)現(xiàn)函數(shù)功能映射,遍歷調(diào)用的方式,感興趣的小伙伴,趕緊把代碼擼下來去試試吧。
? ?有問題可以后臺(tái)留言,公眾號(hào)18年后新申請(qǐng)的,文章后不支持留言功能的。
最后
以上就是本次的分享,如果覺得文章不錯(cuò),轉(zhuǎn)發(fā)、在看,也是我們繼續(xù)更新的動(dòng)力。
猜你喜歡:
2020年精選原創(chuàng)筆記匯總
干貨 | protobuf-c之嵌入式平臺(tái)使用
1024G 嵌入式資源大放送!包括但不限于C/C++、單片機(jī)、Linux等。在公眾號(hào)聊天界面回復(fù)1024,即可免費(fèi)獲??!
免責(zé)聲明:本文內(nèi)容由21ic獲得授權(quán)后發(fā)布,版權(quán)歸原作者所有,本平臺(tái)僅提供信息存儲(chǔ)服務(wù)。文章僅代表作者個(gè)人觀點(diǎn),不代表本平臺(tái)立場(chǎng),如有問題,請(qǐng)聯(lián)系我們,謝謝!