Pergunta

Eu gostaria de redimensionar uma matriz ctypes. Como você pode ver, ctypes.resize não funciona como podia. Eu posso escrever uma função para redimensionar uma matriz, mas eu queria saber algumas outras soluções para isso. Talvez eu estou faltando alguma ctypes truque ou errado redimensionamento talvez eu simplesmente usado. O nome c_long_Array_0 parece me dizer isso não podem trabalhar com redimensionamento.

>>> 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: Talvez ir com 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
>>> 

Mas isso é feio passando do tipo em vez do tamanho. Ele trabalha para o seu propósito e é isso.

Foi útil?

Solução

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 em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top