2012-03-26 121 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