将结构化数据类型从Fortran传递到C ++

时间:2017-03-08 20:46:43

标签: c++ pointers fortran structure

我在Fortran中有一个结构化类型,包含许多数据,包括指针(真正的* 8指针数据类型)。

我正在为一些Fortran例程开发一个C ++ API。我需要在调用Fortran例程之间保持结构的内容。

我正在考虑使用loc获取结构的地址,并将地址传递给C ++端。

当从C ++再次调用Fortran例程并将地址传递回Fortran时,会以某种方式将其转换为原始结构,然后将其用于计算。

我可以用什么方法来实现这个目标?

感谢。

编辑:我的代码基于评论/建议。 调用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

1 个答案:

答案 0 :(得分:1)

在Fortran 2003下(现在大多数编译器都支持),您可以使用标准的ISO_C_BINDING模块。如果您对获得的C指针感到满意,那么" opaque" (也就是说,你只想要一个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)