2012-03-26 118 views
3

我正在寻找使用ctypes来调用几年前由我的老板编写的一些老的fortran库。我按照this previous question中给出的例子,我得到了预期的结果。使用ctypes从Python调用fortran函数

然而,当我修改代码,以获得稍微接近我所面临的局面,让

integer function addtwo(a, b) 
    integer, intent(in) :: a, b 
    addtwo = a + b 
end function 

成为

real function addtwo(a, b) 
    integer, intent(in) :: a, b 
    addtwo = a + b 
end function 

即函数现在是real,不integer,返回的值始终为0。任何人都可以解释发生了什么以及我应该如何解决这个问题?

(PS。我用在Mac OS雪豹64位gfortran编译)

编辑:功能我用看起来像挣扎:

real function ykr(seed) 

    integer, intent(in) :: seed 
    real ykr0 
    ykr= real(seed) 
end function 

真的, ykr以递归方式调用另一个函数ykr0,但由于即使在这个基本方面我仍在挣扎,所以我暂时忽略了这一点。我看不出这是什么代码和上面的,但调用ykr_(byref(c_int(4)))回报0,不4预期之间的不同...

+0

为什么不使用NumPy附带的Fortran FFI内容? – 2012-03-26 03:57:12

+0

你的意思是f2py?这对我的系统造成了很多麻烦,我认为这将是一个很好的短期解决方案。理论上! – samb8s 2012-03-26 03:59:05

+1

你可以尝试'addtwo = real(a + b)',它能修复它吗? – 2012-03-26 04:00:49

回答

4

添加行

ykr_.restype = c_float 

在Python代码,ykr_(byref(c_int(4)))之前。 这将函数的返回类型设置为float(或Fortan语言中的real)。

在原来的文章中,这是没有必要的,因为int被认为是默认值。

+0

非常好。非常感谢,这解决了这个问题。 – samb8s 2012-03-26 04:43:02