python - 如何转换为 ctypes 中的常量?

标签 python c++ ctypes

我有一个 C 函数,它在第三个输入位置采用 const 双指针:

PI_MOV(int ID, const char* szAxes, const double* pdValueArray)

当我尝试使用双指针时:

pos = C.POINTER(C.c_double)
pos.value = 2.0

GCS_api.PI_MOV(controller_number, szAxis1, pos)

我收到位置 3 的参数类型错误:

ctypes.ArgumentError: argument 3: <type 'exceptions.TypeError'>: Don't know how to convert parameter 3

如何将第三个参数 pos 转换为所需的常量双指针?这个函数实际上在 C++ Visual Studio 中作为一个普通的旧 double 函数工作,所以不太清楚为什么它需要是一个 const double*。有什么建议吗?

我试图为函数指定参数类型:

GCS_api.PI_MOV.argtypes = [C.c_int, C.POINTER(C.c_char), C.POINTER(C.c_double)]

但这也报错了:

ctypes.ArgumentError: argument 3: <type 'exceptions.TypeError'>: expected LP_c_double instance instead of _ctypes.PyCPointerType

如果我坚持原来的做法并传递一个 ctypes double * 常量,我想我会没事的....

最佳答案

pos = C.POINTER(C.c_double) 创建一个类型。您需要 c_double 的实例并将地址传递给函数:

d = C.c_double(2.0)
GCS_api.PI_MOV(controller_number, szAxis1, C.byref(d))

由于该函数可能需要一个 double 组,因此语法如下:

d = (C.c_double*4)(1.1,2.2,3.3,4.4)  # Create double[4] array

关于python - 如何转换为 ctypes 中的常量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28642897/

相关文章:

c++ - builder 模式——配置文件读取

python - 在 32 位库中使用 python ctypes

python - Pandas 数据框行的所有可能组合

python - 与功能参数作斗争

不使用范围运算符就无法访问 C++ 命名空间变量

c++ - 如何将枚举类传递给 QML?

python - 在 python 中将 tesseract 3.02 的 C API 与 ctypes 和 cv2 结合使用

python - 找到 dll,但无法从当前工作目录加载

python - 如何在(子)模块中使用 __init__.py 来定义命名空间?

python - 基本的 BeautifulSoup 维基百科抓取