我在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
非常感谢任何帮助或指导。 谢谢大家!
答案 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以正确地期望指向一个双精度数组的指针,或者你需要传入指向单个双精度的指针,就像当前期望的函数一样。