vb和surfer和fortran混合编程.docx

上传人:b****6 文档编号:6887722 上传时间:2023-01-12 格式:DOCX 页数:17 大小:517.72KB
下载 相关 举报
vb和surfer和fortran混合编程.docx_第1页
第1页 / 共17页
vb和surfer和fortran混合编程.docx_第2页
第2页 / 共17页
vb和surfer和fortran混合编程.docx_第3页
第3页 / 共17页
vb和surfer和fortran混合编程.docx_第4页
第4页 / 共17页
vb和surfer和fortran混合编程.docx_第5页
第5页 / 共17页
点击查看更多>>
下载资源
资源描述

vb和surfer和fortran混合编程.docx

《vb和surfer和fortran混合编程.docx》由会员分享,可在线阅读,更多相关《vb和surfer和fortran混合编程.docx(17页珍藏版)》请在冰豆网上搜索。

vb和surfer和fortran混合编程.docx

vb和surfer和fortran混合编程

长安大学毕业论文

 

Vb6.0调用Fortran程序并用surfer7.0实现数据可视化

姓名:

韩埃洋

专业:

地球物理学

年级:

学士

二零一一年六月

摘要

Fortran是世界上出现最早的高级程序设计语言,最适用于数值计算,所以在数值计算领域大量的程序都是用Fortran所写。

但是大部分的Fortran程序都是在dos下运行的,使用很不方便,如果把早期的Fortran程序转换成其他语言,则工作量是巨大的。

Visualbasic是一门简单易学的面向对象的高级程序设计语言,在界面设计方面功能强大,深受非计算机专业人士的喜爱。

利用vb编写界面调用Fortran程序可以很好的利用Fortran和vb的优点,克服各自的不足。

本文将通过实例详细说明:

Fortran语言如何编译成动态链接库(DLL)文件,怎么用VisualBasic语言调用Fortran写的Dll文件,VisualBasic语言调用Fortran写的动态链接库文件时参数传递时须注意的问题。

Surfer是美国GoldenSoftware公司研制开发的、基于Windows系列操作系统的地质地理数据绘图软件,具有强大的二维绘图和数据处理能力,并有一定的三维显示功能,是专门针对绘图的软件。

从Surfer7开始,软件增加了Automation技术,支持VB编程语言的二次开发。

目前,最新的版本是2002年2月发布的Surfer8.0。

在地学领域中,有大量的数据需要使用Surfer进行绘制成图,但如果全部工作都由手工来完成,工作量就会大大地增加。

本文采用面向对象技术,与Surfer接口,快速实现图形、图像绘制。

本文详细地介绍了如何在VB6.0应用程序中,利用Surfer嵌入式编程实现数据的快速可视化,并给出应用实例。

关键词

动态链接库VisualBasicFortransurfer7.0混合编程

目录

摘要1

关键词1

第一章绪论1

1.1问题的提出及研究的意义1

1.2国内外研究现状1

1.2.1调用Fortran编译的可执行文件2

1.2.2调Fortran动态链接库2

1.2.3俩种方法的比较2

1.3本课题研究的内容3

1.3.1Fortran动态链接库的建立3

1.3.2VB6.0调用Fortran创建的Dll3

1.3.3Fortran与vb之间参数传递4

1.3.4surfer7.0锲入vb6.0实现数据可视化5

第二章实例软件的介绍6

2.1实例软件主要功能6

2.2较难实现地方(撤销重复的实现)7

2.2.1公共变量声明7

2.2.2初始化变量8

2.2.3打开文件修改时的代码8

2.2.4用户点击撤销按钮时的代码9

2.2.5用户点击恢复按钮时的代码9

第三章软件功能一(曲线圆滑)10

3.1设计思路10

3.2打开菜单10

3.2.1数据的格式12

3.3参数选择窗口13

3.4圆滑菜单13

3.5较难实现的地方一(vb调用*.exe文件)15

3.6较难实现的地方二(surfer7.0锲入vb6.0实现数据可视化)15

3.6.1vb6.0中对surfer的声明15

3.6.2ContourMap的绘制16

3.6.3实例软件中调用surfer绘图的完整代码16

参考文献19

致谢20

第一章绪论

1.1问题的提出及研究的意义

