我在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
任何帮助或指示,我们将不胜感激.
谢谢大家!
解决方法:
LP_c_double是在创建指向double的指针时由ctypes动态创建的.即
LP_c_double = POINTER(c_double)
至此,您已经创建了一个C类型.现在,您可以创建这些指针的实例.
my_pointer_one = LP_c_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返回的值填充五个数组.