期望 LP_c_double 实例而不是 c_double_Array - python 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 个回答
2
你是在自己用Python写这个包装器吗?错误信息“expected LP_c_double instance”意思是它在期待一个指向单个双精度浮点数的指针,而不是你提到的数组。
>>> 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,让它正确地期待一个指向双精度浮点数数组的指针,要么就需要传入一个指向单个双精度浮点数的指针,像当前这个函数所期待的那样。
11
LP_c_double 是通过 ctypes 动态创建的,当你创建一个指向 double 类型的指针时,也就是这样。
LP_c_double = POINTER(c_double)
到这里,你已经创建了一个 C 语言的 类型。现在你可以创建这些指针的实例了。
my_pointer_one = LP_c_double()
但这里有个关键点。你的函数并不是在期待一个指向 double 的指针,而是期待一个 double 数组。在 C 语言中,类型为 X 的数组是通过一个指向该数组第一个元素的指针(类型也是 X)来表示的。
换句话说,要创建一个适合传递给你函数的指向 double 的指针,你实际上需要分配一个有限大小的 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 返回的值填充。