Fortran是世界上出现最早的高级程序设计语言,Fortran语言以其清楚的结构层次、强大的数值分析能力,而广泛应用于数学与工程计算。

但是Fortran进行可视化编程的难度较大。

VisualBasic语言(简称VB)以其迅速有效的编制交互界面设计性能,被越来越多的应用于Windows的环境下的可是化界面设计。

VB具有简单易学的特点,它所提供的对象链接和嵌入(OLE,ObjectLinkingandEmbeding)工具,为利用其它软件进行数据的可视化处理提供了方便。

VB的缺点是运算速度慢,不合适进行大型数值计算。

用VB与Fortran混合编程可以充分的利用俩种语言的优点,克服他们的不足。

本论文将通过实例说明VB与Fortran的混合编程的方法:

用VB设计运行界面及控制程序,将Fortran程序编译成动态链接库(DLL文件)并由VB程序调用之。

整个过程Fortran程序都在后台运行,计算结束后结果显示在VB界面上。

surfer7.0软件是美国Golden软件公司编制的专业绘图软件,它是一款十分流行的功能强大的实用软件,可以方便地绘出各种等值线图。

在瞬变电磁曲线圆滑系统中,可以利用VB6.0打开测量的值,然后再打开surfer7.0程序绘制等值线图,也可以用VB6.0语言自主开发程序绘制等值线图。

但工作量又比较大。

所以,考虑采用在VB6.0中调用surfer7.0软件来实现绘制等值线图,使绘图工作在VB6.0后台用Surfer8.0进行,然后再把绘图结果在VB6.0界面中显示。

这样可以大大减少编程工作量,提高工作效率和作图精度。

1.2国内外研究现状

目前实现VB与Fortran的混合编程主要方法有两种,即VB直接调用可执行文件(利用shell函数直接调用Fortran编译出来的可执行文件)和利用动态链接库Dll(DynamicLinkLibrary)与Fortran混合编程。

1.2.1调用Fortran编译的可执行文件

采用VB直接调用RSTDT:

H可执行文件的方法,就是利用Vb编写程序的界面部分,然后将Fortran的应用程序编译成可执行的应用程序,在需要计算时,由Vb应用程序启动这个应用程序,并在计算结束后,将所需的结果显示在Vb的界面上。

Fortran与Vb之间的所有数据交换都是通过磁盘文件进行。

具体步骤是先在CompaqvisualFortran中编写Fortran的源程序代码,并编译成可执行文件。

然后在Vb需要调用时,利用shell函数调用就可以了shell函数语法如下:

Shell(pathname,[windowStyle])

pathname是可执行文件的程序名,以及必需的目录、文件夹、驱动器。

windowStyle表示在程序运行时,Fortran窗口的样式。

例如,在vb中调用Fortran生成的保存在D盘work目录下的计算程序test.exe则语法如下:

callshell(“D:

\worlk\test.exe”,vbNormalfocus)

这种方法适合于计算量较大而交互操作不多的时候。

但是Shell函数是以异步方式执行的,这种执行方式使Vb程序不能等待Fortran程序计算结束,而是继续执行后续的程序。

从而容易使最终结果出错。

1.2.2调Fortran动态链接库

这种方法的思路,将Fortran的源代码分成若干个计算子程序或函数.并编译生成Dll文件。

用Vb编写主程序。

并在需要时调用编译好的Dll文件。

从而实现Fortran和Vb的混合编程。

具体步骤将在本章1.3节中详细介绍。

1.2.3俩种方法的比较

Vb直接调用Fortran编译生成的可执行文件(*.exe文件)文件和使用动态链接库这两种方法都可以实现Vb和Fortran的混合编程。

但是它们还是有一定区别的。

具体比较如表1.2.1所示:

表1.2.1俩种方法比较

方法

使用Shell函数

使用动态链接库

内核

Vb和VF都为相互独立的主程序

VB为主程序VF只能以子程序或函数形式存在

参数传递

优点

方法简单,容易实现

功能强大,更为实用

缺点

异步执行,易出错,运行速度慢

后处理过程复杂

1.3本课题研究的内容

本课题研究的内容以下几点:

Fortran动态链接库的建立,VB6.0调用Fortran创建的Dll,Fortran与vb之间参数传递,surfer7.0锲入vb6.0实现数据可视化。

