VB與Fortran的混合編程_第1頁
VB與Fortran的混合編程_第2頁
VB與Fortran的混合編程_第3頁
VB與Fortran的混合編程_第4頁
VB與Fortran的混合編程_第5頁
已閱讀5頁,還剩7頁未讀, 繼續(xù)免費(fèi)閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請(qǐng)進(jìn)行舉報(bào)或認(rèn)領(lǐng)

文檔簡介

1、VB 與Fortran 的混合編程一、 實(shí)驗(yàn)?zāi)康?掌握VB 和Fortran 混合編程的方法。2掌握Fortran 中動(dòng)態(tài)鏈接庫的創(chuàng)建方法。3掌握VB 中對(duì)動(dòng)態(tài)鏈接庫的調(diào)用方法。二、實(shí)驗(yàn)原理一般VB 與Fortran 混合編程的方法主要有兩種, 即VB 中直接調(diào)用可執(zhí)行文件(利用Shell 函數(shù)直接調(diào)用Fortran 編譯出來的可執(zhí)行文件 和利用動(dòng)態(tài)鏈接庫DLL (Dynamic Link Library 與Fortran 混合編程。第一種方法比較簡單,將Fortran 源程序編譯為可執(zhí)行文件(擴(kuò)展名為.exe )之后在VB 環(huán)境下用shell(函數(shù)調(diào)用即可。這種方法適合于計(jì)算量較大而交互操作

2、不多的時(shí)候。但是, Shell 函數(shù)是以異步方式執(zhí)行的, 這種執(zhí)行方式使VB 程序不能等待Fortran 程序計(jì)算結(jié)束, 而是繼續(xù)執(zhí)行后續(xù)的程序, 從而容易使最終結(jié)果出錯(cuò)。第二種方法是將Fortran 源程序編譯為動(dòng)態(tài)鏈接庫(擴(kuò)展名為.dll ),然后在VB 環(huán)境下調(diào)用動(dòng)態(tài)鏈接庫里的函數(shù)和過程來完成各項(xiàng)計(jì)算任務(wù)。雖然沒有第一種方法操作簡單,但是調(diào)用動(dòng)態(tài)鏈接庫的方法更為靈活和實(shí)用。三、 Fortran 中動(dòng)態(tài)鏈接庫(.dll 文件)的創(chuàng)建在Compaq Visual Fortran 6.5中創(chuàng)建“.Dll ”文件的步驟如下:1 創(chuàng)建dll 項(xiàng)目(Project )跟一般的Fortran 項(xiàng)目相似

3、,首先要?jiǎng)?chuàng)建一個(gè)dll 項(xiàng)目,具體步驟如下: 點(diǎn)擊File New ,在彈出的new 對(duì)話框中選擇Projects 項(xiàng)下的Dynamic Link Library ,在右側(cè)Project Name 下面的文本框中輸入項(xiàng)目名稱,在Location 下的文本框中選好路徑之后點(diǎn)擊Ok ,這樣我們就創(chuàng)建了一個(gè)空的dll 項(xiàng)目文件。2 在dll 項(xiàng)目中添加文件在剛才創(chuàng)建的dll 項(xiàng)目中添加一個(gè)空文件,這跟普通的Fortran 項(xiàng)目中添加文件的方法一樣。點(diǎn)擊file new ,在彈出的new 對(duì)話框中選擇Files 項(xiàng),在列表框中選擇文件類型(單擊選中即可),一般選擇Fortran Fixed forma

4、t Source Files(固定格式源文件)或Fortran Free format Source Files(自由格式源文件),在右邊File 標(biāo)簽下的文本框中輸入源文件名,點(diǎn)擊OK ,一個(gè)空的源文件就建好了,接下來可以在里面編寫Fortran 源程序了。3 創(chuàng)建子程序(過程)和函數(shù)Dll 文件是一種特殊的可執(zhí)行文件,在其源程序中沒有主程序,而是一個(gè)或多個(gè)子程序或函數(shù),我們通過調(diào)用這些子程序和函數(shù)來完成一些特定的任務(wù)。在Dll 項(xiàng)目中創(chuàng)建子程序和函數(shù)的方法跟一般Fortran 項(xiàng)目文件中的沒有太大的差別,只需在子程序或函數(shù)開始時(shí)加入如下一些微軟擴(kuò)展屬性編譯偽指令即可:!MS$ attrib

5、utes dllexport!MS$ attributes alias!MS$ attributes value!MS$ attributes reference例如,如果要編寫一個(gè)計(jì)算雙精度實(shí)數(shù)加法的子程序,子程序名為subplus ,輸入?yún)?shù)為a 和b ,輸出參數(shù)為c ,則完整的源程序可以這樣寫:subroutine subplus(a,b,c!MS$ attributes dllexport : subplus!MS$ attributes alias :'subplus':subplus!MS$ attributes value:a,b!MS$ attributes r

6、eference:creal(8:a,b,cc=a+breturn end subroutine subplus一般情況下我們將輸入?yún)?shù)定義為傳遞數(shù)值方式,而將輸出變量定義為傳遞地址方式。像這樣添加一些子程序函數(shù),然后可以將他們編譯和生成dll 文件(快捷鍵是F7)。之后在該項(xiàng)目文件目錄下的debug 文件夾中可以找到這個(gè)以項(xiàng)目名稱命名的dll 文件,我們可以在VB 環(huán)境中調(diào)用它。四、 VB2005中對(duì)動(dòng)態(tài)鏈接庫的調(diào)用VB 對(duì)動(dòng)態(tài)鏈接庫的調(diào)用如同對(duì)普通子程序或函數(shù)的調(diào)用,在調(diào)用之前必須先對(duì)Dll 中的子程序或函數(shù)聲明。聲明格式如下:Public|Private Declare Sub|Func

