gpt4 book ai didi

python - 使用 CFFI 在 Python 中创建 CData 类型的缓冲区

转载 作者:太空宇宙 更新时间:2023-11-03 23:21:52 25 4
gpt4 key购买 nike

我正在尝试在 Python 中创建一个具有特殊类型的缓冲区,以将其发送到用 CFFI 包装的 C 函数。

在 C 中,我有类似的东西:

typedef unsigned char UINT8;
typedef UINT8* PUINT8;

然后,在 Python 中,以上行位于 ffi.cdef() 中,我的缓冲区实例化代码如下所示:

nb_buffer = 8
buffer_size = 42

buffers = ffi.new( "PUINT8[]", nb_buffer )

for i in range( nb_buffer ):
tmp_buffer = ffi.buffer( ffi.new( "UINT8[]", 1 ), buffer_size )
buffers[ i ] = ffi.cast( "PUINT8", ffi.from_buffer( tmp_buffer ) )

c.function( buffers )

C 函数接收一个 UINT8**。

并且......在 C 函数中以段错误结束。

所以我在使用 ffi.cast 之后 print buffers[ i ]:

<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>
<cdata 'unsigned char *' 0x2cbaca0>
<cdata 'unsigned char *' 0x2cbacd8>

我错过了什么?缓冲区是否在覆盖 tmp_buffer 后立即被垃圾回收?

最佳答案

怎么样:

buffers = ffi.new( "PUINT8[]", nb_buffer )
keepalive = []

for i in range( nb_buffer ):
p = ffi.new("UINT8[]", buffer_size)
keepalive.append(p)
buffers[i] = p

c.function( buffers )

# keepalive stays alive at least until here

关于python - 使用 CFFI 在 Python 中创建 CData 类型的缓冲区,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37218367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com