1.3.1Fortran动态链接库的建立

动态链接库文件可以为程序设计提供良好的平台。

一个DLL就是一个函数库。

它可包含一个或多个函数,这些函数是独立于主程序进行编译、连接和存储的。

创建用于VB应用程序的Fortran动态链接库的方法与步骤如下:

(1)在CompaqVisualFortran6.0环境下新建FortranDynamic2linkLibrary类型的项目;

(2)编写Fortran源程序并添加到该项目中,建立动态链接库的Fortran源程序必须是子程序或函数,不能有主程序。

(3)编译、建造该源程序或函数,生成动态链接库文件。

在编写Fortran源程序时要声明输出的子程序或函数过程名、子程序或函数的过程别名、接口参数名称与类型,以供VB使用。

声明语句形式如下:

!

DEC$ATTRIBUTESDLLEXPORT:

子程序或函数过程名

!

DEC$ATTRIBUTESALIAS:

’过程别名’:

子程序或函数过程别名

1.3.2VB6.0调用Fortran创建的Dll

由于Fortran动态链接库中的子程序或函数过程相对于VB过程而言是外部过程,因而在调用之前必须向VB声明该过程的一些信息,以便编译器能够找到该过程,并且需要在全局模块或表格级模块中声明正确的调用接口,下面是声明格式:

DeclareSub<动态链接库子过程名>Lib”动态链接库文件名及所在路径”

其中:

动态链接库子程序或函数过程名是被调用动态链接库中的子程序或函数的名字;动态链接库名为动态链接库子程序或函数过程所在动态链接库名,需要指明Fortran动态链接库文件所在的全路径名;过程别名用来给动态链接库子程序或函数过程换一个新名字,也可保持原名。

Fortran动态链接库子程序或函数过程的调用在全局模块或表格级模块中声明Fortran动态链接库中子程序或函数过程以后,VB应用程序就可以像调用VB本身函数或例程一样随意调用库中任意子程序或函数过程了。

VB和Fortran之间参数以文本形式传递,VB的输出参数保存在文本文件中,Fortran运行时读取文本文件,即VB与Fortran共用一个文本来实现参数的传递,只要在读取和保存的过程中注意保存与读取的格式,即可实现参数的传递。

1.3.3Fortran与vb之间参数传递

Fortran和VisualBasic间数据类型的对应关系如表1.1:

表1.3.1Fortran与visualBasic对应数据类型

Fortran

Integer*2

Integer*4

Real*4

Real*8

Character(n)

VB

Integer

Long

Single

Double

String*n

特别值得注意的是:

尽管VB尽管VB和CVF都利用堆栈传递参数,但缺省约定下,CVF先将字符串首地址压入堆栈,然后再将字符串长度值压入堆栈。

这样一来,CVF传递一个字符串参数,VB需要二个参数与之对应:

第一个参数为字符串,第二个参数为字符串长度(长整型),两者均以传值方式传递。

如下例子:

CVF实现的Fortran子程序接口为:

SubroutineReturnString(Str_in,Str_out)

!

DEC$ATTRIBUTESDLLEXPORT,ALIAS:

'ReturnString':

:

ReturnString

character*(*):

:

Str_in,Str_out

EndSubroutine

此处,只添加了必要的导出例程属性,添加别名属性是为了方便VB声明DLL例程目标名。

值得注意的是,这里的字符串虚参只能声明为假定长度字符串,调用时假定长度取相应实参字符串的长度。

VB中一致的Dll例程原型为:

DeclareSubReturnStringLib"PSingleStr.dll"(ByValInStringAsString,_ByValInStrLenAsLong,ByValOutStringAsString,ByValOutStrlenAsLong)

调用时,字符串实参须为定长字符串,长整型实参取对应实参字符串的长度。

实例运行结果表明,上述对字符串表达、存储及参数传递规律的认识是正确的。

1.3.4surfer7.0锲入vb6.0实现数据可视化

VB调用Surfer对象的方法:

首先要创建Surfer的应用(Application)对象,通过CreateObject或GetObject函数来实现,它创建并返回一个对ActiveX对象的引用。

如:

DimSurferAppasObject//声明一个对象(Object类型)变量

SetSurferApp=CreateObject(“surfer.Application”)//用CreateObject函数创建对象

