2012-12-06 130 views
2

我有很长的fortran代码必须从python变得可用。我决定做Fortran-> C-> Python界面。c-fortran互操作性派生类型与指针

我有一个问题:我已包含

double precision, allocatable 

类型作为成员的Fortran模块内派生类型。

当试图用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

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

实际上在引用的TS中有一个宏结构的大小。请参阅CFI_attribute_allocatable。但解引用的问题依然存在。有一个标准的数组描述符被提出,但是这个TS尚未被一些编译器支持(特别是gfortran)。

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

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

+0

对于其类型为我的派生类型的每个对象实例,我知道包含的数组的实际大小。每种情况下它们可能都不相同。我可以处理解除引用。也许我不会解决这个问题。对于我来说,指针只是内存中的一个地址,并且类似于 struct int * a int * b int * c }; 是3 * sizeof(int *)个字节的大字节,通常计算结果为24个字节(该值可能仅等于12个字节,但可以为每台计算机一劳永逸地确定)。 Fortran有什么不同? Fortran中的指针与C中的指针大不相同? – Lacek

+1

Fortran中的指针和更多可分配组件更多,然后就是地址。例如,它们可以指向不连续的数组。 –