gpt4 book ai didi

Python ctypes,将 c_void_p 作为输出参数传递给 c 函数

转载 作者:太空狗 更新时间:2023-10-29 21:17:04 25 4
gpt4 key购买 nike

我正在编写一个包含一些 C++ 代码的 Python 模块。我曾经使用这个函数将一个指针从 C++ 传递给 Python(该指针将被另一个函数释放

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 中创建一个新的 void 指针并将其传递给 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)() 创建一个 double 数组并将其传递给要写入的 c 函数,为什么我不能传递一个 void 指针用于相同的目的?

最佳答案

正如 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

关于Python ctypes,将 c_void_p 作为输出参数传递给 c 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33813272/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com