999精品在线视频,手机成人午夜在线视频,久久不卡国产精品无码,中日无码在线观看,成人av手机在线观看,日韩精品亚洲一区中文字幕,亚洲av无码人妻,四虎国产在线观看 ?

C、C++、Fortran混合編程技術研究與問題處理

2014-04-29 00:44:03鄒倩倩孫沛楊冰孫夢婕
電子世界 2014年21期

鄒倩倩 孫沛 楊冰 孫夢婕

【摘要】通過對C、C++、Fortran不同語言混合起來進行編程,利用各自在數字計算和可視化應用等方面的優勢,達到優勢互補,并對在C、C++、Fortran混合編程中經常遇到的一些問題及其處理方式進行研究,如字符串處理、文件讀寫處理、函數調用、數據結構的存儲等。

【關鍵詞】C;C++;Fortran;混合編程;字符串;文件讀寫;函數調用

對C、C++、Fortran不同語言混合起來進行編程,利用各自的優勢,彌補各自功能的不足,如FORTRAN語言具有強大的科學數字計算功能,但繪圖功能不強;而C、C++語言計算功能不強,但它具有良好的移植性和較強的圖形功能,可將計算方式轉變為數據輸入簡易、結果顯示方便的Windows可視化應用程序,因此,在許多情況下,我們應該使用C、C++、Fortran等進行混合編程。在既要大量計算,又要圖形處理的開發環境中,可以通過混合編程,達到優勢互補。

1.混合編程開發平臺及編譯開發環境的選擇

Fortran語言沒有大小寫之分,而Windows平臺下的混合語言編程過程中大小寫問題十分突出。考慮到編譯器的差異,可以用以下方式進行跨平臺編程的函數聲明。C、C++編譯器使用MicrosoftVisualC++6.0編譯集成開發環境,Fortran編譯器使用DigitalVisualFortran6.0編譯集成開發環境。

VC++與FORTRAN的語言編譯器同出自微軟家族,且使用同一操作平臺,因此在它們兩者之間進行混合編程是完全可以實現的,但是必須充分考慮兩種語言之間的接口問題,即在存儲模式、語言約定、數據處理以及例程單位等方面的一致性問題。

存儲模式的一致性。存儲模式是指編譯器應遵循的某種規則,這種規則是把程序的代碼和數據裝入存儲器段中的一套預先制定的規則,它定義了編譯器將代碼和數據組織分段的方法,同時也規定了訪問每段中代碼和數據的尋址方法。一般來說PC機上有6種存儲模式:微小模式(Tiny)、小模式(Small)、中模式(Medi-um)、緊湊模式(Compact)、大模式(Large)、巨模式(Huge)。對FORTRAN一般用大模式,而VC++至少是緊湊模式以上,因為FORTRAN采用段間或遠程傳址。

語言約定的一致性。混合編程時,要注意調用程序與被調用程序遵守同樣的約定,不能發生沖突。這些約定包括命名約定、調用約定、參數傳遞約定和函數返回值約定。

命名約定,即在編程過程中相互匹配的標識符應保持一致。由于VC++語言嚴格區分大小寫,而FORTRAN中不存在大小寫問題,VC++中還存在類型說明及其它一些問題,如果命名約定在調用程序與被調用程序之間不一致,程序就不會成功地連接。FORTRAN的缺省方式使符號名在目標文件中變成大寫,如果在VC++程序中調用一個使用FORTRAN缺省的FORTRAN子例程,在VC++中需用一個純大寫的名稱來生成一個調用;當在VC++中用一個純小寫的名稱來生成一個調用時,在FORTRAN程序中需用C和STDCALL屬性將所有名稱轉換為純小寫的形式;在VC++中,當一個調用例程的名稱以混合書寫形式出現的時候,需使用FORTRAN的ALIAS屬性來解決混合書寫形式之間的命名沖突。

調用約定,指語言實現調用的規則及方法。調用約定可以從三個方面影響程序設計:首先是調用例程利用調用約定決定傳遞給另一個例程的自變量的順序;其次是被調用的例程利用調用約定決定接收傳遞過來參數的順序;第三是所有涉及堆棧這樣一種數據結構的參數從椎棧中移去后,調用例程和被調用例程必須在調整堆棧的職責上取得一致。在VC++與FORTRAN語言混合編程時,兩者之間的函數調用一般采用C與STDCALL調用約定。

假設一個C語言函數為voidcFunction(),那么只需要在它的頭文件里面進行如下定義即可。

#ifdef_cplusplus

extern/C0void{

#endif

externvoid_stdcallCFunction();

#definecFunctionCFUNCTION

#ifdef_cplusplus

}

#endif

這樣就可實現上述函數在Fortran或C++程序中的直接調用。

2.混合編程中的字符串處理

混合編程中經常會出現需要傳遞字符串的情況,而字符串的傳遞是一個較為麻煩的問題。在Fortran里,字符串是沒有結束符的,但是有長度的概念,也就是說,編譯器會給每一個字符串一個長度以控制,在Windows平臺下用如下方法定義。

以C函數為例,定義如下。

voidmessag(char*msg1,int*where1,char*msg2,int*where2)

{

printf(/,,%sshouldbe%d,while%ssh-

ouldbe%d\n0,msg1,*where1,msg2,where2);

}

如果要在Fortran里調用的話,需要以下定義。

#ifdefinedULTRIX||SPARC||IRIS||LINUX||WIN32

#ifdefinedULTRIX||SPARC||IRIS||LINUX

externvoid_stdcallmessag(char*,int*,char*,int*,int,int)

#definemessag(s1,i1,s2,i2)messag_(s1,i1,s2,i2,strlen(s1),strlen(s2))

#else/*WIN32Platform*/

externvoid_stdcallmessag(char*,int,int*,char*,int,int*)

如果要用在C++中,需要如下定義。

#ifdef_cplusplus

extern/C0{

#endif

/*yourexterncode*/

#ifdef_cplusplus

}

#endif

Fortran里便可以直接調用如下。

CALLMESSAG(char1,i1,char2,i2)

同樣,在Fortran里寫的字符串處理函數使用以上的define和extern后,也可以在C里直接調用。

3.混合編程中的文件讀寫處理

文件讀寫也是混合編程中一個非常重要的問題,由于編程語言的差異,不同的編譯器的存儲格式也存在差異,如VisualFortran與DigitalFortran在存儲數據塊中還存在著差別。在一個write語句中,VisualFortran存儲數據塊的開始標志與結束標志是用一個字節表示,而在DigitalFortran是用一個整形數,即4個字節來表示。也就是說,VisualFortran一個數據塊最多可以存儲128個字節,如果一個write語句要求寫入的數據量大于128字節時,則按循環形式存入。所以,DigitalFortran在讀取時就應該把它轉化為相應的DigitalFortran存儲形式。

4.混合編程過程中數據結構的處理

主要體現在數組和結構2個方面。在Fortran語言里,數組和C、C++里的數組有些不同,這表現在行列順序和數組起始值.Fortran語言不同于C、C++的行優先,而使用列優先的方式。假設有一個數組a,m行n列,采用行優先時的數據存放格式如下。

a11,a12,a1n,a21,a22,,,a2n,,,

am1,am2,,,amn

而采用列優先的數據存放格式如下。

a11,a21,,,am1,a12,a22,,,am2,,,a1n,a2n,,,amn

行優先順序推廣到多維數組,規定為先排最右的下標;列優先順序推廣到多維數組,規定為先排最左的下標。這樣,在混合語言編程里調用數據時必須注意行列優先的差別,進行準確地調用.數組的另一個差別是起始下標的不同。Fortran默認的數組下標是以1開始的,而C、C++默認的數組下標卻是從0開始的,所以在調用時要注意加1或者減1,以保證調用到正確的數據。

Fortran語言里的結構經過聲明后就被分配了空間,在C、C++里面也要聲明它,采用下面的方式。

Fortran結構聲明格式如下。

COMMON/COLOR7/C_RED,C_GREEN,C_BLUE

COMMON/NDDAT/NID(NASIZE),XN(3,NASIZE)

C、C++結構聲明格式如下。

#ifdef_cplusplus

extern"C"{

#endif

#definecolor7COLOR7

#definenddatNDDAT

externstruct{floatc_red;floatc_green;floatc_blue;}color7;

externstruct{intnid[NASIZE];floatxn[NASIZE][3];}ndda;t

#ifdef_cplusplus

}

#endif

綜合上述問題的研究,混合編程的優勢在于它允許調用另一種語言編寫的現有程序代碼、使用在特定語言環境下難以實現的算法和獲得處理速度方面的優勢。在混合編程中的關鍵問題是協調2種或多種語言間所的調用約定、命名約定及參數傳遞方式,并使它們在數據結構、數據類型上保持一致。

參考文獻

[1]張志華,王林江,呂慶風.混合編程與FORTRAN計算程序可視化[J].計算機應用,1999,19(6):33-35.

[2]袁平.多語言混合編程的技術關鍵及方法[J].電腦與信息技術,1996,(1):43-45.

[3]周振紅.IntelVisualFortran應用程序開發[M].鄭州:黃河水利出版社,2006.

[4]浩強工作組.Fortran經典程序設計[M].大連:大連理工大學出版社,2004.

作者簡介:鄒倩倩(1986—),女,青海西寧人,工學學士,助理工程師,現供職于遼寧省氣象服務中心,研究方向:氣象電子。

主站蜘蛛池模板: 欧美激情一区二区三区成人| 久久大香香蕉国产免费网站| 日韩精品久久久久久久电影蜜臀| 日本免费a视频| 亚洲天堂自拍| 波多野结衣一二三| 1769国产精品视频免费观看| 国产 在线视频无码| 9丨情侣偷在线精品国产| 美女内射视频WWW网站午夜| 欧美成人免费午夜全| 国产亚洲视频中文字幕视频| 国产欧美精品一区aⅴ影院| 国产成人h在线观看网站站| 国产嫩草在线观看| 国产原创演绎剧情有字幕的| 日韩在线2020专区| 免费在线色| 国产99热| 亚洲九九视频| 欧美日本不卡| 日本一区中文字幕最新在线| 欧美日韩在线亚洲国产人| 亚洲美女视频一区| 91精品视频网站| 丰满人妻久久中文字幕| 热思思久久免费视频| 欧洲一区二区三区无码| 狠狠色噜噜狠狠狠狠色综合久 | 麻豆精选在线| 国禁国产you女视频网站| 黄色三级网站免费| 人人澡人人爽欧美一区| 久久人人97超碰人人澡爱香蕉| 精品国产免费第一区二区三区日韩| 国产成人精品在线| 亚洲视频一区| 国产精品久久国产精麻豆99网站| 91国内在线视频| 国产亚洲欧美日本一二三本道| 亚洲色图欧美| 国产另类乱子伦精品免费女| 国产网站免费| 岛国精品一区免费视频在线观看| 99热精品久久| 激情六月丁香婷婷四房播| 国产精品第一区| 黄色国产在线| 日本高清在线看免费观看| 日韩a在线观看免费观看| 麻豆a级片| 午夜福利在线观看入口| 99re经典视频在线| 毛片久久久| 在线精品亚洲国产| 日本免费福利视频| 亚洲色欲色欲www网| 国产国语一级毛片在线视频| 亚洲最大在线观看| 99精品高清在线播放 | 国产亚洲精品精品精品| 2020国产精品视频| a级高清毛片| 最新日韩AV网址在线观看| 中文字幕在线一区二区在线| 国产精品福利一区二区久久| 精品自窥自偷在线看| 欧美五月婷婷| 视频一区亚洲| 人人澡人人爽欧美一区| 亚洲欧美日韩中文字幕在线| 久久精品国产电影| 国产免费怡红院视频| 国产青榴视频| 国产精品无码AV中文| 91年精品国产福利线观看久久 | h网址在线观看| 国产美女丝袜高潮| 亚洲成人高清在线观看| 国产真实二区一区在线亚洲| 亚洲一级毛片在线播放| 免费看美女自慰的网站|