【问题标题】:How do I create a Python ctypes pointer to an array of pointers如何创建指向指针数组的 Python ctypes 指针
【发布时间】:2012-01-27 07:37:53
【问题描述】:

我需要通过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)]

感谢您的帮助。


下面给出的两个答案都有效。我只是没有意识到我的代码中还有另一个问题,这使我无法立即看到结果。 第一个例子就像 Luc 写的那样:

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'

这表明该函数成功地用数据覆盖了缓冲区。

【问题讨论】:

    标签: python pointers ctypes


    【解决方案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

    【讨论】:

    • 谢谢。我试过了,但它不适合我。 SixBuffers = c_char_p * 6 arpDestBuffers = SixBuffers(*[c_char_p(create_string_buffer('\x00'*10).raw) for i in xrange(6)]) print type(arpDestBuffers), repr(arpDestBuffers) print type(arpDestBuffers[0]), repr(arpDestBuffers[0]) 这有以下输出:<class '__main__.c_char_p_Array_6'> <__main__.c_char_p_Array_6 object at 0x01CB9F80> <type 'str'> ''
    • 调用 C API 时会发生什么?缓冲区是空的?是不是有问题?
    • 将 arpDestBuffers 传递给方法时,我收到此错误:ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to convert parameter 2 我尝试过的大多数事情都是一样的。
    【解决方案2】:

    通过调用 create_string_buffer 创建所需的所有 string_buffer 后,您可以使用以下命令为它们创建一个数组:

    var=(POINTER(c_char)*size)()  /* pointer_to_pointer */
    

    然后您可以通过使用var[index] 对其进行索引来填充它,最后只需使用它作为参数调用您的函数....对我来说很好,我只是在一个签名为void test_fn(char*,char**,unsigned char); 的函数上对其进行了测试在C

    【讨论】:

    • 我想我对 Python 的了解还不够,无法实现您的建议。 'your_pointer_to_pointer' 来自哪里?谢谢
    • 对此感到抱歉...应该是评论,但我想它只是滑倒了...现在应该没问题 :) 你创建了一个新类型(大小为“size”的指针数组) 并调用构造函数并将其绑定到 var.
    • 填充我拥有的变量:var[:] = [create_string_buffer(7963648) for i in xrange(6)]。似乎这个 var 是我想要的,但是当我尝试将它传递给方法时,我仍然得到一个 ctypes.ArgumentErrorctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to convert parameter 2
    • var 确实有效!谢谢。我刚刚发现parameter 2实际上是指第二个参数。我以为这意味着第三个。所以现在这两个参数都很好了。
    猜你喜欢
    • 2015-03-03
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-30
    相关资源
    最近更新 更多