c-fortran互操作性 - 带指针的派生类型

时间:2012-12-06 16:39:04

标签: c interop fortran fortran-iso-c-binding

我有很长的fortran代码,必须从python中使用。我决定做Fortran-> C-> Python接口。

我遇到了一个问题:我在包含

的Fortran模块中派生了类型
double precision, allocatable  

键入成员。

当尝试用ifort编译时,我得到了(与gfortran相似):

Each component of a derived type with the BIND attribute shall be a nonpointer,         
nonallocatable data component with interoperable type and type parameters

这实际上与英特尔编译器文档和Fortran 2003标准一致:第15.2.5点。

有没有办法访问带有allocatable或指针的Fortran“type”?

1 个答案:

答案 0 :(得分:1)

不是真的。即使是全新的TS 29113 不提供解决方案。它有TYPE(*)但您必须知道如何解码C中的结构。您可以通过逆向工程来完成。

在引用的TS中,实际上有一个宏的结构大小。见CFI_attribute_allocatable。但解除引用的问题仍然存在。建议使用标准数组描述符,但某些编译器(特别是gfortran)尚不支持此TS。

可能的是,只需将指向结构的指针传递给通用函数,例如qsort。然后你只使用一块内存,它恰好也包含一些指针或可分配的描述符,但C不必知道它们。

另一种可能性是构造一个仅包含type(c_ptr)的派生类型,而不是Fortran指针,并使用c_loc()来填充它们。确保只有连续的数组。