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