2015-11-19 171 views
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指針?

+0

如果'run'需要一個'無效**'應該輸入這樣。在這種情況下,在Python中傳遞'byref(p)'作爲參數。在C或C++中,取消引用指針來存儲值,例如'* output = some_address'。 – eryksun

+0

@eryksun哇,我的整個問題都是'run' **而不是**期待'void **'。簡單的修復,謝謝! – colinbrownec

回答

2

由於eryksun的評論指出,對於void*是一個輸出參數,它應該是void**

# DLLEXPORT int run(double input1, double input2, void** output) 

from ctypes import * 
mydll = cdll.mydll 

mydll.run.argtypes = [c_double, # input 1 
         c_double, # input 2 
         POINTER(c_void_p)] # output pointer 
mydll.run.restype = c_int 

p = c_void_p() 
retval = mydll.run(1.2,3.4,byref(p)) 

print p.contents 
相關問題