打印本文 打印本文 关闭窗口 关闭窗口
DELPHI和FORTRAN语言的混合编程(二)
作者:武汉SEO闵涛  文章来源:敏韬网  点击数1599  更新时间:2009/4/23 18:34:25  文章录入:mintao  责任编辑:mintao
另一种方式更为简便,因为在Delphi中,字符串被视为动态数组,以Call by Refence方式传递,因此,可先在FORTRAN中使用编译字将字符串的传递方式强制为地址传递方式,即:

Subroutine Sub_Name(x1,x2,Str,x3, x4)

!DEC$ATTRIBUTES DLLEXPORT::SUB_NAME
         !DEC$ATTRIBUTES ALIAS:’Sub_Name’::SUB_NAME

  Real(8),Dimension(:)::x1,x2

  Character(Len=*) Str

  Real(8),Intent(Out)::x3,x4

!DEC$ Attributes Refence::Str

这时,Delphi中相应的接口过程定义为:

Procedure Sub_Name(Const x1,x2:Pointer; Str:String; Var x3, x4:Double);

则按如下方式调用:

 Sub_Name(@a1[0],@a2[0],Str, a3,a4);

第二种混合编程方式的实现过程是:首先在FORTRAN子程序按上述方法定义好,并编译成动态链接库ForSub.Dll;然后在Delphi中按如下方法定义动态链接库子过程接口。在接口区(Interface)中定义过程首部:

Procedure Sub_Name(Const x1,x2 : Pointer;

 Str : String;

Var x3, x4 : Double); Stdcall;

在实现区(Implementation)中加上以下语句:

Procedure Sub_Name; external '''' ForSub.dll'''' name '''' Sub_Name '''';

这样,在Delphi程序设计中就可以像调用自己的子程序一样调用Sub_Name了。

由于FOR90引入了模块(Module)单元,可以将一些相关的数据和方法封装在模块里,因此,对一个模块中不同的子程序进行上述的定义,则在一个动态链接库中获得多个可被外部程序调用的子程序。在Delphi中要调用这些子程序,对每一个都需要编写Delphi中的子过程接口。

 


* 在FOR90中借鉴了这种区分输入输出参数的定义方式,引入了关键字Intent,在参数定义中,Intent(in)表示该参数在传递过程中是不改变的,Intent(Out)表示是可以改变的,并且FOR90中规定得更为严格。

上一页  [1] [2] 

打印本文 打印本文 关闭窗口 关闭窗口