版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)
文檔簡介
1、 第22卷第4期洛陽大學學報Vol . 22No . 42007年12月JOURNAL OF LUOY ANG UN I V ERSI TY Dec . 2007C 、C +、Fortran 混合編程研究魏威, 魏沖(鄭州鐵路職業(yè)技術(shù)學院, 河南鄭州450052摘要:不同計算機編程語言都有其特有的優(yōu)勢和局限性, 將多種語言混合起來進行編程, 不但可以充分發(fā)揮各自的優(yōu)勢, 而且可以彌補各自功能的不足, 這樣既能充分利用現(xiàn)有程序資源, 又能加快應(yīng)用程序的開發(fā). 主要闡述了C 、C +、Fortran 等3種語言在不同平臺下混合編程應(yīng)注意的問題, 以及在混合編程中經(jīng)常遇到的2個問題.關(guān)鍵詞:混合編程
2、; C; C +; Fortran中圖分類號:TP311文獻標識碼:A 文章編號:1007-113X (2007 04-0094-05Fortran 算, 但是Fortran , RAD 特性的Fortran 編譯集成開發(fā)環(huán)境. 當用Fortran , 據(jù)輸入簡易、結(jié)果顯示方便的W C 、C +進行編程卻比較容易實現(xiàn)這些功能. 因此, , +、Fortran 等進行混合編程. 在混合語言編程中, 主.1W indows Fortran 語言沒有大小寫之分, 而W indows 平臺下的混合語言編程過程中大小寫問題十分突出. 考慮到編譯器的差異, 可以用以下方式進行跨平臺編程的函數(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è)一個C 語言函數(shù)為void cFuncti on ( , 那么只需要在它的頭文件里面進行如下定義即可.#ifdef_cplus p lusextern “C ”v oid #endifextern v oid _stdcallCFuncti on ( ;#definecFuncti on CF UNCTI O N#ifdef_cplus p lus#endif這樣就可實現(xiàn)上述函數(shù)在Fortran 或
4、C +程序中的直接調(diào)用.假設(shè)一個Fortran 函數(shù)為S UBROUTI N E FF UNCTI O N ( , 那么在C +頭文件里可進行如下定義. #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- , 女, 漢族, 河南省鄭州市人, 工程師, 研究方向:計算機技術(shù). 第4期魏威等:C 、C +、Fortran 混合編程研究95#end
5、if這樣, 就可以在C +的程序里面直接調(diào)用上述函數(shù). 由于C 編譯器里面沒有定義cp lus p lus 這個環(huán)境變量, 因此在C 文件里面也可以直接使用這個頭文件.如果是一個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ù)便可實現(xiàn)在3種語言間自由調(diào)用.在用3三種語言進行混合編程過程中要注意函數(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é)束標志, 如果是2C 1個字符串. 所以, 最好在C 的程序里對這個由, len 變量可以得到字符串長度, 截取m sg 的前l(fā)en . 而在Fortran 程序里面, 如函數(shù)S UBROUTI N E FCHAR
7、F UNCTI O N (fchar , , 進行下面的定義即可.#definef CharFuncti on (fchar , FCHARF UNCTI O N (fchar, strlen (fchar 這樣, 在C 、C +程序里即可直接調(diào)用.在3種語言的混合編程里還有一個需要注意的問題就是指針問題. Fortran 里面所有的變量都相當于C 、C +里面的指針, 所以, 在C 、C +程序里函數(shù)的參數(shù)應(yīng)一律聲明為指針形式(除字符串參數(shù)后面的長度外 .在混合編程過程中, 數(shù)據(jù)方面存在的差異也必須引起足夠的重視, 這體現(xiàn)在數(shù)組和結(jié)構(gòu)2個方面. 在Fortran 語言里, 數(shù)組和C 、C +
8、里的數(shù)組有些不同, 這表現(xiàn)在行列順序和數(shù)組起始值. Fortran 語言不同于C 、C +的行優(yōu)先, 而使用列優(yōu)先的方式. 假設(shè)有一個數(shù)組a, m 行n 列, 采用行優(yōu)先時的數(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ī)定為先排最右的下標; 列優(yōu)先順序推廣到多維數(shù)組, 規(guī)定為先排最左的下標. 這樣, 在混
9、合語言編程里調(diào)用數(shù)據(jù)時必須注意行列優(yōu)先的差別, 進行準確地調(diào)用.數(shù)組的另一個差別是起始下標的不同. Fortran 默認的數(shù)組下標是以1開始的, 而C 、C +默認的數(shù)組下標卻是從0開始的, 所以在調(diào)用時要注意加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洛陽大學學報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 平臺的混合編程L inux 平臺的混合語言編程和W indows 平臺的混合語言編程基本沒有什么區(qū)別, 主要是在define
11、 上的不同. 考慮到編譯器的差異, 在函數(shù)聲明上可以用下面的方式進行跨平臺編程的函數(shù)聲明. C 、C +編譯器使用G NU gcc, Fortran 編譯器使用pgi Fortran .假設(shè)一個C 函數(shù)為void cFuncti on ( , 那么只需要在它的頭文件里面進行如下定義即可.#ifdef_cplus p lusextern “C ”v oid #endifextern v oid CFuncti on ( ;#definecFuncti on cfuncti on_#ifdef_cplus p lus這樣, 在C +的程序里面就可以直接進行調(diào)用了. 需要注意的是, 函數(shù)名應(yīng)該不多于
12、31個字符.同樣, 對于C +和Fortran 里的函數(shù), 函數(shù)名在聲明的時候也應(yīng)改成小寫加下劃線即可.對于數(shù)組來說, 具體變化和W indows 平臺的處理方式是一致的, 都是行列優(yōu)先順序不同的. 而對于字符串來說, 則不需要額外的注意, gcc 編譯器會處理好這個問題, 也就是說并不需要額外的改變.對于數(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其他平臺的混合編程對于Solaris 平臺, 基本上和L inux 平臺完全一致, 但是考慮到Solaris 大多運行在Sparc C
14、P U 上, 它是采用big endian 的, 而W indows 和L inux 運行在I ntel 或AMD 的X86平臺上, 采用的是little endian, 這一點需要特別注意, 在讀寫數(shù)據(jù)文件時應(yīng)該給予足夠的重視. 其他的Unix 平臺, 如HP Unix 、ULTR I X 、I R I S 等, 一般都只有define 上的微小差別, 在字符串處理、結(jié)構(gòu)及數(shù)組方面基本與L inux 相同. 對它們 第4期魏威等:C 、C +、Fortran 混合編程研究97來說, 考慮更多的應(yīng)該是中央處理器不同帶來的差別.4混合編程中的字符串處理混合編程中經(jīng)常會出現(xiàn)需要傳遞字符串的情況,
15、而字符串的傳遞是一個較為麻煩的問題. 在Fortran 里, 字符串是沒有結(jié)束符的, 但是有長度的概念, 也就是說, 編譯器會給每一個字符串一個長度以控制字符串的長度, 但是這個長度參數(shù)在不同的平臺下其位置也是不同的(有的直接跟在字符串后面, 有的則跟在函數(shù)參數(shù)的最后面 , 對于常見的平臺, 如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混合編程中的文件讀寫處理文件讀寫也是混合編程中一個非常重要的問題, 通常的問題發(fā)生于不同平臺下的混合編程或者不同F(xiàn)ortran 編譯器間的編譯.在Fortran 中, 文件的寫
19、入是由write 語句完成的, 而每一個write 語句可一次性寫入多個數(shù)據(jù)構(gòu)成一個數(shù)據(jù)塊, 而每一個無格式數(shù)據(jù)塊都由下面3部分組成:(1 數(shù)據(jù)塊的開始標志, 記錄所有數(shù)據(jù)所占的字節(jié)數(shù); (2 組成該數(shù)據(jù)塊的各數(shù)據(jù)內(nèi)容. 整型數(shù)和浮點數(shù)均占4個字節(jié), 低字節(jié)在前, 高字節(jié)在后. 各數(shù)據(jù)間不空格; (3 每個數(shù)據(jù)塊的結(jié)束標志, 也為該數(shù)據(jù)塊的字節(jié)數(shù), 而不是以回車換行符作為結(jié)束標志. 各記錄之間也沒有分隔符.另外, 由于編程語言的差異, 不同的編譯器的存儲格式也存在差異, 如V isual Fortran 與D igital Fortran 在存儲數(shù)據(jù)塊中還存在著差別. 在一個write 語句中
20、, V isual Fortran 存儲數(shù)據(jù)塊的開始標志與結(jié)束標志是 98洛陽大學學報2007用一個字節(jié)表示, 而在D igital Fortran 是用一個整形數(shù), 即4個字節(jié)來表示. 也就是說, V isual Fortran 一個數(shù)據(jù)塊最多可以存儲128個字節(jié), 如果一個write 語句要求寫入的數(shù)據(jù)量大于128字節(jié)時, 則按循環(huán)形式存入. 所以, D igital Fortran 在讀取時就應(yīng)該把它轉(zhuǎn)化為相應(yīng)的D igital Fortran 存儲形式.6結(jié)束語混合編程的優(yōu)勢在于它允許調(diào)用用另一種語言編寫的現(xiàn)有程序代碼、使用在特定語言環(huán)境下難以實現(xiàn)的算法和獲得處理速度方面的優(yōu)勢. 在混合編程中的關(guān)鍵問題是協(xié)調(diào)2種或多種語言間所的調(diào)用約定、命名約定及參數(shù)傳遞方式, 并使它們在數(shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型上保持一致.參考文獻:1孫鑫, 余安萍. V isual C +深入詳解M.北京:電子工業(yè)出版社, 2006.2??藸? C +編程思想M.北京:機械工業(yè)出版社, 2002.3任哲. MFC W indows 應(yīng)用程序設(shè)計M.北京:清華大學出版社, 2004.4周振紅. Fortran
溫馨提示
- 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
- 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
- 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
- 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
- 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責。
- 6. 下載文件中如有侵權(quán)或不適當內(nèi)容,請與我們聯(lián)系,我們立即糾正。
- 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。
最新文檔
- 2025-2030年中國MLCC行業(yè)資本規(guī)劃與股權(quán)融資戰(zhàn)略制定與實施研究報告
- 新形勢下川菜餐飲行業(yè)可持續(xù)發(fā)展戰(zhàn)略制定與實施研究報告
- 2025-2030年中國月子中心行業(yè)全國市場開拓戰(zhàn)略制定與實施研究報告
- 2025-2030年中國酒店管理服務(wù)行業(yè)營銷創(chuàng)新戰(zhàn)略制定與實施研究報告
- 2025-2030年中國標識設(shè)計制作行業(yè)營銷創(chuàng)新戰(zhàn)略制定與實施研究報告
- 織物設(shè)計與思考
- 關(guān)于進一步健全和完善城市社區(qū)治理體系建設(shè)的工作方案
- 2019-2025年中國養(yǎng)雞場行業(yè)市場深度分析及發(fā)展前景預測報告
- 湖北省襄陽市谷城縣石花三中2023-2024學年九年級上學期期末化學試卷
- 雪茄基礎(chǔ)知識培訓課件
- 混凝土澆筑申請表
- 企業(yè)培訓5W2H分析法(31P PPT)
- DB13T 2802-2018 水利工程鑄鐵閘門技術(shù)規(guī)范
- 必修二unit4History and Traditions重點短語梳理
- 食堂改造與裝修設(shè)計方案
- 德國Lurgi公司低壓回轉(zhuǎn)脈沖袋除塵器技術(shù)
- Q∕GDW 12147-2021 電網(wǎng)智能業(yè)務(wù)終端接入規(guī)范
- 塑料件缺陷匯總
- 跌落測試(中文版)-ISTA-2A-2006
- ppt魚骨圖模板圖
- 右心導管檢查及心血管造影ppt課件
評論
0/150
提交評論