سؤال

أود تغيير حجم مجموعة CTTYPES. كما ترون، ctypes.resize لا يعمل مثل ذلك يمكن. يمكنني كتابة وظيفة لتغيير حجم صفيف، لكنني أردت أن أعرف بعض الحلول الأخرى لهذا. ربما أفتقد بعض خدعة ctypes أو ربما استخدمت ببساطة تغيير حجم الخطأ. يبدو أن الاسم C_long_array_0 يخبرني بذلك قد لا يعمل مع تغيير حجمه.

>>> 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
>>> 

ولكن هذا يمر القبيح النوع بدلا من الحجم. إنه يعمل لغرضه وهذا كل شيء.

هل كانت مفيدة؟

المحلول

from ctypes import *

list = (c_int*1)()

def customresize(array, new_size):
    resize(array, sizeof(array._type_)*new_size)
    return (array._type_*new_size).from_address(addressof(array))

list[0] = 123
list = customresize(list, 5)

>>> list[0]
123
>>> list[4]
0
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top