【VB开源代码栏目提醒】:网学会员在VB开源代码频道为大家收集整理了“怎样在 VB 程序中调用 Fortran 程序? - 编程语言“提供大家参考,希望对大家有所帮助!
怎样在
VB 程序中调用 Fortran 程序 摘要本文介绍了如何通过DLL实现
VB5.0和Fortran PowerStation4.0的接口。
该方法为 编制Windows95下的数值计算事件驱动程序提供了一条方便的途径。
关键词动态链接 函数 子程序 声明 1 引言 众所周知Fortran语言自从50年代问世以来一直是数值计算领域所使用的主要语 言以往大量的科学与工程计算程序都是在DOS下用Fortran语言编写的。
Microsoft公司 推出的Windows95和WindowsNT下的32位的Fortran PowerStation4.0以下简称FPS4.0 是一种功能强大的Fortran集成开发环境。
它几乎完全兼容Fortran90和Fortran77标准 并提供了与当今流行的Windows95的接口。
利用FPS4.0和Windows其他编程工具如Visua lC和VisualBasic等能很容易开发出Windows95下的Windows事件驱动程序。
在Window s的诸多编程工具中VisualBasic以其简单易学、功能强大等优点而广受非
计算机专业 人员欢迎。
经过一段时间的探索笔者成功地把FPS4.0和VisualBasic5.0以下简称
VB 通过DLL技术结合起来编制出Windows95下的Windows事件驱动程序。
这样使得应用程 序既具有Windows环境图形用户界面的友好性又能充分利用Fortran原有的丰富资源 如大量先前开发的DOS下的科学与工程计算程序等。
本文的基本思路是用
VB设计用户界面及控制程序而将计算用Fortran程序通过FPS4 .0编译成DLL并由
VB调用。
它们之间的数据交换通过参数传递来实现。
2 用FPS4.0创建DLL DLL动态链接库是可被其他程序或DLL调用的函数过程集合组成的可执行文 件模块。
Windows本身提供了大量的应用程序接口API函数都是通过DLL机制来实现 的。
DLL之所以在Windows中被广泛应用是因为它除了具有静态链接库的功能外尚有 如多个应用程序共享一个DLL以节省内存和磁盘空间等许多优点。
在FPS4.0中可根据需要将一组Fortran函数或子程序放在一个程序中创建成一个 DLL它本身不能运行只能被
VB调用。
具体实现步骤如下先建立一个New Project Workspace定义其类型为DynamicLin kLibrary然后将一个只含有函数或子程序的Fortran程序加入到Project中编译通过 即可生成DLL。
在Fortran程序中必须被调用的函数或子
程序予以声明以标识这些函 数或子程序在所生成的DLL中是可用的。
具体语法如下 ATTRIBUTES DLLEXPORT ∷Name ATTRIBUTES是FPS4.0中的元命令metacommand用于声明微软扩展属性Micro softtextendedattributes。
DLLEXPORT是上述属性之一它的作用就是声明该函数或 子程序能被其他程序或DLL调用。
Name为函数或子程序名。
该语句应放在程序的变量声明 处。
3
VB调用Fortran DLL
VB在调用DLL前必须先在模块级或相应Form中的GeneralDeclaration中对被调用 的DLL进行声明语法如下 PublicPrivate Declare sub Name lib libname Aliasaliasname arglistPublicPrivate Declare Function Name lib libname Aliasaliasname arglist Declare语句的作用是声明对DLL中外部过程的引用。
至于语句中各组成部分的意义 一般的
VB书籍都有介绍在此不再赘述。
声明之后
VB中使用Call语句实现调用DLL中 的函数或子程序调用语句如下Call NamearglistName的意义同上。
以上仅是
VB中 调用DLL的一般语法下文对声明和调用过程中应注意的两点进行讨论。
3.1 声明语句中对于Alias部分的处理 一般Alias关键字指定函数或子程序的别名这是因为有些DLL中的函数或子程序名 称太长或名称上加有
VB不能识别的不合法符号或有些函数或子程序名与
VB中的关键字 重名那么这时应将DLL库中真实的函数或子程序名写在别处。
但在FPS4.0生成的DLL中每一个声明的函数或子程序均有一个别名都需用Alias 关键字进行声明。
该别名在编译生成的库文件.LIB中可以找到。
经过笔者反复调试 发现它的命名有一定的规律可循即如果函数或子程序名为name1则别名为_name1x 其中x为一整数x等于函数或子程序的参数个数乘以4。
特别要注意若函数或子程序 的参数个数为0那么x也为0。
具体的实现可见下文实例。
3.2 调用过程中的参数传递 要使
VB正确地调用FortranDLL另一个值得注意的
问题是调用过程中的参数传递。
由于FPS4.0和
VB在数据定义类型上的不一致因此在
VB的Declare语句中的参数列表中 必须将Fortran程序的参数类型正确地对应到
VB中。
两种
系统的参数对应关系见表1。
表1 FPS4.0和
VB主要参数传递对照表 FPS4.0 INTEGER INTEGER2 REAL4 REAL8
VB LONG INTEGER SINGLE DOUBLE 另外如果所传递的参数是数组类型则在
VB的Declare语句中应把数组的第一个元 素作为参数放在参数
列表的对应位置。
4
VB调用FPS4.0 DLL实例 为了具体说明上述过程的细节本文列举了一个功能简单的程序如下EXAM.F是一 个含有子程序ARRAYTEST的Fortran程序。
子程序ARRAYTESTarrn的功能是改变两个参 数的值并返回。
程序
代码如下 SUBROUTINE ARRAYTESTnarr ATTRIBUTES DLLEXPORT :: ARRAYTEST