簡體   English   中英

如何創建指向指針數組的 Python ctypes 指針

[英]How do I create a Python ctypes pointer to an array of pointers

我需要通過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'

這表明該函數成功地用數據覆蓋了緩沖區。

也許像

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

通過調用 create_string_buffer 創建您需要的所有 string_buffers 后,您可以使用以下命令為它們創建一個數組:

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

然后你可以通過用var[index]對其進行索引來填充它,最后只用它作為參數調用你的函數......對我來說很好用,我只是在一個簽名為void test_fn(char*,char**,unsigned char); 用 C 寫的

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM