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

我有很长的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”?

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

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

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

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