VC与Fortran混合编程及其在大地电磁测深中的应用.pdf
第22卷第1期2000年2月物探化探计算技术Vol122 No.1Feb.2000COM PU T I NGTECHN I QU ESFORGEOPHYSICALANDGEOCHEM ICALEXPLORAT I ON收稿日期:1999-10-13文章编号:10011749(2000)01008204VC与Fortran混合编程及其在大地电磁测深中的应用肖晓玲1,卢正鼎1,张翔2(11 华中理工大学 计算机科学与技术学院,湖北 武汉430074;21 江汉石油学院 地球物理勘探系,湖北 荆州434102)摘要:Fortran语言是目前流行较广的适用于科学计算的高级语言,VC(V isual C)更擅长图形系统的开发。因此,在开发交互式解释系统软件时,常常将VC与Fortran进行混合语言编程。目前,大地电磁测深的资料处理与正、反演软件都是用Fortran语言编写的,为了避免资源的浪费,提高大地电磁测深的资料处理与解释系统的开发效率,在开发大地电磁测深一维交互式解释系统时,对大地电磁测深中的计算部分仍用现有的Fortran程序,对有关的界面与图形系统的开发部分用VC语言来编写。关键词:Fortran;VC+;混合语言;编程;大地电磁测深中图分类号:TP31111;P63113+25文献标识码:AM IXED-LANGUAGE PROGRAMM INGOF VC AND FORTRAN AND ITSAPPL ICATI ON INMAGNETOTELLURIC SOUND INGX I AO Xiao2ling1,LU Zheng2ding1,ZHAN G Xiang2(11H uazhong U niversity of S cience&T echnology,W uhan,H ubei430074,China;21J ianghan Petroleum Institute,J ingzhou,H ubei434102,China)Abstract:Fortran is a w ide2used high2level language for scientific computation and VC ismore adaptivefor development of graphics,so Fortran and VC m ixed programm ing are needed when developing the in2teractive interpretive program s.A t present,both the M T forward and M T inversion program s are de2veloped in Fortran language.To avoid wasting resource and improve developing efficiency ofM T soft2ware,the computation parts come from existing fortran codes and the interface and graphics parts arecoded in VC language.In such a way the 1D interactive interpretive system ofM T has successfully beendeveloped.Key words:fortran;VC;m ixed programm ing;magnetotelluric soundingFortran语言是目前流行较广的适用于科学计算的高级语言,具有标准化程序高,便于程序交换,较易优化,拥有高精度的数据结构与运算结构。但Fortran是一种面向过程的语言,它在实现人机对话、交互处理方面是很不理想的,虽然Fortran 90也提供了面向对象的思想和实现方法,但它界面不够美观,图形处理功能欠缺,在实现人机对话、交互处理远不如其它面向对象语言方便。V isual C+更擅长图形系统的开发,与硬件底层打交道便显示出它的强大优势。目前,V isual C+成为W indow s系统平台上最强大的应用程序开发系统。因此,在开发交互式解释系统时常常将VC与Fortran语言进行混合编程。现有的大地电磁测深中的大部分处理程序都是用Fortran语言编写的,其运行于DOS平台。本文拟在将VC与Fortran语言进行混合编程,并使其在大地电磁测深一维解释系统中进行了实现。通过利用大地电磁测深一维解释正演中现有的Fortran代码,结合VC+强大的界面功能,开发了大地电磁测深一维交互式解释系统的正演部分。1VC与Fortran混合语言编程1、2、3混合语言编程是采用两种或两种以上的编程语言组合编程,彼此相互调用,进行参数传递,共享数据结构及数据信息,从而形成一种程序实体的过程。对于M icrosoft公司开发的语言开发环境而言,在Fortran与VC之间进行混合语言编程是完全可以实现的,但必须全面考虑混合语言之间调用约定、变量传递及命名规范等接口问题。即在混合语言编程中调整调用约定,调用约定确定程序如何调用过程、参数,如何传递以及命名规范。一般来说,调用约定从五个方面影响编程:(1)调用程序使用调用约定将参数传递到被调过程的顺序,被调程序通过调用约定确定从调用程序接受参数的顺序。32位VC和Fortran都是按从左到右的顺序传递参数。(2)调用程序和被调用程序用调用约定来确定谁在被调用程序执行结束后调整堆栈,可以通过C和STDCALL的属性来指定这些约定。(3)调用程序和被调用程序用调用约定来确定是否采用可变数量的参数进行调用,可以通过C和STDCALL属性来指这些约定。(4)调用程序和被调用程序用调用约定来确定采用值方式(传递参数值)还是采用引用方式(传递地址)来传递参数,可以通过VALU E或REFERENCE来设置这些约定。(5)调用程序和被调用程序调用约定为过程名建立命名约定。利用AL I A S属性,无论FORTRAN程序中被调用的过程名是什么,都可以在动态连接库中建立任何可被外界程序调用的过程名。可以通过C和STDCALL属性来指定命名约定。111Fortran与VC之间调用约定在VC与Fortran语言混合编程时,两者之间的函数调用一般采用C与STDCALL调用约定。在C的调用约定中,调用程序经常在被调用程序返回控制之后立即调整堆栈。在STDCALL调用约定中,被调用程序控制着堆栈。然而,C调用约定能够对具有可变数目变量的函数(或例程)进行调用,将第一个变量总是最后一个压入堆栈的,总是位于堆栈顶部,不管传递多少变量,总是与栈指针具有同样的地址。因此,当调用程序控制堆栈时,它知道有多少变量被传递,占多大空间以及被放在堆栈的位置。112Fortran与VC之间命名约定由于C语言的符号名需区分大小写,Fortran语言中不存在大小写问题,VC中还存在类型说明及其它的一些问题,如果命名约定在调用程序与被调用程序之间不一致时,程序就不会成功地连接。Fortran的缺省方式使符号名在OBJ文件中变成大写,如果在VC程序中调用一个使用Fortran缺省的Fortran子例程,在VC中需用一个纯大写的名称来生成一个调用。当在VC中用一个纯小写的名称来生成一个调用时,在Fortran程序中需用C和STDCALL属性将所有名称转换为纯小写的形式。在VC中,当一个调用例程的名称以混合书写形式出现的时候,需使用Fortran的AL I A S属性来解决混合书写形式之间的命名冲突。另外,由于VC语言中存在类型说明,当在VC程序中调用其他语言编写的函数时,用外部“C”语法使该函数在VC中的调用不考虑类型说明。例如,extern“C”int-stdcall FACT(int n);在VC中调用Fortran函数FACT。113VC与Fortran语言之间数据传递M icrosoft属性(如C,STDCALL,REFERENCE,VALU E等)影响过程的数据传递。缺省情况是,Fortran用引用方式传递参数(除字符串的隐含长度参数外)。如果使用了C或STDCALL属性,则使用值方式传递参数(除数组外)。可以通过对参数指定REFERENCE或VALU E属性来具体声明传递变量的381期肖晓玲等:VC与Fortran混合编程及其在大地电磁测深中的应用方式,对于参数的声明优先与对于过程的声明。数组只能通过引用方式传递。表1C属性和STDCALL属性Tab.1C attribution and STDCALL attribution约定的特点CSTDCALL缺省名字前面加下划线是否是名字后面加参数字节数否是是名字大写否否是参数从左到右传递是是是调用方清除堆栈是否否参数数量可变是否否字符串长度传递否否是参数以值方式传递是是否C,STDCALL属性对于调用约定与命名约定来说都是非常重要的,表1概括了它们的区别4。2使用动态连接库(DLL)在混合语言编程中,有两种具体的实现形式,其一,将Fortran程序用Fortran编译器进行编译,产生目标文件(obj文件),将其目标文件直接与VC的目标文件连接起来产生VC的执行程序;其二,将Fortran程序用Fortran编译器进行编译,构成动态连接库(DLL)的方式。在需要调用Fortran代码时,由VC对其动态调用。本文采用第二种混合连接方式进行混合编程。DLL(Dynam ic2L ink L ibrary)是W indow s操作系统最显著特点之一,也是W indow s系统具有良好的程序设计平台的基础。一个DLL就是一个函数库,一个DLL包括一个或多个函数,这些函数是独立于主工程进行编译、连接和存储的。与静态库相比,DLL也是源代码和目标代码的集合,但它是可执行的。应用程序调用DLL中的某个函数时,W indow s就从DLL中读出并运行之。应用DLL的优点在于:(1)多个应用程序可访问同一个DLL,不必在应用程序中复制DLL例程,例程和函数可放在DLL中,共享它的应用程序就可以只有较少的源代码。应用程序运行时,没有调用的函数或过程不会装入内存,多个应用程序调用同一个DLL,在内存中装入一次就行。这样就可以节约系统内存,优化系统的性能。(2)只要不改变函数的自变量和函数返回类型,可以改变DLL中的函数和例程而不必重新对调用它的应用程序编译和连接,升级DLL比较方便。(3)不同语言编写的应用程序可以调用同一个DLL,只要应用程序的调用出口与这个DLL中的入口一致,即遵循调用约定,DLL之间也可以进行调用。3编程应例目前,大地电磁测深的资料处理与正、反演软件都是用Fortran语言编写的。为了避免资源的浪费,提高大地电磁测深的资料处理与解释系统的开发效率,同时,大地电磁测深的资料处理与解释系统中科学计算部分的代码用VC来编写也难以实现。因此,在开发大地电磁测深一维交互式解释系统时,采用VC与Fortran混合语言编程的方式来实现。对有关的界面与图形系统的开发部分用VC语言来编写。本文主要讨论VC与Fortran混合编程在大地电磁测深一维交互式解释系统中正演的应用,即对大地电磁测深一维正演计算部分5用Fortran语言来编写,在VC中对Fortran中的子例程进行调用实现。下面主要介绍其实现过程。311生成动态连接库将Fortran一维正演程序改为子例程子程序m tforward(),创建动态连接库项目,用Fortran编译器进行编译,分别将其形成动态连接库(DLL)与静态连接库(L I B)的形式。312定义VC与Fortran接口为了在VC中能调用一维正演的Fortran子例程程序m tforward(),在VC文档类的3.CPP文件中定义VC与Fortran语言的接口,采用STDCALL调用约定,使用纯大写的名称来生成一个调用,引用方式传递参数。extern Cvoid-stdcallM TFORWARD(float3,float3,int3,float3,float3,float3,int3);313VC对Fortran子程序的调用VC的文档类的ProcessForward()函数对fortran语言编写的一维正演的子例程程序m tforward()进行了调用,处理结果如图1所示。图1为大地电磁测深一维交互式解释系统主界面,上面的两个界面从左48物探化探计算技术22卷至右分别为M T模型剖面与单点M T深度-电阻率模型图;下面的左界面为M T实测与正演视电阻率曲线图;右界面为单点M T深度-电阻率模型数据表;M T实测与正演视电阻率曲线图中虚线为实测视电阻率曲线;实线为VC调用Fortran子例程程序m tforward()正演计算的视电阻率曲线。void CM ToneDocProcessForward()M TFORWARD(m-selectsite2 rho,m-selectsite2 thick,&m-selectsite2 nlayer,m-selectsite2 Period,m-selectsite2 FRxy,m-selectsite2 FPhxy,&m-selectsite2 fnum);m-ShowForwardData=TRU E;UpdateA llV iew s(NULL);图1大地电磁测深一维交互式解释系统界面Fig.112D interactive interface ofM agnetotelluric sounding interpretion system参考文献:1刘乃琦 1I BM PC混合语言编程技术M 1 北京:电子工业出版社,199012于歆杰,王赞基 1 更好地利用FORTRAN源代码J 1 电脑编程技巧与维护,1999,(4):2213王家映 1 石油电法勘探M 1 北京:石油工业出版社,19921作者简介:肖晓玲(1973),女,1994年毕业于江汉石油学院测井专业,在读研究生,现从事计算机应用教学与软件开发。581期肖晓玲等:VC与Fortran混合编程及其在大地电磁测深中的应用