转至繁体中文版     | 网站首页 | 图文教程 | 资源下载 | 站长博客 | 图片素材 | 武汉seo | 武汉网站优化 | 
最新公告:     敏韬网|教学资源学习资料永久免费分享站!  [mintao  2008年9月2日]        
您现在的位置: 学习笔记 >> 图文教程 >> 软件开发 >> Delphi程序 >> 正文
DELPHI和FORTRAN语言的混合编程(二)         ★★★★

DELPHI和FORTRAN语言的混合编程(二)

作者:闵涛 文章来源:闵涛的学习笔记 点击数:1161 更新时间:2009/4/23 18:34:25

2.调用动态链接库(DLL)方式

第二种方法比第一种方法实现起来麻烦一些。在这种方法中,FORTRAN程序首先被编译成Windows标准的动态链接库文件(DLL, Dynamic-Link Library),然后在Delphi中调用。在FORTRAN语言程序设计中,本文采用Compaq Visual Fortran6.6编译器,可以容易地生成动态链接库。

在这种方式混合编程中,由于需要在两种不同的语言之间进行内存中的数据交换,因此,其数据类型必须一一对应。由于不同语言的数据类型所对应的存储方式、数据传递方式不尽相同,而且程序调试需要在两个不同的编译器中进行,因此这种方法编译调试较为麻烦,不易解决编译中出现的一些问题。

在生成动态链接库的FORTRAN子程序中,必须采用以下方法进行说明:

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

上面第一句话中,关键字DLLEXPORT表明这个子程序在动态链接库中可被外部调用,SUB_NAME为此子程序在动态链接库中的程序名;第二句话中的ALIAS给该程序名另赋一个别名,因为FORTRAN默认情况下编译出的程序名为大写字母,别名中可以改变。

函数和程序的调用中,参数传递的方式有两种。一种是传递参数地址的方式,即Call by Refence,另一种是传递值的方式,即Call by Value。在CVF生成动态链接库时,默认的通信协议为’_StdCall’,其参数传递方式是第一种。而在Delphi中,参数的传递方式跟参数本身的类型相关。如有一子过程定义:

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

这里,x1,x2被定义为常数类型的双精度实数,其参数传递方式为第二种,即Call by value,其值在传递中保持不变;x3, x4为变量类型的双精度整数,其传递方式为第一种,即Call by Reference,其值在计算中可以被改变*。在默认情况下,即参数前面没有说明属于那种类型的参数,则默认为常数类型。

也可以采用Delphi中的指针变量来获得与FORTRAN默认条件下完全相同的调用方式:

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

Pointer表明x1,x2是无类型指针(也可以采用有类型指针,这里从略),这时如果在另一程序中定义了四个双精度数a1,a2,a3,a4,按如下方式调用:

   Sub_Name(@a1,@a2,a3,a4)

则a1,a2,a3,a4中的值在计算前后都是可以改变的。

以指针变量作为虚参对于Delphi和FORTRAN的混合编程中数组的传递很有意义。因为Delphi的数组和FORTRAN中不同,Delphi中固定的数组和动态数组的传递方式是不相同的。采用指针,就没有那么费事。如上例中,如果a1,a2是数组,那么其调用方式为:

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

就是将第一个数组元素的地址传递过去。如果不是第一个元素的地址,是后面某个元素的地址,则虚实数组的结合从这个元素开始。

如果虚参中出现了字符串,则有两种传递方式。一种是根据FORTRAN中的标准,同时传递字符串内容和长度,这时,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

在Delphi中相应的接口过程定义为:

Procedure Sub_Name(Const x1,x2:Pointer;

Str:String;

Len:Integer;

 Var x3, x4:Double);

则按如下方式调用:

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

[1] [2]  下一页


[Delphi程序]Delphi 与 FORTRAN语言的混合编程  
教程录入:mintao    责任编辑:mintao 
  • 上一篇教程:

  • 下一篇教程:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
      注:本站部分文章源于互联网,版权归原作者所有!如有侵权,请原作者与本站联系,本站将立即删除! 本站文章除特别注明外均可转载,但需注明出处! [MinTao学以致用网]
      网友评论:(只显示最新10条。评论内容只代表网友观点,与本站立场无关!)

    同类栏目
    · C语言系列  · VB.NET程序
    · JAVA开发  · Delphi程序
    · 脚本语言
    更多内容
    热门推荐 更多内容
  • 没有教程
  • 赞助链接
    更多内容
    闵涛博文 更多关于武汉SEO的内容
    500 - 内部服务器错误。

    500 - 内部服务器错误。

    您查找的资源存在问题,因而无法显示。

    | 设为首页 |加入收藏 | 联系站长 | 友情链接 | 版权申明 | 广告服务
    MinTao学以致用网

    Copyright @ 2007-2012 敏韬网(敏而好学,文韬武略--MinTao.Net)(学习笔记) Inc All Rights Reserved.
    闵涛 投放广告、内容合作请Q我! E_mail:admin@mintao.net(欢迎提供学习资源)

    站长:MinTao ICP备案号:鄂ICP备11006601号-18

    闵涛站盟:医药大全-武穴网A打造BCD……
    咸宁网络警察报警平台