我已經適應從這個questionFortran的DLL在Python包裝,對於相同功能的輸出變化
我的最終目標是我的代碼: - 收拾在一個DLL(已完成) 一些Fortran代碼 - 創建Python封裝器作爲接口接收來自源的輸入,並將這些輸入提供給DLL並將它們傳遞到DLL Fortran函數 - 返回函數的輸出以傳遞給另一個Python程序。到目前爲止,我一直在使用這個例子作爲原型(我最終會適應這個原型),每次都會獲得不同的輸出結果。如下圖所示
:
C:\Users\NAME\Desktop>python.exe py_wrapper.py
<CDLL 'fort_test', handle 6f800000 at 0x25e174ec2e8>
<_FuncPtr object at 0x0000025E17617388>
<_FuncPtr object at 0x0000025E17617388>
c_long(3)
390943376 <---int value (my annotation for clarity)
<class 'int'>
c_long(390943376)
<__main__.LP_c_long object at 0x0000025E174D54C8>
和
C:\Users\NAME\Desktop>python.exe py_wrapper.py
<CDLL 'fort_test', handle 6f800000 at 0x23fa636c2e8>
<_FuncPtr object at 0x0000023FA6497388>
<_FuncPtr object at 0x0000023FA6497388>
c_long(3)
-1506454896 <---int value (my annotation for clarity)
<class 'int'>
c_long(-1506454896)
<__main__.LP_c_long object at 0x0000023FA63554C8>
這裏是我的Fortran代碼內容:
subroutine ex(i)
integer i
i=i+1
return i
end
,這裏是我的Python包裝:(還有很多的測試東西在這裏)
from ctypes import *
DLL = CDLL('fort_test')
print(DLL)
print(getattr(DLL, 'ex_'))
print(DLL.ex_)
x = pointer(c_int(3))
print(x.contents)
res = DLL.ex_(x)
print(res)
print(type(res))
proc_res = pointer(c_int(res))
print(proc_res.contents)
print(proc_res)
我的問題是,有誰知道爲什麼這個輸出不斷變化?我的代碼輸入是3,我希望給出的函數有4個輸出,但是我得到的內容類似於內存地址(請參閱輸出示例中的註釋)或內存地址的有符號整數表示形式?
儘管這裏沒有關係,我在Fortran子程序中可能並不意味着你的想法。 – francescalus
哦,我忘了拿出來哈哈。我正在擺弄東西,我並不真正瞭解fortran那麼好(因此我爲什麼要試圖包裝它,我真的想要做這件事的代碼要大得多,我不能在這裏發佈) – Andy
I對Fortan調用約定不熟悉,但是你*傳遞一個指向一個整數的指針而不是實際的整數。我的猜測是你正在收到的地址,而不是價值。你有沒有試過一個簡單的'res = DLL.ex_(3)'? –