Fortran Coder

查看: 8389|回复: 3
打印 上一主题 下一主题

[混编] 用ISO_C_BINDING混编

[复制链接]

125

帖子

33

主题

0

精华

宗师

F 币
1574 元
贡献
800 点
跳转到指定楼层
楼主
发表于 2019-11-12 12:36:30 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 andy8496 于 2019-11-12 12:42 编辑

因为某些不得已的原因,不得不做C和Fortran的混编。简单说来就是要在C的代码中调用Fortran的动态链接库。目前的环境是VS2012+Intel Parallel Studio XE 2015
以下是从文档中找到的关于I[size=12.6667px]SO_C_BINDING的例子:

Example of C Calling Fortran
The following examplecalls a Fortran subroutine called Simulation. This subroutine corresponds to theC void function simulation.
Fortran Code Example
[Fortran] 纯文本查看 复制代码
subroutine Simulation(alpha, beta, gamma, delta, arrays) BIND(C)

use, intrinsic :: ISO_C_BINDING

implicit none

integer (C_LONG), value :: alpha

real (C_DOUBLE), intent(inout) :: beta

integer (C_LONG), intent(out) :: gamma

real (C_DOUBLE),dimension(*),intent(in) :: delta

 

type, BIND(C) :: pass

integer (C_INT) :: lenc, lenf

type (C_PTR) :: c, f

end type pass

 

type (pass), intent(inout) :: arrays

real (C_FLOAT), ALLOCATABLE, target, save :: eta(:)real (C_FLOAT), pointer :: c_array(:)

...

! Associate c_array with an array allocated in C

call C_F_POINTER (arrays%c, c_array, (/arrays%lenc/) )

 ...

! Allocate an array and make it available in C

arrays%lenf = 100

ALLOCATE (eta(arrays%lenf))

arrays%f = c_loc(eta)

...

end subroutine Simulation
C Struct declaration Example
struct pass {int lenc,lenf; float *c, *f;};
C Function Prototype Example
void simulation(longalpha, double *beta, long *gamma, double delta[], struct pass *arrays);
C Calling sequence Example
simulation(alpha,&beta, &gamma, delta, &arrays);
我想请教的问题:
采用上述这种方式混编的时候,直接在Fortran代码中按照上述方式编码,然后编译成Dll,就能在C中调用吗?还是仍然需要添加:
!DEC$ ATTRIBUTES STDCALL,REFERENCE,DLLEXPORT,ALIAS: ...
这种语句?我两种方式都做过尝试,但是不知道什么原因,都没有成功。所以希望有一个明确一点的方向继续尝试。

多谢各位大神赐教!
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2019-11-12 13:13:46 | 只看该作者
!DEC$ ATTRIBUTES STDCALL,REFERENCE,DLLEXPORT,ALIAS: ...
不全部需要,只需要
!DEC$ ATTRIBUTES DLLEXPORT :: func_name

125

帖子

33

主题

0

精华

宗师

F 币
1574 元
贡献
800 点
板凳
 楼主| 发表于 2019-11-13 12:23:49 | 只看该作者
vvt 发表于 2019-11-12 13:13
!DEC$ ATTRIBUTES STDCALL,REFERENCE,DLLEXPORT,ALIAS: ...
不全部需要,只需要
!DEC$ ATTRIBUTES DLLEXPOR ...

OK了!多谢指点!

4

帖子

1

主题

0

精华

熟手

F 币
212 元
贡献
60 点

规矩勋章

地板
发表于 2021-1-1 15:51:59 | 只看该作者
请问这个程序有没有完整的例子,我看了半天还是不会用啊
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-11-23 10:31

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表