如何通过引用从Matlab传递参数?

10次浏览(最近30天)
如果李玖哲
如果李玖哲 2020年7月3日
评论道: 詹姆斯Tursa 2020年7月3日
你好,
我有一个Fortran Dll,它有一个子程序与一些参数定义引用(属性引用)。我需要调用子程序从Matlab和传递不同类型的参数:实数,整数,逻辑和字符。我的问题如下:
1-通过引用可以Matlab的传递参数(或者到一个Matlab函数或函数在如Fortran另一种语言中定义的)?
如何可以一个调用dll从Matlab如果几个函数和子程序是在dll文件?
是逻辑(布尔值)3-能把MATLAB传递参数和数据的混合?
4-有任何文件解释这一切吗?
谢谢,
普通

0评论

登录并发表评论。

答案(1)

詹姆斯Tursa
詹姆斯Tursa 2020年7月3日
医生loadlibrary
创建一个C头文件,让原型的FORTRAN子程序和治疗Fortran的参数作为指针。
例如,如果Fortran子程序是这样的:
子程序mysub(d,S,I)
真正的* 8 d
真正的* 4 s
整数* 4我
那么C头文件将包含
空虚MYSUB(double *, float *, int *);
大写是因为Fortran编译器可能会变成小写的名字变成大写。
但是,字符串参数将非常棘手,因为Fortran在后台通过值传递字符串的长度。可以是开始,也可以是结束。
什么确切的子程序签名你处理?

2的评论

如果李玖哲
如果李玖哲 2020年7月3日
你好,詹姆斯,
谢谢你的回复。Fortran子程序就像这样(请注意,这里没有字符和逻辑变量):
-----------------------------------------
模块foo
包含
子例程foof (c, a、b、n, m)
!DEC$ ATTRIBUTES . dll:: foof
属性值::b,n,m
参考:a,c
整数,意图(IN):: n,m
双精度,意图(IN):: a(*),b
双精度,意图(OUT):: c(*)
做10 I = 1,m * n个
C(1)= SIN(A(I))+ B
10继续
子程序结束
前端模块FOO
--------------------------
詹姆斯Tursa
詹姆斯Tursa 2020年7月3日
C头文件看起来像这样:
/ *文件名称foof.h * /
空虚foof(双* C,双* A,双B,INT N,INT米);
需要注意的是,如果编译器将foof转换为大写,那么它可能需要成为foof。另外,上面假设Fortran的默认整数是32位整数。但是如果你编译Fortran的默认整数是64位的,那么头文件中的原型会是这样的:
空虚foof(双* C,双* A,双B,长长N,长长米);
然后你给“foof.h”给LoadLibrary。
一般的规则是,在Fortran中通过引用传递的参数在C语言中作为指针传递。而在Fortran中通过值传递的参数则不是(例如,用星号)。,不带星号)。
Fortran中的逻辑参数可能是1字节,在这种情况下,你可以在C原型中使用char。但是如果它们恰好是4字节,那么你就可以在C端使用int。
用Fortran炭字符串参数将作为指针到炭上C面被传递,但有可能是一个字符串长度由值默默地传递为好。可能是在开始或结束或旁边的字符串参数...依赖于编译器,你将不得不尝试着去看看有什么效果。例如,一个Fortran子程序,如本
子程序foo (a、c、b)
真实*8,意图(in):: a, b
字符*(*),意图(in):: c
可以是任何依赖于编译如下:
空虚foo(double *a, char *c, double *b, int len);
空虚FOO(双*一个,字符* C中,int len个,双* b)中;
空虚foo(double *a, int len, char *c, double *b);
空虚FOO(INT len个,双*一个,字符* C,双* b)中;
这个int类型可能需要是一个long - long类型。
我没有看过这个最近所以不知道目前的编译器做的。我知道老康柏编译器做了它不同于英特尔编译器,我只是不记得他们这样做是哪种方式。

登录并发表评论。

标签