VB与Fortran的混合编程.docx
- 文档编号:12040764
- 上传时间:2023-04-16
- 格式:DOCX
- 页数:10
- 大小:18.30KB
VB与Fortran的混合编程.docx
《VB与Fortran的混合编程.docx》由会员分享,可在线阅读,更多相关《VB与Fortran的混合编程.docx(10页珍藏版)》请在冰豆网上搜索。
VB与Fortran的混合编程
VB与Fortran的混合编程
一、实验目的
1.掌握VB和Fortran混合编程的方法。
2.掌握Fortran中动态链接库的创建方法。
3.掌握VB中对动态链接库的调用方法。
二、实验原理
一般VB与Fortran混合编程的方法主要有两种,即VB中直接调用可执行文件(利用Shell函数直接调用Fortran编译出来的可执行文件)和利用动态链接库DLL(DynamicLinkLibrary)与Fortran混合编程。
第一种方法比较简单,将Fortran源程序编译为可执行文件(扩展名为.exe)之后在VB环境下用shell()函数调用即可。
这种方法适合于计算量较大而交互操作不多的时候。
但是,Shell函数是以异步方式执行的,这种执行方式使VB程序不能等待Fortran程序计算结束,而是继续执行后续的程序,从而容易使最终结果出错。
第二种方法是将Fortran源程序编译为动态链接库(扩展名为.dll),然后在VB环境下调用动态链接库里的函数和过程来完成各项计算任务。
虽然没有第一种方法操作简单,但是调用动态链接库的方法更为灵活和实用。
三、Fortran中动态链接库(.dll文件)的创建
在CompaqVisualFortran6.5中创建“.Dll”文件的步骤如下:
1)创建dll项目(Project)
跟一般的Fortran项目相似,首先要创建一个dll项目,具体步骤如下:
点击File——New,在弹出的new对话框中选择Projects项下的DynamicLinkLibrary,在右侧ProjectName下面的文本框中输入项目名称,在Location下的文本框中选好路径之后点击Ok,这样我们就创建了一个空的dll项目文件。
2)在dll项目中添加文件
在刚才创建的dll项目中添加一个空文件,这跟普通的Fortran项目中添加文件的方法一样。
点击file——new,在弹出的new对话框中选择Files项,在列表框中选择文件类型(单击选中即可),一般选择FortranFixedformatSourceFiles(固定格式源文件)或FortranFreeformatSourceFiles(自由格式源文件),在右边File标签下的文本框中输入源文件名,点击OK,一个空的源文件就建好了,接下来可以在里面编写Fortran源程序了。
3)创建子程序(过程)和函数
Dll文件是一种特殊的可执行文件,在其源程序中没有主程序,而是一个或多个子程序或函数,我们通过调用这些子程序和函数来完成一些特定的任务。
在Dll项目中创建子程序和函数的方法跟一般Fortran项目文件中的没有太大的差别,只需在子程序或函数开始时加入如下一些微软扩展属性编译伪指令即可:
!
MS$attributesdllexport
!
MS$attributesalias
!
MS$attributesvalue
!
MS$attributesreference
例如,如果要编写一个计算双精度实数加法的子程序,子程序名为subplus,输入参数为a和b,输出参数为c,则完整的源程序可以这样写:
subroutinesubplus(a,b,c)
!
MS$attributesdllexport:
:
subplus
!
MS$attributesalias:
'subplus':
:
subplus
!
MS$attributesvalue:
:
a,b
!
MS$attributesreference:
:
c
real(8):
:
a,b,c
c=a+b
return
endsubroutinesubplus
一般情况下我们将输入参数定义为传递数值方式,而将输出变量定义为传递地址方式。
像这样添加一些子程序函数,然后可以将他们编译和生成dll文件(快捷键是F7)。
之后在该项目文件目录下的debug文件夹中可以找到这个以项目名称命名的dll文件,我们可以在VB环境中调用它。
四、VB2005中对动态链接库的调用
VB对动态链接库的调用如同对普通子程序或函数的调用,在调用之前必须先对Dll中的子程序或函数声明。
声明格式如下:
[Public|Private]DeclareSub|FunctionNameLib“Libname”[Alias“aliasname”][([arglist])]
例如在C盘根目录下有一个名为mathfunction.dll的动态链接库,我们对这个库中名为subplus的子程序的声明如下:
PublicDeclareSubsubplusLib"C:
\mathfunction.dll"(ByValaAsDouble,ByValbAsDouble,ByRefcAsDouble)
在声明之后这些函数或过程就可以向普通的函数或过程一样在VB环境下调用了。
五、实验内容
用Fortran编写一个Dll文件,其中包含计算两个双精度实数加、减、乘、除的过程和函数,而后在VB环境下设置简单的界面,通过调用这些过程和函数来完成两个输入双精度实数的加、减、乘、除运算,并将计算结果显示出来。
1、Fortran中创建一个名为mathfunction的Dll项目,在项目中添加一个名为mathfunction的固定格式源文件,添加如下代码:
*************subroutine********************
subroutinesubplus(a,b,c)
!
MS$attributesdllexport:
:
subplus
!
MS$attributesalias:
'subplus':
:
subplus
!
MS$attributesvalue:
:
a,b
!
MS$attributesreference:
:
c
real(8):
:
a,b,c
c=a+b
return
endsubroutinesubplus
subroutinesubsubtract(a,b,c)
!
MS$attributesdllexport:
:
subsubtract
!
MS$attributesalias:
'subsubtract':
:
subsubtract
!
MS$attributesvalue:
:
a,b
!
MS$attributesreference:
:
c
real(8):
:
a,b,c
c=a-b
return
endsubroutinesubsubtract
subroutinesubmultiply(a,b,c)
!
MS$attributesdllexport:
:
submultiply
!
MS$attributesalias:
'submultiply':
:
submultiply
!
MS$attributesvalue:
:
a,b
!
MS$attributesreference:
:
c
real(8):
:
a,b,c
c=a*b
return
endsubroutinesubmultiply
subroutinesubdivide(a,b,c)
!
MS$attributesdllexport:
:
subdivide
!
MS$attributesalias:
'subdivide':
:
subdivide
!
MS$attributesvalue:
:
a,b
!
MS$attributesreference:
:
c
real(8):
:
a,b,c
c=a/b
return
endsubroutinesubdivide
*************subroutine********************
而后在项目中另添加一个名为mathfunction2的固定格式源文件,添加如下代码:
*************function********************
functionfunplus(a,b)
!
MS$attributesdllexport:
:
funplus
!
MS$attributesalias:
'funplus':
:
funplus
!
MS$attributesvalue:
:
a,b
real(8):
:
a,b,funplus
funplus=a+b
return
endfunctionfunplus
functionfunsubtract(a,b)
!
MS$attributesdllexport:
:
funsubtract
!
MS$attributesalias:
'funsubtract':
:
funsubtract
!
MS$attributesvalue:
:
a,b
real(8):
:
a,b,funsubtract
funsubtract=a-b
return
endfunctionfunsubtract
functionfunmultiply(a,b)
!
MS$attributesdllexport:
:
funmultiply
!
MS$attributesalias:
'funmultiply':
:
funmultiply
!
MS$attributesvalue:
:
a,b
real(8):
:
a,b,funmultiply
funmultiply=a*b
return
endfunctionfunmultiply
functionfundivide(a,b)
!
MS$attributesdllexport:
:
fundivide
!
MS$attributesalias:
'fundivide':
:
fundivide
!
MS$attributesvalue:
:
a,b
real(8):
:
a,b,fundivide
fundivide=a/b
return
endfunctionfundivide
*************function********************
编写好源代码后编译生成Dll文件。
随后我们会在该项目所在目录下的debug文件夹中找到这个名为mathfunction.dll的文件。
将这个Dll文件拷贝到C:
\WINDOWS\system。
2在VB2005中新建一个名为vb_fortran的WindowsApplication项目,设计界面,添加三个Label,三个Textbox和四个Button,
在代码编辑器中输入以下代码:
PublicClassForm1
PrivateSubButton1_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton1.Click
DimaAsDouble
DimbAsDouble
DimcAsDouble
a=CDbl(TextBox1.Text)
b=CDbl(TextBox2.Text)
'Callsubplus(a,b,c)
c=funplus(a,b)
TextBox3.Text=c
EndSub
PrivateSubButton2_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton2.Click
DimaAsDouble
DimbAsDouble
DimcAsDouble
a=CDbl(TextBox1.Text)
b=CDbl(TextBox2.Text)
'Callsubsubtract(a,b,c)
c=funsubtract(a,b)
TextBox3.Text=c
EndSub
PrivateSubButton3_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton3.Click
DimaAsDouble
DimbAsDouble
DimcAsDouble
a=CDbl(TextBox1.Text)
b=CDbl(TextBox2.Text)
'Callsubmultiply(a,b,c)
c=funmultiply(a,b)
TextBox3.Text=c
EndSub
PrivateSubButton4_Click(ByValsenderAsSystem.Object,ByValeAsSystem.EventArgs)HandlesButton4.Click
DimaAsDouble
DimbAsDouble
DimcAsDouble
a=CDbl(TextBox1.Text)
b=CDbl(TextBox2.Text)
'Callsubdivide(a,b,c)
c=fundivide(a,b)
TextBox3.Text=c
EndSub
EndClass
上面的代码也很简单。
代码中将对过程的调用注释掉了,因为这里对过程和对函数的调用结果是一样的,任选其一都可以,注意调用的格式就可以了。
在项目文件中添加一个模块文件,输入以下代码:
ModuleModule1
PublicDeclareSubsubplusLib"mathfunction.dll"(ByValaAsDouble,ByValbAsDouble,ByRefcAsDouble)
PublicDeclareSubsubsubtractLib"mathfunction.dll"(ByValaAsDouble,ByValbAsDouble,ByRefcAsDouble)
PublicDeclareSubsubmultiplyLib"mathfunction.dll"(ByValaAsDouble,ByValbAsDouble,ByRefcAsDouble)
PublicDeclareSubsubdivideLib"mathfunction.dll"(ByValaAsDouble,ByValbAsDouble,ByRefcAsDouble)
PublicDeclareFunctionfunplusLib"mathfunction.dll"(ByValaAsDouble,ByValbAsDouble)AsDouble
PublicDeclareFunctionfunsubtractLib"mathfunction.dll"(ByValaAsDouble,ByValbAsDouble)AsDouble
PublicDeclareFunctionfunmultiplyLib"mathfunction.dll"(ByValaAsDouble,ByValbAsDouble)AsDouble
PublicDeclareFunctionfundivideLib"mathfunction.dll"(ByValaAsDouble,ByValbAsDouble)AsDouble
EndModule
3保存并编译项目文件,然后执行文件。
程序运行时,在文本框textbox1和textbox2中输入两个参数,通过button控件对其进行某种数学运算操作,则在文本框textbox3中会正确的显示出结果来。
要注意的一点是,如果mathfunction.dll没有拷贝到C:
\WINDOWS\system,程序运行时会提示出错。
当然也不必一定要将mathfunction.dll拷贝到C:
\WINDOWS\system,只需在模块文件中声明函数或过程时在库文件名前加上完整的驱动器名和路径即可。
当然还有另外一种方法,就是直接将Dll文件拷贝到VB项目所在目录下的bin\Debug文件夹中。
六、结论
实践表明,VB和FORTRAN混合编程技术,为软件开发工作者开发具有良好运行界面并具有精确、高效运算功能的软件系统提供了技术支持,为充分利用现有优秀的FORTRAN程序代码资源,为不同单位之间协作攻关,以及使用不同编程工具的软件设计人员协作开发可靠高效、界面友好的软件系统提供了技术途径。
软件开发人员在可视化编程中可以调用各种其它语言编写的动态链接库,但在调用过程中须注意两种语言间的调用约定的协调,包括标识符命名、参数传递方式、参数数据类型、参数在堆栈中的排列顺序等,以及动态链接库的导出和导入声明,从而成功地实现两种语言的混合编程。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- VB Fortran 混合 编程
![提示](https://static.bdocx.com/images/bang_tan.gif)