如何创建指向数组的Python ctypes指针

时间:2012-01-27 07:37:53

标签: python pointers ctypes

我需要学习如何通过Python ctypes处理下面C ++方法中的char**。 我正在使用create_string_buffer()调用其他只需要单指针的方法,但是这个方法需要一个指向指针数组的指针。

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

如何在ctypes中创建指向六个create_string_buffer(7963648)缓冲区数组的指针,以传递给用于编写的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 个答案:

答案 0 :(得分:1)

也许像

之类的东西
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

答案 1 :(得分:0)

通过调用create_string_buffer创建所需的所有string_buffers后,您可以为它们创建一个数组:var=(POINTER(c_char)size)() / pointer_to_pointer */

然后你可以通过用var[index]索引来填充它,最后只需用它作为参数调用你的函数....对我来说工作正常,我只是在带有签名{{的函数上测试它1}}用C写的