预期的LP_c_double实例而不是c_double_Array - python ctypes错误

时间:2009-09-12 00:28:10

标签: python types ctypes

我在DLL中有一个函数,我必须用python代码包装。该函数期望指向双精度数组的指针。这是我得到的错误:

Traceback (most recent call last):
  File "C:\....\.FROGmoduleTEST.py", line 243, in <module>
    FROGPCGPMonitorDLL.ReturnPulse(ptrpulse, ptrtdl, ptrtdP,ptrfdl,ptrfdP)
ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_c_double instance instead of c_double_Array_0_Array_2

我试着像这样投射它:

ptrpulse = cast(ptrpulse, ctypes.LP_c_double)

但我明白了:

NameError: name 'LP_c_double' is not defined

非常感谢任何帮助或指导。 谢谢大家!

2 个答案:

答案 0 :(得分:7)

创建指向double的指针时,ctypes会动态创建LP_c_double。即。

LP_c_double = POINTER(c_double)

此时,您已创建了C 类型。您现在可以创建这些指针的实例。

my_pointer_one = LP_c_double()

但这是踢球者。你的函数不期望指向double的指针。它期待一系列双打。在C中,类型X的数组由指针(类型X)表示到该数组中的第一个元素。

换句话说,要创建一个指向适合传递给你的函数的double的指针,你实际上需要分配一些有限大小的双精度数组(ReturnPulse的文档应该表明要分配多少),然后传递该元素直接(不要强制转换,不要取消引用)。

size = GetSize()
# create the array type
array_of_size_doubles = c_double*size
# allocate several instances of that type
ptrpulse = array_of_size_doubles()
ptrtdl = array_of_size_doubles()
ptrtdP = array_of_size_doubles()
ptrfdl = array_of_size_doubles()
ptrfdP = array_of_size_doubles()
ReturnPulse(ptrpulse, ptrtdl, ptrtdP, ptrfdl, ptrfdP)

现在应该用ReturnPulse填充值返回的五个数组。

答案 1 :(得分:2)

你自己在用Python编写包装器吗?说“预期的LP_c_double实例”的错误意味着它期望指向单个double的指针,而不是您建议的数组。

>>> ctypes.POINTER(ctypes.c_double * 10)()
<__main__.LP_c_double_Array_10 object at 0xb7eb24f4>
>>> ctypes.POINTER(ctypes.c_double * 20)()
<__main__.LP_c_double_Array_20 object at 0xb7d3a194>
>>> ctypes.POINTER(ctypes.c_double)()
<__main__.LP_c_double object at 0xb7eb24f4>

你需要修复你的argtypes以正确地期望指向一个双精度数组的指针,或者你需要传入指向单个双精度的指针,就像当前期望的函数一样。