1
我正在編寫一個封裝了一些C++代碼的Python模塊。我用這個功能從C++傳遞一個指針到Python(指針會由不同的功能Python ctypes,將c_void_p作爲輸出參數傳遞給c函數
DLLEXPORT void* run(double input1, double input2)
我已經添加了錯誤返回代碼,所以我的新功能看起來像
DLLEXPORT int run(double input1, double input2, void* output)
被釋放
但現在我似乎無法得到的指針的值,在Python我設置的功能與ctypes的如下
from ctypes import *
mydll = cdll.mydll
mydll.run.argtypes = [c_double, # input 1
c_double, # input 2
c_void_p] # output pointer
mydll.run.restype = c_int
然後,我通過在Python和傳球創造一個新的空指針使用的功能它以DLL函數
p = c_void_p()
retval = mydll.run(1.2, 3.4, p)
print p
運行此代碼我留下p
等於c_void_p(None)
後。
將此指針傳遞給其他函數會導致地址爲0x0的非法訪問異常,所以我不認爲它正在更新。
我預計一些地址在執行後填充p
。我缺少ctypes的東西?我可以通過分配(c_double * 10)()
來創建一個雙數組,並將其傳遞給要寫入的c函數,爲什麼我不能爲同一目的傳遞一個void指針?
如果'run'需要一個'無效**'應該輸入這樣。在這種情況下,在Python中傳遞'byref(p)'作爲參數。在C或C++中,取消引用指針來存儲值,例如'* output = some_address'。 – eryksun
@eryksun哇,我的整個問題都是'run' **而不是**期待'void **'。簡單的修復,謝謝! – colinbrownec