Как создать указатель Python ctypes на массив указателей - PullRequest
4 голосов
/ 27 января 2012

Мне нужно научиться обрабатывать char** в методе C ++ ниже через Python ctypes. Я прекрасно выполнял вызов других методов, которым нужны только одиночные указатели, используя create_string_buffer(), но этот метод требует указателя на массив указателей.

ladybugConvertToMultipleBGRU32(
         LadybugContext          context,
        const  LadybugImage * pImage,
        unsigned char**        arpDestBuffers,
         LadybugImageInfo *   pImageInfo  )

Как создать указатель на массив из шести create_string_buffer(7963648) буферов в ctypes для передачи этому методу C ++ для записи?

arpDestBuffers = pointer to [create_string_buffer(7963648) for i in xrange(6)]

Спасибо за любую помощь.


Оба ответа, приведенные ниже, работают. Я просто не осознавал, что у меня есть другая проблема в моем коде, которая помешала мне сразу увидеть результаты. Первый пример так же, как Люк написал:

SixBuffers = c_char_p * 6
arpDestBuffers = SixBuffers(
            *[c_char_p(create_string_buffer(7963648).raw) for i in xrange(6)] )

Второй пример из ответа omu_negru:

arpDestBuffers = (POINTER(c_char) * 6)()
arpDestBuffers[:] = [create_string_buffer(7963648) for i in xrange(6)]

Обе функции принимаются и перезаписываются. Ввод print repr(arpDestBuffers[4][:10]) до и после вызова функции дает:

'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00'
'\x15\x10\x0e\xff\x15\x10\x0e\xff\x14\x0f'

, который показывает, что функция успешно перезаписала буфер данными.

Ответы [ 2 ]

1 голос
/ 27 января 2012

Может быть, что-то вроде

SixBuffers = c_char_p * 6
arpDestBuffers = SixBuffers(*[c_char_p(create_string_buffer(7963648).raw) for i in xrange(6)])

Сам не пробовал, поэтому не уверен, что это работает. Вдохновлен http://python.net/crew/theller/ctypes/tutorial.html#arrays

0 голосов
/ 27 января 2012

после того, как вы создадите все необходимые вам string_buffer, вызвав create_string_buffer, вы можете создать для них массив: var=(POINTER(c_char)<em>size)() /</em> pointer_to_pointer */

Затем вы можете заполнить его, проиндексировав его var[index] и, наконец, просто вызвать вашфункция, использующая это как аргумент .... Работает нормально для меня, и я только что проверил это на функции с подписью void test_fn(char*,char**,unsigned char);, написанной на C

...