另一种方式更为简便,因为在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中的子过程接口。
上一页 [1] [2] [Delphi程序]Delphi 与 FORTRAN语言的混合编程
|