我有一个带有以下子例程的fortran dll。
subroutine test_doubles(d) bind(C,NAME='test_doubles')
!DEC$ ATTRIBUTES DLLEXPORT :: test_doubles
implicit none
real(C_DOUBLE), dimension(:) :: d
d(1)=d(1) + 1d0
end subroutine test_doubles
subroutine test_double_ptr(dptr) bind(C,NAME='test_double_ptr')
!DEC$ ATTRIBUTES DLLEXPORT :: test_doubles
implicit none
real(C_DOUBLE), dimension(:),pointer :: dptr
real*8, dimension(:),pointer :: data
allocate(data(5))
dptr=>data
end subroutine test_double_ptr
,并希望从python调用它们。我尝试使用此代码:
import ctypes
from _ctypes import POINTER
import numpy as np
c_double_p = POINTER(ctypes.c_double)
lib = ctypes.CDLL(filename)
arr = np.ones(5)
lib.test_doubles(arr.ctypes.data_as(c_double_p))
print(arr)
但是它仅在d
具有固定尺寸且不知道如何调用test_double_ptr
时才有效。
那么有可能从python中调用这些子例程吗?