SetSurferApp=GetObject(“surfer.Application”)//用GetObjec函数创建对象

然后使用这些对象包含的各种属性和方法,来实现对Surfer的调用。

Application对象提供了两个重要集合Documents和Window,通过它们来访问次一级的对象。

如:

SetDoc=SurferApp.Documents//变量获取DocumentsCollection

通过此对象提供的“Add”方法可以访问更深一层次的对象。

如:

Setplot=Doc.Add(SrfDocPlot)//变量获取DocumentsCollection

用这种方式就可以调用Surfer里面的每个对象,调用其方法和设置其属性

第二章实例软件的介绍

2.1实例软件主要功能

实例软件共有地形校正、曲线圆滑和全区视电阻率定义三个功能。

软件主窗口如图2.1。

图2.1.1实例软件主界面

地形校正

全区视电阻率定义

图2.1.2实例软件整体布局

主菜单有文件、编辑、参数设置和帮助。

文件的下拉菜单有:

打开、保存、另存为、保存圆滑前后图片和退出。

编辑的下拉菜单有:

撤销、重复、复制、剪贴、粘贴和全选。

其中较难实现的是撤销和重复。

2.2较难实现地方(撤销重复的实现)

每次用户在富文本框中进行修改时都会触发change事件,这时我们可以通过记录修改前的富文本框内容来为用户提供撤销功能。

而恢复操作是在用户进行撤消操作后才可以进行的,并且随用户再次修改而变为不可用的。

这个方法就是采用两个堆栈分别记录可撤销的富文本框的内容和可恢复的富文本框的内容。

用户更改富文本框内容时,将修改前的内容压入到撤销堆栈中。

用户执行撤消操作时,弹出撤销堆栈栈顶内容显示在富文本框中,并压入恢复堆栈中。

2.2.1公共变量声明

在窗体中声明几个公共变量

DimrtbUnDoStack()AsString’撤销堆栈

DimrtbReDoStack()AsString‘恢复堆栈

DimbChgAsBoolean‘记录富文本框的内容是否发生变化

2.2.2初始化变量

PrivateSubForm_Load()

ReDimPreservertbUnDoStack

(1)AsString’改变数组元素个数

ReDimPreservertbReDoStack

(1)AsString

rtbUnDoStack

(1)=rtbText.TextRTF‘初始化撤销堆栈元素

rtbReDoStack

(1)=rtbText.TextRTF‘初始化恢复堆栈元素

bChg=False

EndSub

2.2.3打开文件修改时的代码

PrivateSubRtftext_Change()

IfbChg=FalseThen'判断富文本框内容是否首次被修改

ReDimPreservertbUnDoStack(UBound(rtbUnDoStack)+1)AsString

'重新分配数组元素个数

rtbUnDoStack(UBound(rtbUnDoStack))=Rtftext.TextRTF

'记录当前富文本框内容至撤销堆栈

ReDimPreservertbReDoStack

(1)AsString'清楚恢复堆栈的内容

Else

bChg=False

EndIf

'判断并设置撤销恢复按钮是否可用

IfUBound(rtbUnDoStack)>1Then

mnuEditUndo.Enabled=True

Else

mnuEditUndo.Enabled=False

EndIf

ifUBound(rtbReDoStack)>1Then

mnuEditRepeat.Enabled=True

Else

mnuEditRepeat.Enabled=False

EndIf

EndSub

2.2.4用户点击撤销按钮时的代码

PrivateSubmnuEditUndo_Click()

IfUBound(rtbUnDoStack)>1Then

bChg=True

ReDimPreservertbReDoStack(UBound(rtbReDoStack)+1)AsString

'重新分配数组元素个数

rtbReDoStack(UBound(rtbReDoStack))=Rtftext.TextRTF

'存储当前富文本框内容至恢复堆栈

Rtftext.TextRTF=rtbUnDoStack(UBound(rtbUnDoStack)-1)

'显示撤销堆栈栈顶内容

ReDimPreservertbUnDoStack(UBound(rtbUnDoStack)-1)AsString

'删除撤销堆栈栈顶内容

EndIf

EndSub

2.2.5用户点击恢复按钮时的代码

PrivateSubmnuEditRepeat_Click()

IfUBound(rtbReDoStack)>1Then

