Pregunta

Me gustaría cambiar el tamaño de una matriz ctypes. Como se puede ver, ctypes.resize no funciona como si pudiera. Puedo escribir una función para cambiar el tamaño de una matriz, pero quería saber algunas otras soluciones a este. Tal vez me falta algo de ctypes truco o tal vez simplemente cambiar el tamaño utilizado mal. El nombre c_long_Array_0 parece decirme esto puede no funcionar con el cambio de tamaño.

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

Edit: Tal vez ir con algo como:

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

Pero eso es feo pasando el tipo de cambio del tamaño. Funciona para su propósito y eso es todo.

¿Fue útil?

Solución

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
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top