在閱讀一些開源系統的源代碼時,經常見到大量函數指針的使用,為了學習和理解函數指針,假想了一種情況,并使用函數指針達到目的。
假想兩個結構體StructA和StructB都含有相同類型的字段t,而其他字段可能不同,為了使用統一的形式(或者說同一個函數)獲取兩種不同類型數據的t值,可以使用函數指針。
在Win10中使用VS2022編程實驗。
在VS2022中新建C++空項目,添加源文件“main.cpp”,輸入如下代碼:
typedef struct StructA{
__int64 t;
char a;
}StructA;
typedef struct StructB{
int b;
__int64 t;
}StructB;
#define DATA_SIZE (5)
StructA sa[DATA_SIZE];
StructB sb[DATA_SIZE];
enum DataType {
DataType_StructA,
DataType_StructB
};
// 獲取t值的函數.
__int64 getT(void* pData, DataType dataType) {
if (DataType::DataType_StructA==dataType) {
return ((StructA*)pData)->t;
}
else if(DataType::DataType_StructB==dataType) {
return ((StructB*)pData)->t;
}
return 0;
}
// 定義函數指針類型.
typedef __int64 (*PFN_getT)(void* pData, DataType dataType);
#include <iostream>
int main()
{
for (int i=0; i < DATA_SIZE; i++) {
sa[i].t=i + 1;
sb[i].t=i * 10 + 1;
}
// 輸出sa和sb的t值.
std::cout << "sa的t值" << std::endl;
for (int i=0; i < DATA_SIZE; i++) {
std::cout << "sa[" << i << "].t=" << sa[i].t << std::endl;
}
std::cout << "sb的t值" << std::endl;
for (int i=0; i < DATA_SIZE; i++) {
std::cout << "sb[" << i << "].t=" << sb[i].t << std::endl;
}
// 使用函數指針.
PFN_getT pfn_getT=&getT;
std::cout << "使用函數指針." << std::endl;
std::cout << "sa的t值" << std::endl;
DataType dt=DataType::DataType_StructA;
void* pData;
for (int i=0; i < DATA_SIZE; i++) {
pData=&sa[i];
std::cout << "sa[" << i << "].t=" << (*pfn_getT)(pData, dt) << std::endl;
}
std::cout << "sb的t值" << std::endl;
dt=DataType::DataType_StructB;
for (int i=0; i < DATA_SIZE; i++) {
pData=&sb[i];
std::cout << "sb[" << i << "].t=" << (*pfn_getT)(pData, dt) << std::endl;
}
return 1;
}
上述代碼定義兩個結構體StructA和StructB,定義了從這兩個結構體獲得t值的函數getT,并為該函數定義了函數指針類型PFN_getT。接著定義了兩種數據的數組sa和sb。
在main函數中,首先為sa和sb的t值賦值,接著輸出sa和sb的t值,最后,使用PFN_getT的實例pfn_getT輸出sa和sb的值。可以比較兩種輸出的結果是否一致,來確定使用函數指針的結果是否正確。重要的是sa和sb的值可以借助變量pData和dt使用統一的形式“(*pfn_getT)(pData, dt)”輸出,我想這也許是函數指針得到廣泛應用的原因之一。
上述程序運行結果如下:
從運行結果可以看出,使用函數指針的結果與直接輸出的結果一致。但實現了形式的統一。
一共有三種方式可以把生字拼音上的聲調打在拼音上面,詳解如下:
1、Windows 自帶的輸入法中,選擇 “智能ABC” 輸入法,按 V8 就能出現拼音里帶聲調的韻母。
2、自己安裝的輸入法,比如 “搜狗” 輸入法,按 Ctrl-Shift-Z 即可調出 “特殊符號” 輸入面板,選擇 “拼音/注音” 就行了。
3、使用其他軟件,比如 Word 2003 中,把需要拼音的漢子輸入后,選擇這些漢字,然后在菜單選擇 “格式”、“中文版式”、“拼音指南”、“確定”,就能看到漢字上方已經增加了對應的拼音,復制粘貼這些已經加了拼音的文字到記事本,可以看到類似 “拼(pīn)音(yīn)” 這樣的文字。相關圖片如下:
漢字拼音音調輸入小技巧
http://www.sina.com.cn
對于語文老師來說,編輯試卷、教案經常要給漢字加注漢語拼音。在大部分編輯軟件中,輸入漢語拼音往往是通過手工輸入英文字母,再通過“插入字符”或利用某些輸入法提供的軟鍵盤功能輸入音調的。如果要實現文字和拼音相對應,還要精心調整上下兩行字的字距和字體大小。一旦某一個字發(fā)生了變化,可能又要重新調整,操作起來十分困難。
其實,如果您安裝了Office XP,用它的組件Word 2002,您會發(fā)現拼音的輸入變得非
常簡單。我們以“中國電腦教育報”注音為例來說明:
1、輸入“中國電腦教育報”。
2、通過有關字體字號命令,將內容按輸出需要排版。
3、選中上面輸入的“中國電腦教育報”(Word 2002注音每次可以選中50個漢字)文字信息。
4、單擊菜單“格式→中文版式→拼音指南”,打開圖1所示對話框,可以看到軟件已經將拼音填寫好,不用再通過軟鍵盤等方式輸入了。我們可以通過窗口中部的“對齊方式”進行拼音和文字對齊方式的設定,通過“偏移量”設置文字與拼音的行間距,通過“字號”設置拼音字母的大小,以及通過字體設定拼音字母所調用的字體。
圖1
5、單擊[確定]退出,會看到圖2所示的效果。
圖2
另外圖1窗口中還有一個[組合]按鈕和一個[單字]按鈕,系統默認是選中[單字]按鈕,即對每一個漢字單獨注音。兩者產生的結果是有差異的,例如將“中國電腦教育報”注音后,另存為文本文件,“單字”方式在文本文件顯示為“中(zhōng)國(guó)電(diàn)腦(nǎo)教(jiào)育(yù)報(bào)”,“組合”方式在文本文件中顯示為“中國電腦教育報(zhōngguódiànnǎojiàoyùbào)”。我想,“組合”方式對于小學語文老師編排“根據拼音寫文字”的試題非常有用,方法就是先錄入文字,然后用“拼音指南”添加拼音,再存為文本文件,最后將其中的文字刪除即可快速編制一道根據拼音寫文字的試題了。
以word2007為例:
1.選中需要注音的生字詞語,單擊“開始”菜單,單擊“拼音指南”命令,如下圖:
2.在彈出的“拼音指南”對話框中單擊“默認讀音”按鈕,給出拼音指南。如下圖:
3.在“拼音文字”框中刪除不需要注音的拼音文字。在“對齊方式”列表中選擇拼音與文字的對齊方式。在“偏移量”框選擇或輸入拼音底端與文字頂端的間距(0~100之間)。在“字體”列表中選擇字體。在“字號”列表中選擇或輸入字體大小。如下圖:
4.單擊“確定”按鈕,在生字上面注音后的效果如下圖: