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—),女,青海西寧人,工學學士,助理工程師,現供職于遼寧省氣象服務中心,研究方向:氣象電子。

主站蜘蛛池模板: 麻豆AV网站免费进入| 一级毛片免费不卡在线| 亚洲午夜国产精品无卡| 香蕉99国内自产自拍视频| 毛片大全免费观看| 午夜精品区| 亚洲中文字幕手机在线第一页| 国产手机在线小视频免费观看| 国产精选自拍| 91麻豆国产在线| 亚洲国产精品成人久久综合影院| 免费人成视网站在线不卡| 色亚洲成人| 亚洲天堂自拍| 久久精品人人做人人爽电影蜜月| 久久99国产乱子伦精品免| 国产91色在线| 黄色网址免费在线| 538精品在线观看| 手机在线免费毛片| 日本高清在线看免费观看| 香蕉eeww99国产精选播放| 亚洲精品无码人妻无码| 久久国产精品无码hdav| 黄色网站不卡无码| 在线精品自拍| av一区二区三区高清久久| 国模视频一区二区| 亚洲香蕉在线| 在线观看国产黄色| 国产成本人片免费a∨短片| 国产91高跟丝袜| 久久一色本道亚洲| 国产真实自在自线免费精品| 日韩AV无码一区| 高清免费毛片| 国产噜噜噜| 久久77777| 国产精品熟女亚洲AV麻豆| 久久婷婷五月综合97色| 国产在线第二页| 亚洲中文字幕无码爆乳| 亚洲日本韩在线观看| 狠狠色香婷婷久久亚洲精品| 亚洲毛片一级带毛片基地| 在线观看无码a∨| 久久精品91麻豆| 91久久天天躁狠狠躁夜夜| 国产精品久久自在自2021| 午夜日b视频| 国产精品嫩草影院av| 国产在线观看91精品亚瑟| 亚洲精品在线91| 亚洲国产成人久久77| 最新精品久久精品| 一级全黄毛片| 2022国产无码在线| 日韩一区二区三免费高清| 亚洲第一视频网站| 婷婷色在线视频| 日韩精品一区二区深田咏美| a级免费视频| 亚洲成人黄色网址| 996免费视频国产在线播放| 91口爆吞精国产对白第三集| YW尤物AV无码国产在线观看| 黄色不卡视频| 在线国产资源| 国产剧情一区二区| 欧美有码在线| 99视频免费观看| 国产成熟女人性满足视频| 91原创视频在线| 国产网站免费观看| 日韩AV无码一区| 91原创视频在线| 国产偷倩视频| 99久久精品免费观看国产| 老司机精品一区在线视频| 国产69精品久久久久孕妇大杂乱 | 精品国产成人a在线观看| 国产乱码精品一区二区三区中文|