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