ctypes モジュールを使用して、Python プログラム内から、私が作成した線形代数ルーチンの (fortran) ライブラリを呼び出そうとしています。ライブラリのインポートに成功し、単一の値を返すサブルーチンと関数を呼び出すことができます。私の問題は、double の配列を返す関数を呼び出すことです。戻り値の型を指定する方法がわかりません。その結果、そのような関数を呼び出すたびに segfault が発生します。
以下は最小限の作業例で、2 つの 3-ベクトル間のクロス積を求めるルーチンです。
!****************************************************************************************
! Given vectors a and b, c = a x b
function cross_product(a,b)
real(dp) a(3), b(3), cross_product(3)
cross_product = (/a(2)*b(3) - a(3)*b(2), &
a(3)*b(1) - a(1)*b(3), &
a(1)*b(2) - a(2)*b(1)/)
end function cross_product
これが私のpythonスクリプトです:
#!/usr/bin/python
from ctypes import byref, cdll, c_double
testlib = cdll.LoadLibrary('/Users/hart/codes/celib/trunk/libutils.so')
cross = testlib.vector_matrix_utilities_mp_cross_product_
a = (c_double * 3)()
b = (c_double * 3)()
a[0] = c_double(0.0)
a[1] = c_double(1.0)
a[2] = c_double(2.0)
b[0] = c_double(1.0)
b[1] = c_double(3.0)
b[2] = c_double(2.0)
print a,b
cross.restype = c_double * 3
print cross.restype
print cross(byref(a),byref(b))
出力は次のとおりです。
goku:~/python/ctypes> ./test_example.py
<__main__.c_double_Array_3 object at 0x10399b710> <__main__.c_double_Array_3 object at 0x10399b7a0>
<class '__main__.c_double_Array_3'>
Segmentation fault: 11
goku:~/python/ctypes>
「cross.restype = ...」という行に対してさまざまな順列を試しましたが、実際に何をすべきかわかりません。この質問を読んでくれてありがとう。--ガス