由Python向Fortran中传递值的问题

三、由PythonFortran中传递值的问题

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]
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容