資源描述:
《Fortran和C的混合語言編程-授課版》由會員上傳分享,免費在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、第十一章Fortran和C的混合語言編程第一節(jié)概述一.調(diào)用約定命名約定命名約定是為了解決不同語言對變量名、參數(shù)名、過程名和函數(shù)名等標(biāo)識符的不同處理,以及對名稱標(biāo)識符的不同長度限制等的有關(guān)規(guī)則、協(xié)議和約定.參數(shù)傳遞協(xié)議參數(shù)傳遞是指主調(diào)函數(shù)/例程與被調(diào)函數(shù)/例程之間的信息傳遞與交換過程,混合語言編程時需要考慮參數(shù)的傳遞通過值傳遞還是通過引用傳遞?被調(diào)函數(shù)以何種順序接收所傳遞給它的參數(shù)。第一節(jié)概述二、數(shù)據(jù)類型與例程的等價形式第一節(jié)概述二.Fortran和C的混合編程方式分別編譯、獨立運行將Fortran和C各自要實現(xiàn)的功能模塊源代碼在各自
2、的開發(fā)平臺上編譯連接成可執(zhí)行文件并獨立執(zhí)行,二者的數(shù)據(jù)通過數(shù)據(jù)文件交換。這種模式的實現(xiàn)最為簡單,容易掌握,但執(zhí)行效率較低;函數(shù)級調(diào)用Fortran和C分別編譯各自的功能模塊源代碼,得到各自的目標(biāo)文件(.obj),然后集成鏈接這些obj文件生成一個統(tǒng)一的可執(zhí)行文件,實現(xiàn)對對方函數(shù)的調(diào)用,數(shù)據(jù)交換通過約定接口來實現(xiàn)。這種方法的缺陷是被調(diào)用模塊一旦被修改,整個軟件必須重新進(jìn)行編譯連接。軟件的可維護(hù)性較差;動態(tài)鏈接庫方式將需要被調(diào)用的功能模塊源代碼編譯連接成動態(tài)連接庫,然后通過約定的接口動態(tài)使用另外的語言調(diào)用該功能模塊。這是目前普遍采用的一
3、種方式,動態(tài)連接庫(DLL)可以包含可執(zhí)行代碼、數(shù)據(jù)和各種資源,對其修改無需重新編譯主調(diào)程序,具有較好的移植性和復(fù)用性。第二節(jié)Fortran與C的函數(shù)級調(diào)用_stdcall第二節(jié)Fortran與C的函數(shù)級調(diào)用對于Fortran,可在接口塊的例程說明或例程頭部加入!MS$ATTRIBUTES編譯偽指令告知編譯器有關(guān)調(diào)用約定。其中,!MS$與!DEC$等同。對于C語言,要在函數(shù)說明前面加上extern關(guān)鍵字說明函數(shù)來自外部或供外部使用,extern和函數(shù)說明中間加上_cdecl或_stdcall說明調(diào)用約定的屬性。第二節(jié)Fortran與
4、C的函數(shù)級調(diào)用Fortran調(diào)用C的函數(shù)時,C的形參必須使用與Fortran實參同類型的指針變量,必須使用extern。!Fortran的接口塊INTERFACEFUNCTIONSUM(I,J)!MS$ATTRIBUTESC,ALIAS:'_Sum'::SUM!調(diào)用C語言的Sum函數(shù)!MS$ATTRIBUTESREFERENCE::I,JINTEGERI,J,SUMENDFUNCTIONENDINTERFACE/*C源程序*/externint_cdeclSum(int*,int*){…}第二節(jié)Fortran與C的函數(shù)級調(diào)用C調(diào)用F
5、ortran例程時,C的實參必須傳遞與Fortran形參同類型變量的地址,必須用extern!Fortran的例程SUBROUTINESUM(I,J)INTEGERI,J…ENDFUNCTION/*C源程序*/externint_cdeclSUM(int*,int*);intmain(){inta,b;…SUM(&a,&b);…}一.Fortran調(diào)用C語言函數(shù)例程調(diào)用約定如果C采用_cdecl方式的調(diào)用約定,它對應(yīng)于Fortran的C約定,C被調(diào)用的函數(shù)名nAme在其obj文件中保持混合大小寫,_nAme的形式出現(xiàn)在obj文件中。
6、Fortran的接口塊中必須用如下!MS$ATTRIBUTES編譯偽指令說明:!MS$ATTRIBUTESC,ALIAS:'_nAme'::NAME對應(yīng)的C語言源程序中,用如下語句說明函數(shù)Sum使用_cdecl屬性且用于文件外部:externintSum(int*p1,int*p2);或者externint_cdeclSum(int*p1,int*p2);一.Fortran調(diào)用C語言函數(shù)例程的調(diào)用約定如果C采用_stdcall方式的調(diào)用約定,它對應(yīng)于Fortran的STDCALL約定,C被調(diào)用的函數(shù)名nAme在其obj文件中保持混合
7、大小寫,以_nAme@n的形式出現(xiàn)在obj文件中。Fortran的接口塊用如下!MS$ATTRIBUTES編譯偽指令說明::!MS$ATTRIBUTESSTDCALL,ALIAS:'_nAme@n'::NAME對應(yīng)的C語言源程序中,用如下語句說明函數(shù)Sum使用_stdcall約定且用于文件外部:externint_stdcallSum(int*p1,int*p2);一.Fortran調(diào)用C語言函數(shù)參數(shù)的調(diào)用約定Fortran缺省參數(shù)傳遞為引用傳遞,若在外部例程中施加了C或STDCALL調(diào)用約定,則缺省的引用傳遞改為值傳遞(數(shù)組參數(shù)除
8、外)。為了消除調(diào)用約定對參數(shù)傳遞的影響,可以在外部例程中添加具體的參數(shù)傳遞屬性(REFERENCE或VALUE)聲明。若某形參為值傳遞,此時使用VALUE關(guān)鍵字:!MS$ATTRIBUTESVALUE::a!將a定義為值傳遞方式若某形