摘 要:在windows平台下使用fortran计算源程序有多种方法,而利用vb与microsoftfortran powerstation 4.0混合编程是一种简单有效的方法。利用混合语言编程,既可免去重复性的工作,又可充分利用32位windows操作系统的多种优点,提高应用程序的利用率。
关键词:fortran计算程序代码;混合编程;动态链接库
1 引 言
在水利工程中存在着许多已经历时间的考验,成熟、稳定的fortran计算程序,至今在工程计算中仍发挥着重要作用。过去的fortran计算程序大都利用dos操作系统,采用数据文件方式提供数据,这种方式易产生数据错位和数据本身的错误,不利于检查与修改。这种操作方式相对于计算机技术的发展已很落后,无法利用32位windows操作系统的多种优点。
为了提高程序的使用效率,提高代码的重用率,有必要对原fortran77程序进行改进,microsoft fortran powerstation 4.0改变了传统的科学计算程序漆黑单调的dos界面,代之以具有友好美观的windows风格的用户界面,mi-crosoft fortran powerstation 4.0支持for-tran 77版本,这使得原有fortran 77应用程序可在microsoft fortrn powerstation 4.0下直接调用,免去了许多重复性的工作。microsoftfortran powerstation 4.0是一种功能强大的32位的fortran集成开发环境,因为都使用了相同的平台,可实现它与vc、vb、delphi等语言的混合编程。在面向对象程序设计语言中,vb具有简单易学、功能强大的特点,被广泛应用与win-dows环境下系统的可视化界面设计。
2 混合编程的方法
使用microsoft fortran powerstation 4.0与vb混合语言编程,就是利用vb实现友好的用户接口,用fortran编写的过程进行所有的计算工作,在程序中,必须以vb为主程序来调用fortran程序。实现混合编程的关键就是将fortran计算程序编译为动态链接库,而后在vb中调用此动态链接库,有关动态链接库的定义和使用动态链接库的好处可参见[1].在后面的例子中将给出生成和使用动态链接库的具体步骤。
2.1 建立动态链接库
要将fortran编写的计算程序导入动态链接库,必须在fortran子程序中声明该子程序为外部子程序,其语法为:
!ms$attributesdllexport::子程序或函数过程名
!ms$attributesalias:'过程别名'::子程序或函数过程名
输入参数类型.intent(in)::输入参数表输出参数类型.intent(out)::输出参数表
2.2 vb调用动态链接库的方法
要调用fortran动态链接库子程序或函数,需在全局模块或窗体中声明,语法形式为:[pub-lic\private]declare sub<动态链接库子程序过程名>lib"动态链接库名"
其中,动态链接库名需要指明fortran动态链接库的全路径名.
3 混合编程中应注意的问题
使用动态链接库需要注意的问题有:命名约定、参数传递约定。
3.1 命名约定
fortran中命名不区分大小写,但在缺省情况,fortran子程序在编译为动态链接库中,其名称的别名自动取为“_子程序名@n”,其中n=参数个数x4,在vb中,路径名用大写或第一个字母用大写。
在vb调用动态链接库语法形式中,alias项是可选项,可不出现,可利用fortran的别名(alias)属性,改变缺省设置,直接以alias属性后的名称为动态链接库子程序过程名。
3.2 参数传递约定
用混合语言编程存在数据类型匹配问题,两种语言之间的数据类型并非一一对应现将for-tran和vb中常用的数据类型对应关系如表1。
在fortran和vb中应指明参数的传递方式,使用缺省方式为引用方式(byref),若对某些参数的传递方式需特别指明(注意数组只能用引用传递方式),可用fortran中的参数传递属性,如value属性,例如:
上例中,除r1是按值传递,其余参数按引用传递。vb调用此例程时,也应注明参数的传递方式,一一对应。
private declare sub sub1 lib"d:\zzq\ebug\zq.dll"(byval r1 as single,r2 as single,add as single,arr as single)
4 举 例
下面举一个实际例子详细说明动态链接库的建立和使用。
4.1 建立新的工程文件
依次选择fortran powerstation 4.0→file→new→project workspace,在new projectworkspace菜单中选择dynanic-link library,name项填入fdll,location项填入路径,选择cre