Ctypes DLL вызывает ArgumentError с помощью c_char_Array - PullRequest
0 голосов
/ 29 октября 2018

я пытаюсь написать оболочку Python DLL для проекта C

Оригинальный код C, который важен:

  1. char IOmap[4096];
  2. int ec_config_overlap(uint8 usetable, void *pIOmap);

Python Wrapper

  1. IOMap = ctypes.POINTER(ctypes.c_char * 4096)
  2. c_ec_config_overlap = ethercat.ec_config_overlap c_ec_config_overlap.argtypes = [ctypes.c_unit8, IOMap] c_ec_config_overlap.restype = ctypes.c_int

Когда я пытаюсь определить функцию в Python

def ec_config_overlap(usetable, PIOMap): return c_ec_config_overlap(usetable, PIOMap

и позвони. Получаю ошибку

ctypes.ArgumentError: аргумент 2:: ожидаемый экземпляр LPc_char_Array_4096 вместо _ctypes.PyPointerType.

Я понимаю ошибку, но как мне сделать ctype Array [4096] вместо PyPointerType?

1 Ответ

0 голосов
/ 29 октября 2018

Этот синтаксис создает экземпляры массива:

>>> import ctypes
>>> (ctypes.c_char*4096)()
<__main__.c_char_Array_4096 object at 0x0000024D84E2D7C8>

Поскольку это массив char, вы также можете использовать:

>>> create_string_buffer(4096)
<__main__.c_char_Array_4096 object at 0x0000025AE48FE948>

Тип вашей функции должен быть:

c_ec_config_overlap.argtypes = [ctypes.c_uint8, ctypes.c_void_p]

Но для лучшей проверки типа вы также можете использовать:

c_ec_config_overlap.argtypes = [ctypes.c_uint8, ctypes.c_char_p]
...