(完整版)Fortran混合編程課件_第1頁
(完整版)Fortran混合編程課件_第2頁
(完整版)Fortran混合編程課件_第3頁
(完整版)Fortran混合編程課件_第4頁
(完整版)Fortran混合編程課件_第5頁
已閱讀5頁,還剩23頁未讀 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Fortran混合編程概述主要內容混合語言編程概述參數傳遞協(xié)議命名約定堆棧管理定義Fortran中過程的原型在VIF(XE2011)環(huán)境下混合編程混合語言編程概述概念:由兩種以上語言寫成的源代碼形成的程序的過程?;旌险Z言編程綜合了不同語言之間的優(yōu)點,使得編程更加快捷。Fortran適合科學計算,Visual C+更適合于圖形界面編程;兩者結合能加快編程開發(fā)速度。這里主要介紹Fortran和C/C+的混合編程問題!混合語言編程概述1、混合編程的難點是解決不同語言之間的通信問題2、而程序之間的通信是通過例程之間的相互調用實現(xiàn)的。3、不同語言間的語法規(guī)范不同,要正確通信,必須,必須建立統(tǒng)一的約定,即

2、調用約定。這里的例程是不同語言的函數、過程、子例程的總稱調用約定參數傳遞命名約定堆棧考慮參數傳遞協(xié)議參數傳遞包括以下四個方面,參數傳遞順序:Fortran和C/C+實參和虛參的對應順序都是從左到右。參數傳遞方式:值傳遞或者地址傳遞。參數數目是否可變:是否識別可選參數參數數據類型:整型,浮點,字符參數傳遞協(xié)議(一)參數傳遞方式參數傳遞方式由Attributes屬性指定,兩種方式:方式一、c,stdcall選項:Subroutine s1(a,b,c)!DEC$ attributes C : s1Real(4) a, b,cEnd subroutineC、stdcall聲明過程遵循Windows標

3、準參數傳遞方式,就是C語言參數傳遞模式區(qū)別是什么呢參數傳遞協(xié)議參數傳遞方式方式二,reference,value選項:Subroutine s1(a,b,c) !DEC$ attributes value: a,b Real(4) a, b,cEnd subroutineReference和value選項能單獨指定輸入參數的傳遞方式Reference 指定參數為引用傳遞,這正是Fortran默認的傳值方式Value指定參數為值傳遞,這正可以適應C/C+的傳值方式參數傳遞協(xié)議參數傳遞方式以上討論的均是在Fortran源程序中作改動,實際上由于C/C+含有指針這一特殊類型,就不需要再對值傳遞和引用

4、傳遞另外作聲明了。Subroutine s1(a,b,c)!DEC$ attributes value: a,bReal(4) a, b,cEnd subroutineExtern “C”Void _ stacall s1(float a,float b,float * c);參數傳遞協(xié)議(二)參數數目C+可以定義參數可選的函數,對于這種情況Fortran如何處理呢?Real(4) function func(x,a,b)!dec$ attributes c,varying : func!dec$ attributes alias:_func:funcReal(4) x,a,bEnd func

5、tion由Fortran調用C+程序extern “C” float func(float x,float a=0,float b=0) float f;f=a*x*x+b*x*x;return f;主程序:Program a1Write(*,*) func(1.0,3.0)end參數傳遞協(xié)議參數數目結論:如果Fortran需要調用帶有可選參數的C+函數,須在fortran程序中用c,Varying對例程進行聲明。!dec$ attributes c,varying : 例程名選項C的作用,在后面堆棧管理約定時詳細介紹。參數傳遞協(xié)議(三)數據類型FortranC/C+Integer(2)sho

6、rtInteger(4)Int,longReal(4)floatReal(8)doubleFortran和C/C+對應的數據類型命名約定名稱約定包括變量名稱、例程名稱、模塊名稱(fortran)等?;旌暇幊陶嬲盎旌稀钡氖窃诓煌Z言匯編形成的目標文件。對名稱的約定也就是對.obj文件中相應名稱所作的約定!Fortran對大小寫不敏感,但C/C+對大小寫確實嚴格區(qū)分的。編譯的過程命名約定Fortran中對名稱的聲明分三種情況:一、缺省不管fortran源文件中名稱如何,在.obj文件 中名稱一律大寫。二、指定C、stdcall選項 不管fortran源文件中名稱如何,在.obj文件 中名稱一律小

7、寫。三、Alias指定別名在.obj文件中名稱與Alias規(guī)定的名稱完全相同。命名約定C/C+對名稱說明:不論是缺省還是用cdecl、stdcall聲明,名稱均保留混合大小寫。C+的命名約定和C略有不同,C+生成的obj文件中名稱有對外部符號的修飾,一般在聲明時加上extern “C”,使其丟掉修飾而與C的命名規(guī)則一致。命名約定匯總表語言屬性.Obj中名稱name的大小寫Fortran!DEC$ atrributes C_name全部小寫Fortran!DEC$ Attributes Stdcall_namen全部小寫Fortran缺省_namen全部大寫CCdel(缺省)_name大小寫混合

