【发布时间】:2021-08-27 09:13:08
【问题描述】:
我在 C 接口中封装了一些遗留的 F77 代码(我无法更改)。假设遗留代码有
subroutine foo(s, l)
character*10 s
logical l(10)
…
我正在编写一个小的 F2008 包装器 foo_wrapper,它打算通过 ISO_C_BINDING 公开一个与 C 兼容的接口,进行任何必要的类型转换,调用 foo,最后再次进行类型转换。我的理解是我应该从
subroutine foo_wrapper(c_s, c_l) bind(C, name="foo_wrapper")
use ISO_C_BINDING, only: C_CHAR, C_BOOL
character(kind=C_CHAR, len=1), dimension(10) :: c_s
logical(kind=C_BOOL) c_l(10)
…
但是我实际上如何将c_s 转换为character*10,以及将c_l 转换为logical(并在通话后返回)?
【问题讨论】:
-
从逻辑上讲,您是在询问简单地更改种类类型参数(如
l=logical(c_l); ...; c_l=logical(l, kind=c_bool))还是其他? -
我很难找到问题所在,您不能直接复制到适当类型和种类的变量中然后再退出吗?
-
@IanBush:复制底层内存?不,我不保证
c_s具有与foo的第一个参数相同的内存表示(同样适用于c_l和第二个参数)。使用类型转换复制循环中的每个元素?是的,这正是我想做的。如何? :-) -
@francescalus:我不确定我是否理解你的问题,你能详细说明一下吗?顺便说一句,感谢您的编辑 - 它大大改进了标题!
-
是的,Fortran 端没有什么是指针。
标签: arrays fortran ffi fortran-iso-c-binding