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

主站蜘蛛池模板: 午夜限制老子影院888| 激情国产精品一区| 亚洲欧美日本国产综合在线 | 久久永久视频| 国产主播在线观看| 国产激情无码一区二区免费| 亚洲欧洲日本在线| 亚洲三级a| 内射人妻无码色AV天堂| 国产91导航| 亚洲国产看片基地久久1024| 日韩 欧美 小说 综合网 另类| 日韩专区第一页| 99久久亚洲综合精品TS| 黄色免费在线网址| 国产一级在线播放| 国内精品视频| 欧美日韩国产在线播放| 国产91色在线| 美女啪啪无遮挡| 日韩一区二区三免费高清| 亚洲欧美自拍中文| 久久99精品久久久久纯品| 国产综合亚洲欧洲区精品无码| 噜噜噜久久| 亚洲国产天堂久久综合| 亚洲—日韩aV在线| 亚洲美女视频一区| 日韩国产亚洲一区二区在线观看| 亚洲天堂.com| 久久久久九九精品影院| 国产啪在线91| 激情综合网激情综合| 国产成人综合欧美精品久久| 久久久亚洲色| 成·人免费午夜无码视频在线观看| 国产99视频精品免费观看9e| 又爽又大又黄a级毛片在线视频| 97人妻精品专区久久久久| 波多野结衣一二三| 免费看a级毛片| 熟妇丰满人妻av无码区| 97免费在线观看视频| 在线观看视频99| 国产精品女在线观看| 97精品久久久大香线焦| 大学生久久香蕉国产线观看| 国产欧美日韩综合在线第一| 欧美综合一区二区三区| 天天综合网色中文字幕| 草草影院国产第一页| 亚洲人妖在线| 制服丝袜一区| 99久久精品视香蕉蕉| 国产在线麻豆波多野结衣| 亚洲欧洲国产成人综合不卡| 欧美亚洲中文精品三区| 99资源在线| 免费福利视频网站| 国产日韩欧美视频| 99精品久久精品| 欧美成人日韩| 无码专区在线观看| 亚洲无码精品在线播放| 国产精品制服| 草逼视频国产| 69视频国产| 国产另类视频| 亚洲综合经典在线一区二区| 国产女人喷水视频| 99re精彩视频| 国产一级毛片网站| 亚洲娇小与黑人巨大交| 乱系列中文字幕在线视频 | 日韩无码视频专区| 中文字幕在线永久在线视频2020| 久久精品只有这里有| 欧美一区二区福利视频| 91美女视频在线观看| 久久semm亚洲国产| 欧美日韩福利| 亚洲国产日韩在线成人蜜芽|