国产日韩欧美一区二区三区三州_亚洲少妇熟女av_久久久久亚洲av国产精品_波多野结衣网站一区二区_亚洲欧美色片在线91_国产亚洲精品精品国产优播av_日本一区二区三区波多野结衣 _久久国产av不卡

?

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

2014-04-29 00:44:03鄒倩倩孫沛楊冰孫夢婕
電子世界 2014年21期
關(guān)鍵詞:函數(shù)調(diào)用字符串

鄒倩倩 孫沛 楊冰 孫夢婕

【摘要】通過對C、C++、Fortran不同語言混合起來進(jìn)行編程,利用各自在數(shù)字計算和可視化應(yīng)用等方面的優(yōu)勢,達(dá)到優(yōu)勢互補(bǔ),并對在C、C++、Fortran混合編程中經(jīng)常遇到的一些問題及其處理方式進(jìn)行研究,如字符串處理、文件讀寫處理、函數(shù)調(diào)用、數(shù)據(jù)結(jié)構(gòu)的存儲等。

【關(guān)鍵詞】C;C++;Fortran;混合編程;字符串;文件讀寫;函數(shù)調(diào)用

對C、C++、Fortran不同語言混合起來進(jìn)行編程,利用各自的優(yōu)勢,彌補(bǔ)各自功能的不足,如FORTRAN語言具有強(qiáng)大的科學(xué)數(shù)字計算功能,但繪圖功能不強(qiáng);而C、C++語言計算功能不強(qiáng),但它具有良好的移植性和較強(qiáng)的圖形功能,可將計算方式轉(zhuǎn)變?yōu)閿?shù)據(jù)輸入簡易、結(jié)果顯示方便的Windows可視化應(yīng)用程序,因此,在許多情況下,我們應(yīng)該使用C、C++、Fortran等進(jìn)行混合編程。在既要大量計算,又要圖形處理的開發(fā)環(huán)境中,可以通過混合編程,達(dá)到優(yōu)勢互補(bǔ)。

1.混合編程開發(fā)平臺及編譯開發(fā)環(huán)境的選擇

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

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

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

語言約定的一致性?;旌暇幊虝r,要注意調(diào)用程序與被調(diào)用程序遵守同樣的約定,不能發(fā)生沖突。這些約定包括命名約定、調(diào)用約定、參數(shù)傳遞約定和函數(shù)返回值約定。

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

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

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

#ifdef_cplusplus

extern/C0void{

#endif

externvoid_stdcallCFunction();

#definecFunctionCFUNCTION

#ifdef_cplusplus

}

#endif

這樣就可實現(xiàn)上述函數(shù)在Fortran或C++程序中的直接調(diào)用。

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

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

以C函數(shù)為例,定義如下。

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

{

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

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

}

如果要在Fortran里調(diào)用的話,需要以下定義。

#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里便可以直接調(diào)用如下。

CALLMESSAG(char1,i1,char2,i2)

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

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

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

4.混合編程過程中數(shù)據(jù)結(jié)構(gòu)的處理

主要體現(xiàn)在數(shù)組和結(jié)構(gòu)2個方面。在Fortran語言里,數(shù)組和C、C++里的數(shù)組有些不同,這表現(xiàn)在行列順序和數(shù)組起始值.Fortran語言不同于C、C++的行優(yōu)先,而使用列優(yōu)先的方式。假設(shè)有一個數(shù)組a,m行n列,采用行優(yōu)先時的數(shù)據(jù)存放格式如下。

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

am1,am2,,,amn

而采用列優(yōu)先的數(shù)據(jù)存放格式如下。

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

行優(yōu)先順序推廣到多維數(shù)組,規(guī)定為先排最右的下標(biāo);列優(yōu)先順序推廣到多維數(shù)組,規(guī)定為先排最左的下標(biāo)。這樣,在混合語言編程里調(diào)用數(shù)據(jù)時必須注意行列優(yōu)先的差別,進(jìn)行準(zhǔn)確地調(diào)用.數(shù)組的另一個差別是起始下標(biāo)的不同。Fortran默認(rèn)的數(shù)組下標(biāo)是以1開始的,而C、C++默認(rèn)的數(shù)組下標(biāo)卻是從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_BLUE

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

C、C++結(jié)構(gòu)聲明格式如下。

#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

綜合上述問題的研究,混合編程的優(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ù)類型上保持一致。

參考文獻(xiàn)

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

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

[3]周振紅.IntelVisualFortran應(yīng)用程序開發(fā)[M].鄭州:黃河水利出版社,2006.

[4]浩強(qiáng)工作組.Fortran經(jīng)典程序設(shè)計[M].大連:大連理工大學(xué)出版社,2004.

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

猜你喜歡
函數(shù)調(diào)用字符串
基于D1-H應(yīng)用處理器的RT-Thread駐留方法
C程序設(shè)計課程教學(xué)中知識點與德育點映射
基于C語言的數(shù)學(xué)菜單的設(shè)計與實現(xiàn)
基于文本挖掘的語詞典研究
基于函數(shù)調(diào)用序列模式和函數(shù)調(diào)用圖的程序缺陷檢測方法*
探討C++編程中避免代碼冗余的技巧
Unity3D項目腳本優(yōu)化分析與研究
中國新通信(2017年1期)2017-03-08 03:12:21
一種新的基于對稱性的字符串相似性處理算法
高效的top-k相似字符串查詢算法
依據(jù)字符串匹配的中文分詞模型研究
旺苍县| 银川市| 阿勒泰市| 望奎县| 海林市| 宁德市| 毕节市| 贡觉县| 甘孜县| 沁阳市| 珲春市| 凉城县| 临颍县| 乌鲁木齐市| 和平区| 开封市| 平罗县| 佳木斯市| 云南省| 星座| 徐水县| 汾阳市| 睢宁县| 绥棱县| 西城区| 个旧市| 喜德县| 海阳市| 瓦房店市| 高邑县| 左贡县| 蓬安县| 临高县| 政和县| 台南县| 仁化县| 望都县| 烟台市| 城口县| 南岸区| 丽江市|