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

Fortran 90借用C++函數(shù)模板

2013-01-22 03:45:41畢蘇萍周振紅赫曉慧

畢蘇萍,周振紅,赫曉慧

(1.鄭州大學(xué) 土木工程學(xué)院,河南 鄭州450001;2.鄭州大學(xué)水利與環(huán)境學(xué)院,河南鄭州450001)

0 引言

在計(jì)算機(jī)科學(xué)與技術(shù)領(lǐng)域,泛型編程(Generic Programming)具有廣泛的意義.用泛型編程先驅(qū)(Alexander Stepanov)的話來說:泛型編程是對(duì)算法、數(shù)據(jù)結(jié)構(gòu)進(jìn)行抽象和分類,其目標(biāo)是遞增式構(gòu)造實(shí)用、高效、抽象的算法、數(shù)據(jù)結(jié)構(gòu)的系統(tǒng)目錄結(jié)構(gòu)或框架[1].簡(jiǎn)言之,泛型編程是將算法、數(shù)據(jù)結(jié)構(gòu)由具體的實(shí)例提升到一般、抽象的形式,使之可以操作不同的數(shù)據(jù)類型.

C++提供了模板(包括類模板和函數(shù)模板),并逐步積累有相對(duì)完善的標(biāo)準(zhǔn)模板庫(kù)STL[2],對(duì)泛型編程給予了很好的支持.Fortran從77到90[3]、2003[4]對(duì)泛型編程的支持不斷加強(qiáng),但直至2008也沒能提供模板工具[5].假如 Fortran 90借用C++函數(shù)模板能夠獲得成果,那么無疑會(huì)極大地拓展C++的應(yīng)用空間,給科學(xué)與工程計(jì)算增添新的活力.筆者就此展開探討,示例程序測(cè)試環(huán)境:C++為 VC 6.0,F(xiàn)ortran 90為 Compaq Visual Fortran 6.6.

1 C++特殊的重載函數(shù)簇—函數(shù)模板

C++支持函數(shù)重載,允許在參數(shù)表不同的前提下于同一編譯單元定義幾個(gè)同名函數(shù),調(diào)用時(shí)依據(jù)參數(shù)表最佳匹配的原則自動(dòng)選擇合適的函數(shù).比如在編程計(jì)算中,1/2整數(shù)除結(jié)果為0,1.0/2.0實(shí)數(shù)除結(jié)果為0.5,筆者用兩個(gè)重載函數(shù)予以驗(yàn)證(當(dāng)中的參數(shù)采取引用傳遞,和Fortran 90的參數(shù)傳遞保持一致):

int divid(int&a,int&b){return a/b;}

float divid(float&a,float&b){return a/b;}.

測(cè)試上列重載函數(shù)的主函數(shù)為:

void main(void){

int a=1,b=2;float x=1.0,y=2.0;

cout<< ″1/2=″<< divid(a,b) << endl;//整數(shù)除

cout<<″1.0/2.0=″<< divid(x,y) <<endl;}//實(shí)數(shù)除.程序運(yùn)行結(jié)果為:

1/2=0

1.0/2.0=0.5.

觀察上列重載函數(shù),不難發(fā)現(xiàn)兩個(gè)特點(diǎn):①是接口類同,惟有函數(shù)結(jié)果、參數(shù)的數(shù)據(jù)類型不同;②是算法相同.在這種情況下,將上列重載函數(shù)抽象為一個(gè)函數(shù)模板、用一個(gè)泛型T代替函數(shù)結(jié)果、參數(shù)的數(shù)據(jù)類型:

template<typename T>//亦可用class代替typename聲明函數(shù)模板中的泛型

T divid(T&a,T&b){return a/b;}//divid,a,b的類型均為泛型T

同樣的測(cè)試主函數(shù),當(dāng)調(diào)用divid(a,b)函數(shù)時(shí)構(gòu)造的是divid<int>函數(shù)模板實(shí)例,而當(dāng)調(diào)用divid(1.0,2.0)函數(shù)時(shí)則構(gòu)造的是divid<float>函數(shù)模板實(shí)例,分別與整型和實(shí)型重載函數(shù)divid相當(dāng),所以測(cè)試結(jié)果與上列重載函數(shù)的相同.說明上列重載函數(shù)與函數(shù)模板的效果完全相同,從而證明,可以將函數(shù)模板看成是一特殊的重載函數(shù)簇.

2 Fortran 90模擬C++函數(shù)重載