7、tion Name Lib“Libname ”Alias“aliasname ”(arglist 例如在C 盤根目錄下有一個(gè)名為mathfunction.dll 的動(dòng)態(tài)鏈接庫,我們對(duì)這個(gè)庫中名為subplus 的子程序的聲明如下:Public Declare Sub subplus Lib "C:mathfunction.dll" (ByVal a As Double , ByVal b As Double , ByRef c As Double 在聲明之后這些函數(shù)或過程就可以向普通的函數(shù)或過程一樣在VB 環(huán)境下調(diào)用了。五、 實(shí)驗(yàn)內(nèi)容用Fortran 編寫一個(gè)Dll 文件,

8、其中包含計(jì)算兩個(gè)雙精度實(shí)數(shù)加、減、乘、除的過程和函數(shù),而后在VB 環(huán)境下設(shè)置簡單的界面,通過調(diào)用這些過程和函數(shù)來完成兩個(gè)輸入雙精度實(shí)數(shù)的加、減、乘、除運(yùn)算,并將計(jì)算結(jié)果顯示出來。1、 Fortran 中創(chuàng)建一個(gè)名為mathfunction 的Dll 項(xiàng)目,在項(xiàng)目中添加一個(gè)名為mathfunction 的固定格式源文件,添加如下代碼:*subroutine*subroutine subplus(a,b,c!MS$ attributes dllexport : subplus!MS$ attributes alias :'subplus':subplus!MS$ attribute

9、s value:a,b!MS$ attributes reference:creal(8:a,b,cc=a+b returnend subroutine subplussubroutine subsubtract(a,b,c!MS$ attributes dllexport : subsubtract!MS$ attributes alias :'subsubtract':subsubtract!MS$ attributes value:a,b!MS$ attributes reference:creal(8:a,b,cc=a-breturnend subroutine sub

10、subtractsubroutine submultiply(a,b,c !MS$ attributes dllexport : submultiply!MS$ attributes alias :'submultiply':submultiply!MS$ attributes value:a,b!MS$ attributes reference:creal(8:a,b,cc=a*breturnend subroutine submultiplysubroutine subdivide(a,b,c !MS$ attributes dllexport : subdivide!MS

11、$ attributes alias :'subdivide':subdivide!MS$ attributes value:a,b!MS$ attributes reference:creal(8:a,b,cc=a/breturn end subroutine subdivide*subroutine*而后在項(xiàng)目中另添加一個(gè)名為mathfunction2的固定格式源文件,添加如下代碼:*function*function funplus(a,b!MS$ attributes dllexport : funplus!MS$ attributes alias :'funp

12、lus':funplus!MS$ attributes value:a,breal(8:a,b,funplusfunplus=a+breturnend function funplusfunction funsubtract(a,b!MS$ attributes dllexport : funsubtract!MS$ attributes alias :'funsubtract':funsubtract!MS$ attributes value:a,breal(8:a,b,funsubtractfunsubtract=a-b returnend function fun

13、subtractfunction funmultiply(a,b!MS$ attributes dllexport : funmultiply!MS$ attributes alias :'funmultiply':funmultiply!MS$ attributes value:a,breal(8:a,b,funmultiplyfunmultiply=a*breturnend function funmultiplyfunction fundivide(a,b!MS$ attributes dllexport : fundivide!MS$ attributes alias

14、:'fundivide':fundivide!MS$ attributes value:a,breal(8:a,b,fundividefundivide=a/breturn end function fundivide *function*編寫好源代碼后編譯生成Dll 文件。隨后我們會(huì)在該項(xiàng)目所在目錄下的debug 文件夾中找到這個(gè)名為mathfunction.dll 的文件。將這個(gè)Dll 文件拷貝到C:WINDOWSsystem。2 在VB2005中新建一個(gè)名為vb_fortran的Windows Application項(xiàng)目,設(shè)計(jì)界面,添加三個(gè)Label ,三個(gè)Textbox

15、 和四個(gè)Button ,在代碼編輯器中輸入以下代碼:Public Class Form1Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs Handles Button1.ClickDim a As DoubleDim b As DoubleDim c As Doublea = CDbl (TextBox1.Textb = CDbl (TextBox2.Text'Call subplus(a, b, cc = funplus(a, bTextBox3.Text = cE

16、nd SubPrivate Sub Button2_Click(ByVal sender As System.Object, ByVal e As System.EventArgs Handles Button2.ClickDim a As DoubleDim b As DoubleDim c As Doublea = CDbl (TextBox1.Textb = CDbl (TextBox2.Text'Call subsubtract(a, b, cc = funsubtract(a, bTextBox3.Text = cEnd SubPrivate Sub Button3_Clic

17、k(ByVal sender As System.Object, ByVal e AsSystem.EventArgs Handles Button3.ClickDim a As DoubleDim b As DoubleDim c As Doublea = CDbl (TextBox1.Textb = CDbl (TextBox2.Text'Call submultiply(a, b, cc = funmultiply(a, bTextBox3.Text = cEnd SubPrivate Sub Button4_Click(ByVal sender As System.Object

18、, ByVal e As System.EventArgs Handles Button4.ClickDim a As DoubleDim b As DoubleDim c As Doublea = CDbl (TextBox1.Textb = CDbl (TextBox2.Text'Call subdivide(a, b, cc = fundivide(a, bTextBox3.Text = cEnd SubEnd Class上面的代碼也很簡單。代碼中將對(duì)過程的調(diào)用注釋掉了,因?yàn)檫@里對(duì)過程和對(duì)函數(shù)的調(diào)用結(jié)果是一樣的,任選其一都可以,注意調(diào)用的格式就可以了。在項(xiàng)目文件中添加一個(gè)模塊文件

19、,輸入以下代碼:Module Module1Public Declare Sub subplus Lib "mathfunction.dll" (ByVal a As Double ,ByVal b As Double , ByRef c As Double Public Declare Sub subsubtract Lib "mathfunction.dll" (ByVal a As Double , ByVal b As Double , ByRef c As Double Public Declare Sub submultiply Lib &q

20、uot;mathfunction.dll" (ByVal a As Double , ByVal b As Double , ByRef c As Double Public Declare Sub subdivide Lib "mathfunction.dll" (ByVal a As Double , ByVal b As Double , ByRef c As Double Public Declare Function funplus Lib "mathfunction.dll" (ByVal a As Double , ByVal b As Double As DoublePublic Declare Function funsubtract Lib "mathfunction.dll" (ByVal a As Double , ByVal b As Double As DoublePublic Declare Function funmultiply Lib "mathfunction.dll" (ByVal a As Double , ByVal b As Double As DoublePublic

溫馨提示

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

最新文檔

評(píng)論

0/150

提交評(píng)論