【问题标题】:Passing a structured data type from Fortran to C++ [duplicate]将结构化数据类型从 Fortran 传递到 C++ [重复]
【发布时间】: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


【解决方案1】:

在 Fortran 2003(现在大多数编译器都支持)下,您可以使用标准的 ISO_C_BINDING 模块。如果你对获得的 C 指针是“不透明的”感到满意(也就是说,你只想要一个void*),你可以使用C_LOC 函数:

use, intrinsic :: ISO_C_BINDING
type(your_struct_t), target :: your_obj
type(C_PTR) :: p

p = C_LOC(your_obj)

然后您可以将此指针传递给某个 C 过程:

interface
    subroutine mycproc(x, n, userdata) bind(C)
        use, intrinsic :: iso_c_binding
        integer(c_int), intent(in), value :: n
        real(c_double), intent(in) :: x(n)
        type(c_ptr), intent(in), value :: userdata
    end subroutine
end interface

call mycproc(x, size(x), p)

【讨论】:

  • 我遵循了原始问题的解决方案以及您的解决方案(基本相同)。当我调用 C_LOC 方法时程序崩溃。不知道为什么?我会将示例代码发布到我的问题中。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-01-06
  • 2014-08-18
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多