2016-11-20 3 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

こんにちは、歓迎します。あなたの投稿を合理的に保ち、長い紹介、感謝と挨拶を避けてください。あなたの名前は既にアイコンの下にあるので、それを繰り返す必要はありません。 tag [tag:fortran]を使用し、その理由がある場合はここにはない特定のバージョンを追加してください。より多くの人々がより一般的なタグに従うので、答えを得る可能性が高くなります。また、(I、Fortran、Pythonの)大文字を使用するとよいでしょう。さもなければ、ある人には "怠惰な"ように見えるかもしれません。 –

+0

また、使用したソフトウェアのバージョンと使用したコンパイラフラグを報告するとよいでしょう。 –

答えて

0

想定される形状の配列では、呼び出し側は配列境界に関する情報をデータアドレスとともに渡す必要があります。これを行うための仕組みは実装依存であり、すべての実装がメソッドを記述しているわけではありません。あなたのPythonコードはデータアドレスを渡すだけですが、Fortranは(通常)「ディスクリプタ」データ構造を期待しています。 (Fortran 2015はこれを「さらなるC相互運用性」の一部として行う標準的な方法を規定しています)。

代わりに、別の引数としてエクステントを渡す「調整可能な配列」とFortranが呼びます。

+0

説明ありがとうございます! –

+0

f77で調整可能な配列と呼ばれるものは、f90以降の想定サイズと呼ばれます。スティーブが言ったように、これはおそらくあなたが言語間の呼び出しを望んでいるので、f2003スタイルのCの相互運用性は、記述子の供給に依存せずに使用されるかもしれません。 – tim18

+0

あなたの答えはわかりません。私は形状配列がf2pyによってサポートされるべきだと考えています。もちろん、f2pyは適切なコンパイラの呼び出し規約を使用する必要がありますが、サポートされている必要があります。 –

関連する問題