3
我想调整一个ctypes数组。正如你所看到的,ctypes.resize不能像它那样工作。我可以写一个函数来调整数组大小,但我想知道一些其他的解决方案。也许我错过了一些ctypes技巧,或者我只是使用调整大小错误。名称c_long_Array_0似乎告诉我这可能不适用于调整大小。Resize ctypes array
>>> from ctypes import *
>>> c_int * 0
<class '__main__.c_long_Array_0'>
>>> intType = c_int * 0
>>> foo = intType()
>>> foo
<__main__.c_long_Array_0 object at 0xb7ed9e84>
>>> foo[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: invalid index
>>> resize(foo, sizeof(c_int * 1))
>>> foo[0]
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
IndexError: invalid index
>>> foo
<__main__.c_long_Array_0 object at 0xb7ed9e84>
>>> sizeof(c_int * 0)
0
>>> sizeof(c_int * 1)
4
编辑:喜欢的东西也许去:
>>> ctypes_resize = resize
>>> def resize(arr, type):
... tmp = type()
... for i in range(len(arr)):
... tmp[i] = arr[i]
... return tmp
...
...
>>> listType = c_int * 0
>>> list = listType()
>>> list = resize(list, c_int * 1)
>>> list[0]
0
>>>
但是,这是丑陋的传递,而不是类型的大小。它适用于它的目的,就是这样。
斯科特,我忘了一件事。我想如果你的数组像我们正在做的那样初始化了(没有mallocing一个块,让ctypes这样做),那么你需要在新的ctypes对象中保留对原始对象的引用,因为我认为当第一个对象对象死亡。所以你需要做“如果hasattr(array,”original“),newarray.original = array.original,否则newarray.original = array”。然后垃圾收集器将垃圾桶原来的数组,然后释放块。如果您需要帮助,请在评论框中提问。 – Unknown 2009-05-28 09:24:10
Gotcha。我遇到了一个问题,我无法调整ctypes Structure中的_field_成员的大小。关于内存不被拥有的东西或东西。没什么大不了的。 – Scott 2009-05-28 14:40:52