Frage

Ich möchte eine ctypes Array ändern. Wie Sie sehen können, funktioniert ctypes.resize nicht wie es könnte. Ich kann eine Funktion schreiben, um ein Array Größe ändern, aber ich wollte ein paar andere Lösungen, dies wissen. Ich vermisse einige ctypes Trick vielleicht oder vielleicht ich einfach falsch verwendet Größe ändern. Der Name c_long_Array_0 scheint mir zu sagen, dies nicht mit Resize arbeiten kann.

>>> 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: Vielleicht gehen Sie mit so etwas wie:

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

Aber das ist hässlich den Typ anstelle der Größe übergeben. Es funktioniert für seinen Zweck und das ist es.

War es hilfreich?

Lösung

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
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top