亚洲免费av电影一区二区三区,日韩爱爱视频,51精品视频一区二区三区,91视频爱爱,日韩欧美在线播放视频,中文字幕少妇AV,亚洲电影中文字幕,久久久久亚洲av成人网址,久久综合视频网站,国产在线不卡免费播放

        ?

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

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

        鄒倩倩 孫沛 楊冰 孫夢(mèng)婕

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

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

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

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

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

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

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

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

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

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

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

        #ifdef_cplusplus

        extern/C0void{

        #endif

        externvoid_stdcallCFunction();

        #definecFunctionCFUNCTION

        #ifdef_cplusplus

        }

        #endif

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

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

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

        以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.混合編程中的文件讀寫處理

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

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

        主要體現(xiàn)在數(shù)組和結(jié)構(gòu)2個(gè)方面。在Fortran語言里,數(shù)組和C、C++里的數(shù)組有些不同,這表現(xiàn)在行列順序和數(shù)組起始值.Fortran語言不同于C、C++的行優(yōu)先,而使用列優(yōu)先的方式。假設(shè)有一個(gè)數(shù)組a,m行n列,采用行優(yōu)先時(shí)的數(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ù)時(shí)必須注意行列優(yōu)先的差別,進(jìn)行準(zhǔn)確地調(diào)用.數(shù)組的另一個(gè)差別是起始下標(biāo)的不同。Fortran默認(rèn)的數(shù)組下標(biāo)是以1開始的,而C、C++默認(rèn)的數(shù)組下標(biāo)卻是從0開始的,所以在調(diào)用時(shí)要注意加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)勢(shì)在于它允許調(diào)用另一種語言編寫的現(xiàn)有程序代碼、使用在特定語言環(huán)境下難以實(shí)現(xiàn)的算法和獲得處理速度方面的優(yōu)勢(shì)。在混合編程中的關(guān)鍵問題是協(xié)調(diào)2種或多種語言間所的調(diào)用約定、命名約定及參數(shù)傳遞方式,并使它們?cè)跀?shù)據(jù)結(jié)構(gòu)、數(shù)據(jù)類型上保持一致。

        參考文獻(xiàn)

        [1]張志華,王林江,呂慶風(fēng).混合編程與FORTRAN計(jì)算程序可視化[J].計(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è)計(jì)[M].大連:大連理工大學(xué)出版社,2004.

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

        猜你喜歡
        函數(shù)調(diào)用字符串
        基于D1-H應(yīng)用處理器的RT-Thread駐留方法
        C程序設(shè)計(jì)課程教學(xué)中知識(shí)點(diǎn)與德育點(diǎn)映射
        基于C語言的數(shù)學(xué)菜單的設(shè)計(jì)與實(shí)現(xiàn)
        基于文本挖掘的語詞典研究
        基于函數(shù)調(diào)用序列模式和函數(shù)調(diào)用圖的程序缺陷檢測(cè)方法*
        探討C++編程中避免代碼冗余的技巧
        Unity3D項(xiàng)目腳本優(yōu)化分析與研究
        中國新通信(2017年1期)2017-03-08 03:12:21
        一種新的基于對(duì)稱性的字符串相似性處理算法
        高效的top-k相似字符串查詢算法
        依據(jù)字符串匹配的中文分詞模型研究
        精品国产亚洲一区二区三区演员表 | 中文乱码字慕人妻熟女人妻| 国产亚洲精品av一区| 免费人成网站在线视频| 亚洲中文字幕高清av| 97青草超碰久久国内精品91| 久草手机视频在线观看| 男女啪啪视频高清视频| 欧美肥婆性猛交xxxx| 日韩精品视频一区二区三区 | 国产真实乱人偷精品人妻| 99久久夜色精品国产网站| 亚洲av美女在线播放啊| 高清国产一级毛片国语| 亚洲区精选网址| 成人自拍视频国产一区| 被驯服人妻中文字幕日本| 女人被躁到高潮嗷嗷叫免费软| 女人一级特黄大片国产精品| 亚洲一区二区三区偷拍自拍| 亚洲男人在线天堂av| 女同舌吻互慰一区二区| 国产一区二区三免费视频| 中文在线中文a| 国产成人无码av| 4hu四虎永久在线观看| 日日猛噜噜狠狠扒开双腿小说| 欧美最猛黑人xxxxx猛交| 亚洲国产精品自产拍久久蜜AV | 久久国产亚洲高清观看5388| 婷婷五月亚洲综合图区| 亚洲无人区乱码中文字幕| 日本频道一区二区三区| 亚洲av毛片在线网站| 亚洲国产精品无码一线岛国| 无套内谢老熟女| 日日噜狠狠噜天天噜av| 一二三四在线视频社区3| 国产成人久久蜜一区二区| 国产精品亚洲美女av网站| 91精品人妻一区二区三区水蜜桃|