C_C_Fortran混合編程研究_百度文庫_第1頁
C_C_Fortran混合編程研究_百度文庫_第2頁
C_C_Fortran混合編程研究_百度文庫_第3頁
C_C_Fortran混合編程研究_百度文庫_第4頁
C_C_Fortran混合編程研究_百度文庫_第5頁
已閱讀5頁,還剩7頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、 第22卷第4期洛陽大學學報Vol . 22No . 42007年12月JOURNAL OF LUOY ANG UN I V ERSI TY Dec . 2007C 、C +、Fortran 混合編程研究魏威, 魏沖(鄭州鐵路職業(yè)技術學院, 河南鄭州450052摘要:不同計算機編程語言都有其特有的優(yōu)勢和局限性, 將多種語言混合起來進行編程, 不但可以充分發(fā)揮各自的優(yōu)勢, 而且可以彌補各自功能的不足, 這樣既能充分利用現有程序資源, 又能加快應用程序的開發(fā). 主要闡述了C 、C +、Fortran 等3種語言在不同平臺下混合編程應注意的問題, 以及在混合編程中經常遇到的2個問題.關鍵詞:混合編程

2、; C; C +; Fortran中圖分類號:TP311文獻標識碼:A 文章編號:1007-113X (2007 04-0094-05Fortran 算, 但是Fortran , RAD 特性的Fortran 編譯集成開發(fā)環(huán)境. 當用Fortran , 據輸入簡易、結果顯示方便的W C 、C +進行編程卻比較容易實現這些功能. 因此, , +、Fortran 等進行混合編程. 在混合語言編程中, 主.1W indows Fortran 語言沒有大小寫之分, 而W indows 平臺下的混合語言編程過程中大小寫問題十分突出. 考慮到編譯器的差異, 可以用以下方式進行跨平臺編程的函數聲明. 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)境.假設一個C 語言函數為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這樣就可實現上述函數在Fortran 或

4、C +程序中的直接調用.假設一個Fortran 函數為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- , 女, 漢族, 河南省鄭州市人, 工程師, 研究方向:計算機技術. 第4期魏威等:C 、C +、Fortran 混合編程研究95#end

5、if這樣, 就可以在C +的程序里面直接調用上述函數. 由于C 編譯器里面沒有定義cp lus p lus 這個環(huán)境變量, 因此在C 文件里面也可以直接使用這個頭文件.如果是一個C +函數void cPlus p lusFuncti on ( , 和C 函數一樣可定義如下.#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經過上

6、面的定義后, 所有的函數便可實現在3種語言間自由調用.在用3三種語言進行混合編程過程中要注意函數的參數、字符串的傳遞問題. 數, 如函數v oid cCharFuncti on (char 3m sg , 需要定義如下.void cCharFuncti on (char 3m sg, int len 經過上面的定義之后, 在Fortran (m Fortran 程序沒有明顯的字符串結束標志, 如果是2C 1個字符串. 所以, 最好在C 的程序里對這個由, len 變量可以得到字符串長度, 截取m sg 的前l(fā)en . 而在Fortran 程序里面, 如函數S UBROUTI N E FCHAR

7、F UNCTI O N (fchar , , 進行下面的定義即可.#definef CharFuncti on (fchar , FCHARF UNCTI O N (fchar, strlen (fchar 這樣, 在C 、C +程序里即可直接調用.在3種語言的混合編程里還有一個需要注意的問題就是指針問題. Fortran 里面所有的變量都相當于C 、C +里面的指針, 所以, 在C 、C +程序里函數的參數應一律聲明為指針形式(除字符串參數后面的長度外 .在混合編程過程中, 數據方面存在的差異也必須引起足夠的重視, 這體現在數組和結構2個方面. 在Fortran 語言里, 數組和C 、C +

8、里的數組有些不同, 這表現在行列順序和數組起始值. Fortran 語言不同于C 、C +的行優(yōu)先, 而使用列優(yōu)先的方式. 假設有一個數組a, m 行n 列, 采用行優(yōu)先時的數據存放格式如下.a 11, a 12, , a 1n , a 21, a 22, , a 2n , , a m 1, a m 2, , a m n而采用列優(yōu)先的數據存放格式如下.a 11, a 21, , a m 1, a 12, a 22, , a m 2, , a 1n , a 2n , , a m n行優(yōu)先順序推廣到多維數組, 規(guī)定為先排最右的下標; 列優(yōu)先順序推廣到多維數組, 規(guī)定為先排最左的下標. 這樣, 在混

9、合語言編程里調用數據時必須注意行列優(yōu)先的差別, 進行準確地調用.數組的另一個差別是起始下標的不同. Fortran 默認的數組下標是以1開始的, 而C 、C +默認的數組下標卻是從0開始的, 所以在調用時要注意加1或者減1, 以保證調用到正確的數據.Fortran 語言里的結構經過聲明后就被分配了空間, 在C 、C +里面也要聲明它, 采用下面的方式. Fortran 結構聲明格式如下.COMMON /COLOR7/C_RED , C_GREEN,C_BLUECOMMON /NDDAT/N I D (NASI ZE , XN (3, NASI ZE C 、C +結構聲明格式如下.#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、 上的不同. 考慮到編譯器的差異, 在函數聲明上可以用下面的方式進行跨平臺編程的函數聲明. C 、C +編譯器使用G NU gcc, Fortran 編譯器使用pgi Fortran .假設一個C 函數為void cFuncti on ( , 那么只需要在它的頭文件里面進行如下定義即可.#ifdef_cplus p lusextern “C ”v oid #endifextern v oid CFuncti on ( ;#definecFuncti on cfuncti on_#ifdef_cplus p lus這樣, 在C +的程序里面就可以直接進行調用了. 需要注意的是, 函數名應該不多于

12、31個字符.同樣, 對于C +和Fortran 里的函數, 函數名在聲明的時候也應改成小寫加下劃線即可.對于數組來說, 具體變化和W indows 平臺的處理方式是一致的, 都是行列優(yōu)先順序不同的. 而對于字符串來說, 則不需要額外的注意, gcc 編譯器會處理好這個問題, 也就是說并不需要額外的改變.對于數據結構的定義, 也要改成小寫加下劃線的方式. 其中, Fortran 的數據結構定義方式如下. COMMON /COLOR7/C_RED , C_GREEN,C_BLUECOMMON /NDDAT/N I D (NASI ZE , XN (3, NASI ZE C 、C +的數據結構定義方

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, 這一點需要特別注意, 在讀寫數據文件時應該給予足夠的重視. 其他的Unix 平臺, 如HP Unix 、ULTR I X 、I R I S 等, 一般都只有define 上的微小差別, 在字符串處理、結構及數組方面基本與L inux 相同. 對它們 第4期魏威等:C 、C +、Fortran 混合編程研究97來說, 考慮更多的應該是中央處理器不同帶來的差別.4混合編程中的字符串處理混合編程中經常會出現需要傳遞字符串的情況,

15、而字符串的傳遞是一個較為麻煩的問題. 在Fortran 里, 字符串是沒有結束符的, 但是有長度的概念, 也就是說, 編譯器會給每一個字符串一個長度以控制字符串的長度, 但是這個長度參數在不同的平臺下其位置也是不同的(有的直接跟在字符串后面, 有的則跟在函數參數的最后面 , 對于常見的平臺, 如W indows 、L inux 、Solaris 、HP Unix 、I R I S, 可以用如下方法定義. 以C 函數為例, 定義如下.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 里調用的話, 需要以下定義.#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 里便可以直接調用如下.CALL MESS AG (char1, i1, char2, i2同樣, 在Fortran 里寫的字符串處理函數使用以上的define 和extern 后, 也可以在C 里直接調用. 5混合編程中的文件讀寫處理文件讀寫也是混合編程中一個非常重要的問題, 通常的問題發(fā)生于不同平臺下的混合編程或者不同Fortran 編譯器間的編譯.在Fortran 中, 文件的寫

19、入是由write 語句完成的, 而每一個write 語句可一次性寫入多個數據構成一個數據塊, 而每一個無格式數據塊都由下面3部分組成:(1 數據塊的開始標志, 記錄所有數據所占的字節(jié)數; (2 組成該數據塊的各數據內容. 整型數和浮點數均占4個字節(jié), 低字節(jié)在前, 高字節(jié)在后. 各數據間不空格; (3 每個數據塊的結束標志, 也為該數據塊的字節(jié)數, 而不是以回車換行符作為結束標志. 各記錄之間也沒有分隔符.另外, 由于編程語言的差異, 不同的編譯器的存儲格式也存在差異, 如V isual Fortran 與D igital Fortran 在存儲數據塊中還存在著差別. 在一個write 語句中

20、, V isual Fortran 存儲數據塊的開始標志與結束標志是 98洛陽大學學報2007用一個字節(jié)表示, 而在D igital Fortran 是用一個整形數, 即4個字節(jié)來表示. 也就是說, V isual Fortran 一個數據塊最多可以存儲128個字節(jié), 如果一個write 語句要求寫入的數據量大于128字節(jié)時, 則按循環(huán)形式存入. 所以, D igital Fortran 在讀取時就應該把它轉化為相應的D igital Fortran 存儲形式.6結束語混合編程的優(yōu)勢在于它允許調用用另一種語言編寫的現有程序代碼、使用在特定語言環(huán)境下難以實現的算法和獲得處理速度方面的優(yōu)勢. 在混合編程中的關鍵問題是協調2種或多種語言間所的調用約定、命名約定及參數傳遞方式, 并使它們在數據結構、數據類型上保持一致.參考文獻:1孫鑫, 余安萍. V isual C +深入詳解M.北京:電子工業(yè)出版社, 2006.2??藸? C +編程思想M.北京:機械工業(yè)出版社, 2002.3任哲. MFC W indows 應用程序設計M.北京:清華大學出版社, 2004.4周振紅. Fortran

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論