三、由Python
向Fortran
中传递值的问题
subroutine(x) bind(c, name="Func")
use iso_c_binding
implicit none
! 声明变量
! 处理
end subroutine
import ctypes as ct
fortLib = ct.CDLL(r"路劲/**.dll")
func = getattr(fortLib, "Func")
1. 传递不可变值
加上value
形容词表示传值,在Fortran
内修改值不会影响Python
中的值,若想在Fortran
中暂时替换值,不可以加形容词intent(in)
integer(kind=c_int), intent(in), value :: x
a = ct.c_int(3)
func(a)
2.传递可变值
使用形容词intent(inout)
实现传址的功能,在Python
里面需要使用ct.byref()
来传址
integer(kind=c_int), intent(inout) :: x
x = 999
a = ct.c_int(0)
func(ct.byref(a))
print("a: ", a.value)
> a: 4
3.传递数组
传递数组其实都是传址,可变不可变都在于形容词intent()
的使用,不使用该形容词默认intent(inout)
integer(kind=c_int), intent(inout) :: x(3)
x=(/1,2,3/)
a = np.array([-1, 1, 33])
a_ptr = a.ctypes.data_as(ct.POINTER(ct.c_int))
func(a_ptr)
print("a: ", a)
>a: [1 2 3]