bChg=True

ReDimPreservertbUnDoStack(UBound(rtbUnDoStack)+1)AsString

'重新分配数组元素个数

rtbUnDoStack(UBound(rtbUnDoStack))=Rtftext.TextRTF

'存储当前富文本框内容至撤销栈顶

Rtftext.TextRTF=rtbReDoStack(UBound(rtbReDoStack)-1)

'显示恢复堆栈栈顶内容

ReDimPreservertbReDoStack(UBound(rtbReDoStack)-1)AsString

'删除恢复堆栈栈顶内容

EndIf

EndSub

第三章软件功能一(曲线圆滑)

3.1设计思路

曲线圆滑的后台应用程序是由matlab写的mutipolar.exe程序。

点击文件菜单下的打开按钮打开要处理的文件,然后单击参数选择菜单下的观测参数填写好观测参数,最后单击计算菜单下的圆滑就可以实现数据的圆滑,并由图片的形式显示结果出来。

3.2打开菜单

单击文件菜单下的打开按钮就可以打开要处理的文件并由图片和数据俩种方式显示出打开的文件,如图3.2.1和图3.2.2

图3.2.1打开文件的图片显示窗口

3.2.2打开文件的数据显示窗口

3.2.1数据的格式

单击打开菜单打开的数据的格式必须符合图3.2.2中数据的格式,否则会打开失败。

第一列为测点号,第二列为测线号,第三列为频率,第四列为时间,第五列为感应值,第六列为电阻率。

3.3参数选择窗口

单击参数设置菜单下的观测参数,就可对观测的道数、点数、发射线框边长、有效接收面积等进行设置。

也可以不对他们进行设置,不设置则处理时采用的是他们的默认值。

他们的默认值分别为40、65、600、100。

如图3.3.1

图3.3.1观测参数的设置

3.4圆滑菜单

单击计算菜单下的圆滑就可以对所打开的数据进行圆滑,并把圆滑结果以数据和图片俩种形式显示出来,如图3.4.1和图3.4.2

图3.4.1圆滑结果以图片的形式显示出来

图3.4.2圆滑结果以数据形式显示出来

 

3.5较难实现的地方一(vb调用*.exe文件)

Vb调用*.exe文件是由windows库函数:

ShellExecute实现的。

在vb中使用shellexecute函数的前提是在使用之前声明了该函数,该声明可以在标准模块级声明也可以在使用shellexecute的自过程中声明,声明的语句如下:

PublicDeclareFunctionShellExecuteLib"shell32.dll"Alias"ShellExecuteA"_

(ByValhWndAsLong,ByVallpOperationAsString,ByVallpFileAsString,_

ByVallpParametersAsString,ByVallpDirectoryAsString,ByValnShowCmdAsLong)AsLong

ShellExecute函数原型及参数含义如下:

  ShellExecute(

  hWnd:

HWND;{指定父窗口句柄}

  Operation:

PChar;{指定动作,譬如:

open、print}

  FileName:

PChar;{指定要打开的文件或程序}

  Parameters:

PChar;{给要打开的程序指定参数;如果打开的是文件这里

该是nil}

  Directory:

PChar;{缺省目录}

  ShowCmd:

Integer{打开选项}

  ):

HINST;{执行成功会返回应用程序句柄;如果这个值<=32,表示执行错误}

3.6较难实现的地方二(surfer7.0锲入vb6.0实现数据可视化)

3.6.1vb6.0中对surfer的声明

在vb6.0中使用surfer7.0首先必须引用Surfer的Application对象,才能在客户程序中与Surfer服务器通讯。

Application对象是Surfer对象模型树中的根对象,代表着Surfer本身。

输入引用Application对象的代码,就完成了对Surfer的Application对象的引用,其它层次的对象就可以通过这个根对象来间接逐层引用,从而实现了与Surfer服务器的通讯。

关键代码:

DimSurfAppAsObject声明对象变量

SetSurfApp:

CreateObject(Surfer.Application)

//创建Surfer应用程序实例

SurfApp.Visible=False

SetPlot:

SurfApp.Documents.Open(App.Path+“\Basemap.Srf”)

//打开Surfer工程文件

3.6.2ContourMap的绘制

通过GridData插值

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 公务员考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1