【发布时间】:2017-03-08 20:46:43
【问题描述】:
我在 Fortran 中有一个结构化类型,其中包含大量数据,包括指针(real*8 指针数据类型)。
我正在为一些 Fortran 例程开发 C++ API。我需要结构的内容在对 Fortran 例程的调用之间保持不变。
我正在考虑使用 loc 获取结构的地址并将地址传递给 C++ 端。
当从 C++ 再次调用 Fortran 例程并将地址传回 Fortran 时,以某种方式将其类型转换为原始结构,然后将其用于计算。
我可以使用什么方法来实现这一点?
谢谢。
编辑:我的代码基于 cmets/suggestions。 调用 C_LOC 时程序崩溃(如果我注释掉对 C_LOC 的调用,则程序不会崩溃)。
subroutine TEST(a,b,c,d,e,mystruct,ier) BIND(C, NAME='TEST')
use mymodule
USE, INTRINSIC :: ISO_C_BINDING
implicit none
TYPE(C_PTR) :: mystruct
TYPE(mymodule), TARGET :: origstruct
INTEGER :: a, b, c
DOUBLE PRECISION :: d(*), e(*)
INTEGER :: ier
!Do something with origstruct and other arguments
print *, 'here 1'
mystruct= C_LOC(origstruct)
print *, 'here 2'
end
【问题讨论】:
-
这有点宽泛,可能会受益于您考虑的细节更加具体。也就是说,就 C++ 方面而言,您对 Fortran 派生类型完全不透明感到满意吗?如果你是,这暗示了一个潜在的简单答案。
-
是的,我很高兴 Fortran 对 C++ 完全不透明。我不需要知道结构的内容,只需要一种方法来维护结构的句柄,以便我可以在后续调用之间重用它。
-
看看实际代码会好很多。 Fortran 中真的不需要任何类型转换。 Fortran 只会获得一个地址,并将其解释为通过引用传递的结构。在 C++ 中,它将是
void *。 -
你有
use mymodule和type(my module) ...? -
最好有一个新问题来解释崩溃,因为这里已经有了答案。请确保显示更多代码,并且它需要是一个真正精确的可编译副本 (minimal reproducible example)。还包括 C++ 部分。
标签: c++ pointers fortran structure