2012-12-06 78 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中的指針和更多可分配組件更多,然後就是地址。例如,它們可以指向不連續的數組。 –