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

4

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

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

我该如何在ctypes中创建一个指向6个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提供的第二个例子是:

第二个例子来自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

谢谢。我尝试了,但对我没有用。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'> '' - user6811
当您调用C API时会发生什么?缓冲区为空吗?这是问题吗? - luc
当将arpDestBuffers传递给该方法时,我会收到以下错误:ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to convert parameter 2 对于我尝试的大多数事情都是一样的。 - user6811

0

在调用 create_string_buffer 创建所有所需的 string_buffers 后,您可以使用以下方式为它们创建数组:

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

然后,您可以通过使用索引填充它 var[index],最后将其作为参数调用您的函数...对我很有效,我刚在C中测试了一个带有签名void test_fn(char*,char**,unsigned char); 的函数。

我想我对Python的了解还不够,无法实现你建议的内容。'your_pointer_to_pointer'是从哪里来的?谢谢。 - user6811
抱歉...本来应该是注释,但我想它可能会被忽略了...现在应该没问题了 :) 你可以创建一个新类型(大小为“size”的指针数组),并调用构造函数将其绑定到变量。 - omu_negru
为了填充var,我有如下代码:var[:]=[create_string_buffer(7963648) for i in xrange(6)]。看起来这个var是我想要的,但当我尝试将其传递给方法时,仍然会出现 ctypes.ArgumentError 错误提示:ctypes.ArgumentError: argument 2: <type 'exceptions.TypeError'>: Don't know how to convert parameter 2 - user6811
变量确实起作用了!谢谢。我刚刚发现参数2实际上是指第二个参数,我以为它是指第三个参数。所以现在两个参数都没问题了。 - user6811

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接