混合编程之 Matlab 调用 Fortran

因为学习的需要,于是上网学习Fortran与Matlab之间的混编,起初模仿网上现成的代码,但总有碰壁,被各种小问题烦恼不堪,后慢慢摸索调试,总算能成功运行,写下此博文一为记录自己的心得,以备后用;二为网上被同样问题困扰之士提供可能的帮助。

一. 测试平台

Window 10 64位系统
Matlab 2017a 64位
Simply Fortran v2.4

二. Matlab 调用 Fortran 之 DLL实现

1、生成DLL文件
步骤1:在Simply Fortran v2.4上,新建一个Shared Library(DLL)项目,项目名随意。
步骤2:由于在64位的Matlab上调用DLL,因此我们须将项目的DLL文件也生成为64位,否则Matlab将会提示错误 “不是有效的Win32应用程序” 。注意Target Name的dll文件名须符合为Matlab变量命名法则。

另外,数值之间的传递须有相同的数值类型,否则将会运行出错。这里先提一句,我们生成的DLL文件可被调用,一般按C调用约定,因此,Fortran的数值类型须与C的数值类型匹配。在Fortran中常用的数据参数类型有:
REAL:表示浮点数据类型,即小数,等价于C的float;
INTEGER:表示整数类型,相当于C的int数据类型;
DOUBLE PRECISION:表示双精度数据类型,相当于C的double数据类型。
在本例中,我们均采用double数据类型,为了方便,可如下设置:
这里写图片描述
步骤3:书写DLL代码

subroutine test(c,a,b)
!经过本人试验,输出变量必须位于输入变量之前,即c须位于a,b之前,否则在后续Matlab调用中会错误
    !DEC$ ATTRIBUTES C,DLLEXPORT::test 
!上一行伪注释语句说明的是test_f.dll文件中包含一个名为test的子例行程序,C即为按C调用约定输出   
    real::a,b,c
    c=a+b
end subroutine

步骤4:生成DLL
直接Build project,即可生成test_f.dll文件

2、书写C语言的头文件
C语言的头文件仅包含一句代码:void test(double*,double*,double*);
该代码名须与子例行程序名相同,该头文件可在任何文件编辑器中编写,编写完后保存头文件,本例中头文件名为:test_c.h。其实,每一个dll文件可包含多个子例行程序,那么在书写头文件代码时,就需要对应书写多个void代码。

3、编辑m文件
先附示例代码:

a=1;b=2;c=0; 
a=double(a);b=double(b);c=double(c);
loadlibrary('test_f.dll','test_c.h');
w=calllib('test_f','test',c,a,b);
unloadlibrary test_f

代码第一行,a,b为输入参数,c为输出参数,但须赋初值,如0;
代码第二行,将各参数转为类型相同的double类型参数;
代码第三行,加载动态链接库,前一个为动态链接库文件名,后一个为头文件名,两者均须加后缀;
代码第四行,调用动态链接库,前一个为动态链接库文件名,无后缀,后一个为想调用的子例行程序名;
代码第五行,释放动态链接库,为无后缀的动态链接库文件名。

由此,Matlab 调用 Fortran 之 DLL成功实现。

可以预知,该例所求值:w=3; 若上述第四行代码改为:

[w,m]=calllib('test_f','test',c,a,b);

则输出的是:w=3;m=1;。由此可见Matlab是按左到右的方式获取数值的,因此,参数的排列用户需要格外重视。

猜你喜欢

转载自blog.csdn.net/yuanxzo/article/details/81537803
今日推荐