Вопрос

Я хотел бы изменить размер массива ctypes.Как видите, 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