2017-03-08 69 views
2

我在Fortran中有一个结构化类型,其中包含大量数据,包括指针(实数* 8指针数据类型)。将结构化数据类型从Fortran传递到C++

我正在为某些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 
+0

这有点宽泛,并且可能会因为您想到的细节而更具体一些而受益。也就是说,就C++方面而言,您对Fortran派生类型完全不透明是否满意?如果你是,那就暗示了一个潜在的简单答案。 – francescalus

+0

是的,我很高兴Fortran对C++完全不透明。我不需要知道结构的内容,只需要一种方法来维护结构的句柄,以便在后续调用之间重用它。 –

+0

看到实际的代码会好很多。 Fortran中不应该有任何必要的类型转换。 Fortran只会得到一个地址,它会将其解释为通过引用传递的结构。在C++中它将是一个'void *'。 –

回答

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) 
+0

我遵循原始问题的解决方案以及解决方案(基本相同)。我调用C_LOC方法时程序崩溃。不知道为什么?我会将我的示例代码发布到我的问题。 –