Ожидаемый экземпляр LP_c_double вместо c_double_Array - ошибка Python ctypes - PullRequest
3 голосов
/ 12 сентября 2009

У меня есть функция в DLL, которую я должен обернуть кодом Python. Функция ожидает указатель на массив значений типа double. Это ошибка, которую я получаю:

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 ]

7 голосов
/ 12 сентября 2009

LP_c_double создается динамически ctypes, когда вы создаете указатель на double. т.е.

LP_c_double = POINTER(c_double)

На данный момент вы создали тип C . Теперь вы можете создавать экземпляры этих указателей.

my_pointer_one = LP_c_double()

Но вот кикер. Ваша функция не ожидает указатель на двойное число. Ожидается массив парных разрядов. В C массив типа X представлен указателем (типа X) на первый элемент в этом массиве.

Другими словами, чтобы создать указатель на двойник, подходящий для передачи в вашу функцию, вам действительно нужно выделить массив двойников некоторого конечного размера (документация для 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.

2 голосов
/ 12 сентября 2009

Вы сами пишете обертку на 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>

Либо вам нужно исправить свои argtypes , чтобы правильно ожидать указатель на массив значений типа double, либо вам нужно передать указатель на одинарное число типа double, как ожидает функция в настоящее время.

...