参考ページ
2012-10-17 PythonからFortranのサブルーチンを呼ぶ。 http://d.hatena.ne.jp/ignisan/20121017
How to create Fortran DLL in Visual Studio with Intel Fortran compiler http://sukhbinder.wordpress.com/2011/04/14/how-to-create-fortran-dll-in-visual-studio-with-intel-fortran-compiler/
Fortran DLL ソースコード
module m_test implicit none real(8), parameter :: pi = 4 * atan(1.0d0) contains subroutine test(n, x) BIND(c, name = 'test') !DEC$ ATTRIBUTES DLLEXPORT :: test integer, value :: n real(8), intent(out) :: x(n) integer :: i print *,'n = ',n do i = 1, n x(i) = sin( (i - 1) * pi / (n - 1) ) end do end subroutine test end module m_test
x64 版は、calling convention が default でいいんじゃないかと思う...
スカラー引数は値呼び出しにしてみました。(F2003)
DLL EXPORT は F2003 の C 互換命令では対応できないので、インテル拡張の修飾子をつけてやる必要があります。
BIND オプション (f203) で LINKER に見える名前が指定できるので、MODULE の中にサブルーチンを置いても名前が MODULE 名の付加されためんどくさいものにならずに済みます。
Python 呼び出し
準備
from ctypes import * my_mod = CDLL("./x64/release/DLL_Python.dll") my_mod.test.argtypes = [ c_int32, np.ctypeslib.ndpointer(dtype=np.float64)] my_mod.test.restype = c_void_p
実行
x = np.arange(0.0, 100.0, dtype=np.float64) my_mod.test(x.size, x) plot(x)