2016-11-20 62 views
1

我正在使用Python調用由f2py綁定的Fortran函數。當我明確維度數組我的總和調用返回所希望的結果,但是當我使用假定形狀返回0將數組傳遞給假定形狀

! foo.f95 
function sum_test(arr) 
    IMPLICIT NONE 
    integer(8), dimension(:), intent(in) :: arr 
    integer(8) :: sum_test 
    sum_test = sum(arr) 
end function sum_test 

Python端:

import foo 
foo.sum_test([1,2,3]) 
0L 

如果我在Fortran的明確尺寸:

! foo.f95 
function sum_test(arr) 
    IMPLICIT NONE 
    integer(8), dimension(3), intent(in) :: arr 
    integer(8) :: sum_test 
    sum_test = sum(arr) 
end function sum_test 

Python端:

import foo 
foo.sum_test([1,2,3]) 
6L 

需要注意的是,如果我打印出我的價值在假設形狀的版本,像這樣:

write(*,*) arr 

我可以看到數組中的值。

我很明顯錯過了一些關鍵的作品!

+0

嗨,歡迎光臨。儘量保持你的帖子收斂,避免冗長的介紹,謝謝和問候。你的名字已經在帖子下面了,不需要重複。使用標籤[標籤:fortran]並添加一個特定的版本,如果你有這樣做的理由(不在這裏)。更多的人遵循更通用的標籤,所以你更有可能得到答案。此外,應該使用大寫字母(I,Fortran,Python)是很好的,否則對某些人來說可能會顯得「懶惰」。 –

+0

也可以報告您使用的軟件版本和您使用的編譯器標誌。 –

回答

0

假設形狀的數組需要調用者傳遞關於數組邊界以及數據地址的信息。這樣做的機制與實現有關,並不是所有的實現都記錄了它們的方法。你的Python代碼只是傳遞數據地址,但Fortran期望(通常)一個「描述符」數據結構。 (Fortran 2015指定了執行此操作的標準方法,作爲「進一步C互操作性」的一部分。)

我建議的是Fortran調用「可調整數組」,將範圍作爲單獨參數傳遞。

+0

謝謝你的解釋! –

+0

在f77中稱爲可調整數組的函數稱爲自f90以來的假定大小。正如史蒂夫所說,這可能是你希望進行跨語言調用,這樣可以使用f2003風格的C互操作性,而不依賴於提供描述符。 – tim18

+0

我不確定你的答案。我認爲假定形狀數組應該被f2py支持。當然,f2py必須使用正確編譯器的正確調用約定,但應該支持它。 –