如何在ctypes中转换为常量?

时间:2015-02-21 06:28:48

标签: python c++ ctypes

我有一个C函数,在第三个输入pos中使用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中实际上是一个普通的旧双,所以不太清楚为什么需要是一个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 *常数,我想我可以...... [/ p>

1 个答案:

答案 0 :(得分:3)

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

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

由于函数可能需要一个双精度数组,因此这是语法:

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