要模擬C++函數(shù)重載,有必要先回顧一下Fortran 90接口塊的引入.Fortran 90共有4種程序單元:主程序、外部例程(子程序和函數(shù)統(tǒng)稱為例程)、模塊和數(shù)據(jù)塊,當(dāng)被調(diào)程序?yàn)橥獠坷虝r(shí),為使編譯器產(chǎn)生正確調(diào)用,F(xiàn)ortran 90要求在調(diào)用程序中建立被調(diào)外部例程的接口塊,以明確其接口信息:例程名、例程實(shí)現(xiàn)機(jī)制(函數(shù),或者子程序)、函數(shù)類型、參數(shù)的類型、屬性及傳遞方式.當(dāng)被調(diào)外部例程接口簡(jiǎn)單時(shí),是否在調(diào)用程序中建立其接口塊是可選的;當(dāng)接口復(fù)雜時(shí),建立其接口塊就成為必須的.比如:外部函數(shù)返回?cái)?shù)組或變長(zhǎng)字符串,參數(shù)中有可選參數(shù),有假定形狀數(shù)組、指針或目標(biāo)屬性參數(shù),有例程參數(shù)(即例程作參數(shù),類似于C語言中的函數(shù)指針作參數(shù))等.接口塊的構(gòu)造形式為:

Interface

Function/Subroutine例程名 (形參表)!接口

形參聲明(包括函數(shù)結(jié)果類型聲明)

End Function/Subroutine

End Interface.

Fortran 90不直接支持例程重載,不允許定義同名的外部例程,但允許將幾個(gè)外部例程接口置于同一接口塊內(nèi),并給接口塊命名、以接口塊名作為各個(gè)外部例程的統(tǒng)稱,調(diào)用時(shí)依據(jù)接口匹配的原則自動(dòng)選擇相對(duì)應(yīng)的外部例程,從而推出了支持泛型編程的接口塊(姑且稱為泛型接口塊).

Interface泛型接口塊名

接口體

End Interface.

其中,接口體由幾個(gè)外部例程或者模塊例程接口構(gòu)成.

下面用Fortran 90實(shí)現(xiàn)前述C++函數(shù)重載示例.首先,用外部例程(函數(shù))div_int和div_real分別實(shí)現(xiàn)C++整數(shù)除和實(shí)數(shù)除重載函數(shù),其實(shí)現(xiàn)代碼只比各自的接口多一行.

div_int=x/y或div_real=x/y

包含其泛型接口塊(divid)的主程序?yàn)?

PROGRAM test_overloading

Implicit None

Interface divid!泛型接口塊

Integer Function div_int(x,y)!外部例程接口

Integer,Intent(IN)::x,y

End Function

Real Function div_real(x,y)!外部例程接口

Real,Intent(IN)::x,y

End Function

End Interface

WRITE(* ,*)'1/2=',divid(1,2)!整數(shù)除

WRITE(* ,*)'1.0/2.0=',divid(1.0,2.0)!實(shí)數(shù)除

END PROGRAM.程序運(yùn)行結(jié)果為:

1/2=0

1.0/2.0=0.500 000 0.

調(diào)用程序使用了統(tǒng)一的泛型接口塊名divid,而真正調(diào)用的是與接口匹配的div_int、div_real外部例程或稱為“重載”例程;C++盡管重載函數(shù)名稱相同,但由于編譯時(shí)增加的特殊修飾其目標(biāo)函數(shù)名并不相同,這樣才有可能依據(jù)不同的參數(shù)表調(diào)用與之匹配的重載函數(shù).可見:這里的外部例程加泛型接口塊與C++重載函數(shù)的效果是相同的.

3 C++函數(shù)模板實(shí)例化為“重載”例程

無論是C++的重載函數(shù)還是C++的函數(shù)模板,都只有在C++環(huán)境中才能直接調(diào)用或?qū)嵗幢阍谄渥蛹疌語言中也無法直接使用.推想背后的道理,可能是編譯器的功能所致.C++編譯器能夠添加特殊的命名修飾,據(jù)此可以判明對(duì)應(yīng)的重載函數(shù)或構(gòu)造不同的函數(shù)模板實(shí)例;C編譯器無此功能,所以它不支持函數(shù)重載或函數(shù)模板,C++的重載函數(shù)或函數(shù)模板也禁止使用C鏈接(其作用是消除C++編譯器的特殊命名修飾).

前面筆者已經(jīng)探討過:Fortran 90在泛型接口塊的支持下,可以將普通外部例程當(dāng)作是C++的重載函數(shù),進(jìn)而也可以看成是C++函數(shù)模板實(shí)例.這樣一來,如果設(shè)法在C++環(huán)境中將函數(shù)模板實(shí)例化為 Fortran 90“重載”例程,就可采取C++與 Fortran的混合編譯[6],從而在 Fortran 90環(huán)境中使用C++函數(shù)模板.循這一思路,在前述C++函數(shù)模板示例代碼下面增加包裝子

