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

5 投票
2 回答
20280 浏览
提问于 2025-04-15 14:16

我有一个在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 返回的值填充。

撰写回答