8、C_stdcall_namen大小寫混合C+缺省_namederoction大小寫混合注:name為定義的函數或子例程名稱 n代表調用時堆棧地址,n為虛參列表占堆棧的大小注意,Alias服從這些法則實際上,當用Fortran調用C/C+編寫的程序(含有混合大小寫時),必須用Alias聲明別名。因為Attributes屬性其他選項無法實現(xiàn)混合大小寫的聲明。命名約定(示例)Subroutine add(a,b,c)!DEC$ Attributes C:addInteger(4) a,b,cC=a+bEnd subroutineextern “C” void add(int* a,int* b,in

9、t* c);void main()int a=1,b=2,c=0;add(&a,&b,&c);printf(“c=%d”,c);Subroutine add(a,b,c)!DEC$ Attributes stdcall,Alias _add12:add!dec$ Attributes reference : a,b,cInteger(4) a,b,cC=a+bEnd subroutineSubroutine add(a,b,c)!DEC$ Attributes stdcall,Alias: _add12:add!dec$ Attributes reference : a,bInteger(4)

10、 a,b,cC=a+bEnd subroutine命名約定(示例)Subroutine add(a,b,c)Integer(4) a,b,cC=a+bEnd subroutineextern “C” _cdecl ADD(int*a,int*b,int*c)void main()int a=1,b=2,c=0;ADD(&a,&b,&c);printf(“c=%d”,c);Subroutine add(a,b,c)!DEC$ Attributes c,Alias: _add12:AddInteger(4) a,b,cC=a+bEnd subroutineextern “C” _cdecl Add

11、(int*a,int*b,int*c)void main()int a=1,b=2,c=0;Add(&a,&b,&c);printf(“c=%d”,c);命名約定(續(xù))Fortran調用C/C+定義的函數:program mainimplicit nonereal(8): a=2.0,b=3.0,cinterface function add2(m,n) !dec$ attributes stdcall,alias:_Add216:add2 real(8) m,n,add2 end function end interface print *,add2(a,b) read (*,*) cend

12、#includeextern C double _stdcall Add2(double m,double n)return m+n;別名命名約定(續(xù))fortran中模塊的名稱Fortran模塊名稱在.obj文件中的形式為_MODULENAME_mp_ENTITYstacksizemodule tt1implicit nonecontainsfunction mult(a,b)!dec$ attributes c:mult!dec$ attributes value:a,breal(4) a,b,multmult=a*bend function multend moduleextern Cv

13、oid _cdecl add(int *a,int *b,int* c);extern Cfloat _cdecl TT1_mp_mult(float a,float b);int main()int a=1,b=2,c=0;add(&a,&b,&c);printf(c=%d,c);float ct;ct=TT1_mp_mult(a,b);printf(nct=%f,ct);scanf(%d,&c);堆棧管理程序之間例程的調用都是通過堆棧實現(xiàn)的,先將例程地址、例程參數壓入堆棧,然后再彈出例程參數和例程地址。堆棧滿足先進后出的原則。在聲明調用約定C的情況下,當執(zhí)行程序由被調例程返回時,由調用程序

14、負責出棧、清理堆棧的工作;缺省約定和Stdcall約定條件下,由被調用例程控制堆棧。正因為在C約定下,由調用程序控制堆棧,調用程序知道有多少參數被傳遞,占多少個字節(jié),駐留在堆棧的什么位置等信息,所以在C約定下可以傳遞可變數量的參數。在C約定之外規(guī)定外部例程擁有Varying屬性,就能實現(xiàn)例程參數數目可變。real functiion ff(x,a,b,c)!dec$ attributes C,Varying:ffendfunctionextern “C” double(double x,double a,double b=0.0,double c=0.0)定義Fortran過程原型當要用For

15、tran調用其他語言的程序時,應該在Fortran源代碼中定義例程的原型(接口塊)interface 例程語句 例程 attributes 屬性 參數Attributes屬性 正式參數聲明end 例程end interfaceAttributes 屬性和前面的聲明方法、作用完全一樣示例VIF(XE2011)環(huán)境下混合編程VS2010環(huán)境下不能同時將多個語言的源程序放在同一個項目中編譯,F(xiàn)ortran和C/C+源程序需先編譯成目標文件.obj,然后在主程序所在工程中鏈接形成.exe文件。Fortran 調用C+C+ 調用FortranVIF(XE2011)環(huán)境下混合編程fortran調用C/C+函數很容易實現(xiàn),在Visual studio環(huán)境下,需要將編譯器默認的運行庫設置 debug multithreaded修改為multithreaded,否則會出現(xiàn)如下的錯誤:VIF(XE2011)環(huán)境下混合編程C/C+調用Fortran例程:僅僅將Fortran生成的.obj文件添加到項目中還不夠,另外還需要將Fortran編譯器下的一些靜態(tài)庫包含進來。在安裝目錄下:ComposerXE-2011compilerlibia32The endThank you例程的等價形式語言有返回值調用無返回值調用Fortran函數(Function)子

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論