extern ″C″{

int__stdcall DIV_INT(int&a,int&b){return divid(a,b);}

float__stdcall DIV_REAL(float&a,float&b){return divid(a,b);}}

為使接口與Fortran 90的“重載”例程接口保持一致,上列設(shè)置采取C鏈接、__stdcall調(diào)用約定、大寫命名約定及引用參數(shù)傳遞方式.此處的包裝子有兩個(gè)作用:對(duì)內(nèi),實(shí)例化函數(shù)模板;對(duì)外,承擔(dān)Fortran 90“重載”例程.

將前述C++函數(shù)模板和包裝子單獨(dú)保存為一個(gè)文件(.cpp),并與 Fortran 90主程序文件(.f90)置于同一項(xiàng)目.程序運(yùn)行結(jié)果,與模擬C++函數(shù)重載示例的結(jié)果相同.

4 結(jié)論

將C++函數(shù)模板看成接口相似、算法相同的特殊重載函數(shù)簇,在泛型接口塊支持下,將Fortran 90外部例程模擬成C++重載函數(shù),然后在C++環(huán)境中添加包裝子,將函數(shù)模板實(shí)例化成Fortran 90“重載”例程,進(jìn)而在Fortran 90環(huán)境中以正常方式使用C++函數(shù)模板.像C等其它語言要借用C++函數(shù)模板,也可采取同樣的思路.

[1]ALEXANDER A.STEPANOV.Generic programming[EB/OL].http://www.stepanovpapers.com/,2012.5.22.

[2]DAVID V,NICOLAI M J.C++Templates:The Complete Guide[M].Addison Wesley,2003.

[3]周振紅,郭恒亮,張君靜,等.Fortran 90/95高級(jí)程序設(shè)計(jì)[M].鄭州:黃河水利出版社,2005.

[4]Fortran 2003 standard[EB/OL].http://www.j3-fortran.org/doc/year/04/04-007.pdf,2012.5.22.

[5]CHIVERS S.Introduction to programming with fortran with coverage of fortran 90,95,2003,2008 and 77[M].Springer,2012.

[6]任慧,周振紅,張成才.Fortran與C/C++的混合編譯[J].計(jì)算機(jī)工程與設(shè)計(jì),2007,28(17):4096-4098、4111.

主站蜘蛛池模板: 国产久草视频| 99久久国产综合精品女同| 久青草免费在线视频| 国产主播在线一区| 亚洲首页国产精品丝袜| 色首页AV在线| 中文字幕66页| 97视频在线观看免费视频| 亚洲天堂高清| 国产精品网址在线观看你懂的| www.youjizz.com久久| 在线一级毛片| 高清不卡一区二区三区香蕉| 91小视频在线观看免费版高清| 婷婷六月在线| 亚洲91精品视频| 激情乱人伦| AV网站中文| 伦精品一区二区三区视频| 一级毛片在线直接观看| 欧美一区二区三区国产精品| 免费国产小视频在线观看| 国产无人区一区二区三区| 欧美性精品| 在线网站18禁| 久久精品国产精品青草app| 欧美三级视频网站| 免费a级毛片视频| 久久黄色视频影| 国产午夜人做人免费视频| 日韩少妇激情一区二区| 国产成人区在线观看视频| 国产第一页免费浮力影院| h网站在线播放| 伊人中文网| 日本免费高清一区| 秋霞国产在线| 亚洲永久视频| 欧美日韩在线观看一区二区三区| 国产精品jizz在线观看软件| 天堂在线视频精品| 伊伊人成亚洲综合人网7777| 国产aⅴ无码专区亚洲av综合网| 午夜啪啪福利| 欧美成人午夜视频| 久青草网站| 久久77777| 中国国产一级毛片| 国产丝袜第一页| 91日本在线观看亚洲精品| 国产成人亚洲综合A∨在线播放| 欧美精品v日韩精品v国产精品| 麻豆精品在线| 手机精品视频在线观看免费| 色婷婷成人| 制服丝袜在线视频香蕉| 毛片网站观看| 国产亚洲视频中文字幕视频| 国产永久免费视频m3u8| 欧美中文字幕第一页线路一| 欧美一级视频免费| 香蕉视频在线观看www| 精品人妻一区无码视频| 色综合天天综合中文网| 国产在线一区视频| 曰AV在线无码| 无码福利视频| 亚洲色欲色欲www在线观看| 日韩在线视频网| 在线观看国产小视频| www.国产福利| 久久国产成人精品国产成人亚洲 | 久久午夜夜伦鲁鲁片无码免费| 免费aa毛片| 久久国产精品娇妻素人| 国产成人精品一区二区三区| 色有码无码视频| 亚洲经典在线中文字幕| 亚洲日本一本dvd高清| 狼友视频一区二区三区| 久视频免费精品6| 欧美日韩一区二区在线免费观看|