




版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)
文檔簡介
1、 第22卷第4期洛陽大學(xué)學(xué)報(bào)Vol . 22No . 42007年12月JOURNAL OF LUOY ANG UN I V ERSI TY Dec . 2007C 、C +、Fortran 混合編程研究魏威, 魏沖(鄭州鐵路職業(yè)技術(shù)學(xué)院, 河南鄭州450052摘要:不同計(jì)算機(jī)編程語言都有其特有的優(yōu)勢(shì)和局限性, 將多種語言混合起來進(jìn)行編程, 不但可以充分發(fā)揮各自的優(yōu)勢(shì), 而且可以彌補(bǔ)各自功能的不足, 這樣既能充分利用現(xiàn)有程序資源, 又能加快應(yīng)用程序的開發(fā). 主要闡述了C 、C +、Fortran 等3種語言在不同平臺(tái)下混合編程應(yīng)注意的問題, 以及在混合編程中經(jīng)常遇到的2個(gè)問題.關(guān)鍵詞:混合編程
2、; C; C +; Fortran中圖分類號(hào):TP311文獻(xiàn)標(biāo)識(shí)碼:A 文章編號(hào):1007-113X (2007 04-0094-05Fortran 算, 但是Fortran , RAD 特性的Fortran 編譯集成開發(fā)環(huán)境. 當(dāng)用Fortran , 據(jù)輸入簡易、結(jié)果顯示方便的W C 、C +進(jìn)行編程卻比較容易實(shí)現(xiàn)這些功能. 因此, , +、Fortran 等進(jìn)行混合編程. 在混合語言編程中, 主.1W indows Fortran 語言沒有大小寫之分, 而W indows 平臺(tái)下的混合語言編程過程中大小寫問題十分突出. 考慮到編譯器的差異, 可以用以下方式進(jìn)行跨平臺(tái)編程的函數(shù)聲明. C 、
3、C +編譯器使用M icr os oft V isual C +6. 0編譯集成開發(fā)環(huán)境, Fortran 編譯器使用D igital V isual Fortran 6. 0編譯集成開發(fā)環(huán)境.假設(shè)一個(gè)C 語言函數(shù)為void cFuncti on ( , 那么只需要在它的頭文件里面進(jìn)行如下定義即可.#ifdef_cplus p lusextern “C ”v oid #endifextern v oid _stdcallCFuncti on ( ;#definecFuncti on CF UNCTI O N#ifdef_cplus p lus#endif這樣就可實(shí)現(xiàn)上述函數(shù)在Fortran 或
4、C +程序中的直接調(diào)用.假設(shè)一個(gè)Fortran 函數(shù)為S UBROUTI N E FF UNCTI O N ( , 那么在C +頭文件里可進(jìn)行如下定義. #ifdef_cplus p lusextern “C ”v oid #endifextern v oid _stdcallffuncti on ( ;#defineffuncti on FF UNCTI O N#ifdef_cplus p lus3收稿日期:2007-11-01作者簡介:魏威(1960- , 女, 漢族, 河南省鄭州市人, 工程師, 研究方向:計(jì)算機(jī)技術(shù). 第4期魏威等:C 、C +、Fortran 混合編程研究95#end
5、if這樣, 就可以在C +的程序里面直接調(diào)用上述函數(shù). 由于C 編譯器里面沒有定義cp lus p lus 這個(gè)環(huán)境變量, 因此在C 文件里面也可以直接使用這個(gè)頭文件.如果是一個(gè)C +函數(shù)void cPlus p lusFuncti on ( , 和C 函數(shù)一樣可定義如下.#ifdef_cplus p lusextern “C ”v oid #endifextern v oid _stdcallcPlus p lusFuncti on ( ;#definecPlus p lusFuncti on CP LUSP LUSF UNCTI O N#ifdef_cplus p lus#endif經(jīng)過上
6、面的定義后, 所有的函數(shù)便可實(shí)現(xiàn)在3種語言間自由調(diào)用.在用3三種語言進(jìn)行混合編程過程中要注意函數(shù)的參數(shù)、字符串的傳遞問題. 數(shù), 如函數(shù)v oid cCharFuncti on (char 3m sg , 需要定義如下.void cCharFuncti on (char 3m sg, int len 經(jīng)過上面的定義之后, 在Fortran (m Fortran 程序沒有明顯的字符串結(jié)束標(biāo)志, 如果是2C 1個(gè)字符串. 所以, 最好在C 的程序里對(duì)這個(gè)由, len 變量可以得到字符串長度, 截取m sg 的前l(fā)en . 而在Fortran 程序里面, 如函數(shù)S UBROUTI N E FCHAR
7、F UNCTI O N (fchar , , 進(jìn)行下面的定義即可.#definef CharFuncti on (fchar , FCHARF UNCTI O N (fchar, strlen (fchar 這樣, 在C 、C +程序里即可直接調(diào)用.在3種語言的混合編程里還有一個(gè)需要注意的問題就是指針問題. Fortran 里面所有的變量都相當(dāng)于C 、C +里面的指針, 所以, 在C 、C +程序里函數(shù)的參數(shù)應(yīng)一律聲明為指針形式(除字符串參數(shù)后面的長度外 .在混合編程過程中, 數(shù)據(jù)方面存在的差異也必須引起足夠的重視, 這體現(xiàn)在數(shù)組和結(jié)構(gòu)2個(gè)方面. 在Fortran 語言里, 數(shù)組和C 、C +
8、里的數(shù)組有些不同, 這表現(xiàn)在行列順序和數(shù)組起始值. Fortran 語言不同于C 、C +的行優(yōu)先, 而使用列優(yōu)先的方式. 假設(shè)有一個(gè)數(shù)組a, m 行n 列, 采用行優(yōu)先時(shí)的數(shù)據(jù)存放格式如下.a 11, a 12, , a 1n , a 21, a 22, , a 2n , , a m 1, a m 2, , a m n而采用列優(yōu)先的數(shù)據(jù)存放格式如下.a 11, a 21, , a m 1, a 12, a 22, , a m 2, , a 1n , a 2n , , a m n行優(yōu)先順序推廣到多維數(shù)組, 規(guī)定為先排最右的下標(biāo); 列優(yōu)先順序推廣到多維數(shù)組, 規(guī)定為先排最左的下標(biāo). 這樣, 在混
9、合語言編程里調(diào)用數(shù)據(jù)時(shí)必須注意行列優(yōu)先的差別, 進(jìn)行準(zhǔn)確地調(diào)用.數(shù)組的另一個(gè)差別是起始下標(biāo)的不同. Fortran 默認(rèn)的數(shù)組下標(biāo)是以1開始的, 而C 、C +默認(rèn)的數(shù)組下標(biāo)卻是從0開始的, 所以在調(diào)用時(shí)要注意加1或者減1, 以保證調(diào)用到正確的數(shù)據(jù).Fortran 語言里的結(jié)構(gòu)經(jīng)過聲明后就被分配了空間, 在C 、C +里面也要聲明它, 采用下面的方式. Fortran 結(jié)構(gòu)聲明格式如下.COMMON /COLOR7/C_RED , C_GREEN,C_BLUECOMMON /NDDAT/N I D (NASI ZE , XN (3, NASI ZE C 、C +結(jié)構(gòu)聲明格式如下.#ifdef_
10、cplus p lusextern " C" 96#endif洛陽大學(xué)學(xué)報(bào)2007#definecol or7COLOR7#definenddat NDDATextern struct fl oat c_red;fl oat c_green;fl oat c_blue;col or7;extern struct int nidNASIZE ;fl oat xnNASIZE 3;nddat;#ifdef_cplus p lus#endif2L inux 平臺(tái)的混合編程L inux 平臺(tái)的混合語言編程和W indows 平臺(tái)的混合語言編程基本沒有什么區(qū)別, 主要是在define
11、 上的不同. 考慮到編譯器的差異, 在函數(shù)聲明上可以用下面的方式進(jìn)行跨平臺(tái)編程的函數(shù)聲明. C 、C +編譯器使用G NU gcc, Fortran 編譯器使用pgi Fortran .假設(shè)一個(gè)C 函數(shù)為void cFuncti on ( , 那么只需要在它的頭文件里面進(jìn)行如下定義即可.#ifdef_cplus p lusextern “C ”v oid #endifextern v oid CFuncti on ( ;#definecFuncti on cfuncti on_#ifdef_cplus p lus這樣, 在C +的程序里面就可以直接進(jìn)行調(diào)用了. 需要注意的是, 函數(shù)名應(yīng)該不多于
12、31個(gè)字符.同樣, 對(duì)于C +和Fortran 里的函數(shù), 函數(shù)名在聲明的時(shí)候也應(yīng)改成小寫加下劃線即可.對(duì)于數(shù)組來說, 具體變化和W indows 平臺(tái)的處理方式是一致的, 都是行列優(yōu)先順序不同的. 而對(duì)于字符串來說, 則不需要額外的注意, gcc 編譯器會(huì)處理好這個(gè)問題, 也就是說并不需要額外的改變.對(duì)于數(shù)據(jù)結(jié)構(gòu)的定義, 也要改成小寫加下劃線的方式. 其中, Fortran 的數(shù)據(jù)結(jié)構(gòu)定義方式如下. COMMON /COLOR7/C_RED , C_GREEN,C_BLUECOMMON /NDDAT/N I D (NASI ZE , XN (3, NASI ZE C 、C +的數(shù)據(jù)結(jié)構(gòu)定義方
13、式如下.#ifdef_cplus p lusextern " C" #endif#definecol or7col or7_#definenddat nddat_extern struct fl oat c_red;fl oat c_green;fl oat c_blue;col or7;extern struct int nidNASIZE ;fl oat xnNASIZE 3;nddat;#ifdef_cplus p lus#endif3其他平臺(tái)的混合編程對(duì)于Solaris 平臺(tái), 基本上和L inux 平臺(tái)完全一致, 但是考慮到Solaris 大多運(yùn)行在Sparc C
14、P U 上, 它是采用big endian 的, 而W indows 和L inux 運(yùn)行在I ntel 或AMD 的X86平臺(tái)上, 采用的是little endian, 這一點(diǎn)需要特別注意, 在讀寫數(shù)據(jù)文件時(shí)應(yīng)該給予足夠的重視. 其他的Unix 平臺(tái), 如HP Unix 、ULTR I X 、I R I S 等, 一般都只有define 上的微小差別, 在字符串處理、結(jié)構(gòu)及數(shù)組方面基本與L inux 相同. 對(duì)它們 第4期魏威等:C 、C +、Fortran 混合編程研究97來說, 考慮更多的應(yīng)該是中央處理器不同帶來的差別.4混合編程中的字符串處理混合編程中經(jīng)常會(huì)出現(xiàn)需要傳遞字符串的情況,
15、而字符串的傳遞是一個(gè)較為麻煩的問題. 在Fortran 里, 字符串是沒有結(jié)束符的, 但是有長度的概念, 也就是說, 編譯器會(huì)給每一個(gè)字符串一個(gè)長度以控制字符串的長度, 但是這個(gè)長度參數(shù)在不同的平臺(tái)下其位置也是不同的(有的直接跟在字符串后面, 有的則跟在函數(shù)參數(shù)的最后面 , 對(duì)于常見的平臺(tái), 如W indows 、L inux 、Solaris 、HP Unix 、I R I S, 可以用如下方法定義. 以C 函數(shù)為例, 定義如下.void messag (char 3m sg1, int 3where1, char 3m sg2, int 3where2p rintf (“%s should
16、 be %d, while %s should be %d n ”, m sg1, 3where1, m sg2, where2 ; 如果要在Fortran 里調(diào)用的話, 需要以下定義.#ifdefined ULT R I X |SP ARC |I R I S |L I N UX |W I N 32#ifdefined ULT R I X |SP ARC |I R I S |L I N UXextern v oid _stdcallmessag (char 3, int 3, char 3, int 3, int, int #definemessag (s1, i1, s2, i2 messa
17、g_(s1, i1, s2, strlen ( , #else/3W I N 32Platf or m 3/extern v oid _stdcallmessag (char 3, int, int, #definemessag (s1, ( , i1, s2, strlen (s2 , i2#endif/3extern _stdcallmessag (char 3, int 3, char 3, int 3, int, int #definemessag (s1, i1, s2, i2 messag (s1, i1, s2, i2, strlen (s1 , strlen (s2 #endi
18、f如果要用在C +中, 需要如下定義.#ifdef_cplus p lusextern “C ”#endif/3your extern code 3/#ifdef_cplus p lus#endifFortran 里便可以直接調(diào)用如下.CALL MESS AG (char1, i1, char2, i2同樣, 在Fortran 里寫的字符串處理函數(shù)使用以上的define 和extern 后, 也可以在C 里直接調(diào)用. 5混合編程中的文件讀寫處理文件讀寫也是混合編程中一個(gè)非常重要的問題, 通常的問題發(fā)生于不同平臺(tái)下的混合編程或者不同F(xiàn)ortran 編譯器間的編譯.在Fortran 中, 文件的寫
19、入是由write 語句完成的, 而每一個(gè)write 語句可一次性寫入多個(gè)數(shù)據(jù)構(gòu)成一個(gè)數(shù)據(jù)塊, 而每一個(gè)無格式數(shù)據(jù)塊都由下面3部分組成:(1 數(shù)據(jù)塊的開始標(biāo)志, 記錄所有數(shù)據(jù)所占的字節(jié)數(shù); (2 組成該數(shù)據(jù)塊的各數(shù)據(jù)內(nèi)容. 整型數(shù)和浮點(diǎn)數(shù)均占4個(gè)字節(jié), 低字節(jié)在前, 高字節(jié)在后. 各數(shù)據(jù)間不空格; (3 每個(gè)數(shù)據(jù)塊的結(jié)束標(biāo)志, 也為該數(shù)據(jù)塊的字節(jié)數(shù), 而不是以回車換行符作為結(jié)束標(biāo)志. 各記錄之間也沒有分隔符.另外, 由于編程語言的差異, 不同的編譯器的存儲(chǔ)格式也存在差異, 如V isual Fortran 與D igital Fortran 在存儲(chǔ)數(shù)據(jù)塊中還存在著差別. 在一個(gè)write 語句中
20、, V isual Fortran 存儲(chǔ)數(shù)據(jù)塊的開始標(biāo)志與結(jié)束標(biāo)志是 98洛陽大學(xué)學(xué)報(bào)2007用一個(gè)字節(jié)表示, 而在D igital Fortran 是用一個(gè)整形數(shù), 即4個(gè)字節(jié)來表示. 也就是說, V isual Fortran 一個(gè)數(shù)據(jù)塊最多可以存儲(chǔ)128個(gè)字節(jié), 如果一個(gè)write 語句要求寫入的數(shù)據(jù)量大于128字節(jié)時(shí), 則按循環(huán)形式存入. 所以, D igital Fortran 在讀取時(shí)就應(yīng)該把它轉(zhuǎn)化為相應(yīng)的D igital Fortran 存儲(chǔ)形式.6結(jié)束語混合編程的優(yōu)勢(shì)在于它允許調(diào)用用另一種語言編寫的現(xiàn)有程序代碼、使用在特定語言環(huán)境下難以實(shí)現(xiàn)的算法和獲得處理速度方面的優(yōu)勢(shì). 在混合編程中的關(guān)鍵問題是協(xié)調(diào)2種或多種語言間所的調(diào)用約定、命名約定及參數(shù)傳遞方式, 并使它們?cè)跀?shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型上保持一致.參考文獻(xiàn):1孫鑫, 余安萍. V isual C +深入詳解M.北京:電子工業(yè)出版社, 2006.2??藸? C +編程思想M.北京:機(jī)械工業(yè)出版社, 2002.3任哲. MFC W indows 應(yīng)用程序設(shè)計(jì)M.北京:清華大學(xué)出版社, 2004.4周振紅. Fortran
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請(qǐng)下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請(qǐng)聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會(huì)有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲(chǔ)空間,僅對(duì)用戶上傳內(nèi)容的表現(xiàn)方式做保護(hù)處理,對(duì)用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對(duì)任何下載內(nèi)容負(fù)責(zé)。
- 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請(qǐng)與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準(zhǔn)確性、安全性和完整性, 同時(shí)也不承擔(dān)用戶因使用這些下載資源對(duì)自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025年市場(chǎng)需求變化與公司戰(zhàn)略調(diào)整的關(guān)系試題及答案
- 追尋真相的高考作文火花試題及答案
- 行政法學(xué)重點(diǎn)難點(diǎn)突破分享:試題及答案
- 2025年電商平臺(tái)知識(shí)產(chǎn)權(quán)保護(hù)與電商知識(shí)產(chǎn)權(quán)保護(hù)機(jī)制創(chuàng)新報(bào)告
- 軟件水平考試中設(shè)計(jì)模式的應(yīng)用與試題及答案
- 軟件工程中的需求變更管理試題及答案
- 門衛(wèi)離崗協(xié)議書
- 黑豬認(rèn)養(yǎng)協(xié)議書
- 食堂租房協(xié)議書
- 設(shè)備借出協(xié)議書
- GB/T 32512-2016光伏發(fā)電站防雷技術(shù)要求
- GB/T 30516-2014高粘高彈道路瀝青
- GB/T 29602-2013固體飲料
- GB/T 23268.1-2009運(yùn)動(dòng)保護(hù)裝備要求第1部分:登山動(dòng)力繩
- GB/T 12469-1990焊接質(zhì)量保證鋼熔化焊接頭的要求和缺陷分級(jí)
- 臨床血液學(xué)檢驗(yàn)技術(shù)-其他白細(xì)胞疾病
- DBJ-T 13-195-2022 燒結(jié)煤矸石實(shí)心磚和多孔磚(砌塊) 應(yīng)用技術(shù)標(biāo)準(zhǔn)
- FZ/T 21009-2015短毛條
- 禾川x3系列伺服說明書
- 電纜井工程及電纜鋼管敷設(shè)施工方案
- 各種面試方法詳解
評(píng)論
0/150
提交評(píng)論