tra*_*res 3 python ctypes types
我在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
Run Code Online (Sandbox Code Playgroud)
我尝试像这样投射它:
ptrpulse = cast(ptrpulse, ctypes.LP_c_double)
Run Code Online (Sandbox Code Playgroud)
但我得到:
NameError: name 'LP_c_double' is not defined
Run Code Online (Sandbox Code Playgroud)
非常感谢任何帮助或方向.谢谢大家!
当您创建指向double的指针时,由ctypes动态创建LP_c_double.即
LP_c_double = POINTER(c_double)
Run Code Online (Sandbox Code Playgroud)
此时,您已经创建了一个C 类型.您现在可以创建这些指针的实例.
my_pointer_one = LP_c_double()
Run Code Online (Sandbox Code Playgroud)
但这是踢球者.你的函数不期望指向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)
Run Code Online (Sandbox Code Playgroud)
现在应该使用ReturnPulse 返回的值填充五个数组.
您自己用 Python 编写包装器吗?错误说“预期 LP_c_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>
Run Code Online (Sandbox Code Playgroud)
您需要修复argtypes以正确期望指向双精度数组的指针,或者需要像函数当前期望的那样传递指向单个双精度的指针。