Сообщить об ошибке.

Массивы Array модуля ctypes в Python

Абстрактный базовый класс массивов.

ctypes.Array(*args):

Рекомендуемый способ создания конкретных типов массивов - это умножение любого типа данных ctypes на положительное целое число. Кроме того, можно создать подкласс этого типа и определить переменные класса [Array._length_ и Array._type_.

Элементы массива могут быть прочитаны и присвоены с использованием стандартного доступа по индексам и фрагментам среза. При взятии среза - результирующий объект сам по себе не является массивом.

Конструкторы подкласса массива принимают позиционные аргументы, используемые для инициализации элементов по порядку.

Переменные класса ctypes.Array

Array._length_:

Переменная Array._length_ это положительное целое число, определяющее количество элементов в массиве.

Индексы вне допустимого диапазона приводят к ошибке IndexError. Будет возвращено функцией len().

Array._type_:

Переменная Array._type_ задает тип каждого элемента в массиве.


Примеры использования массивов модуля ctypes.

Массивы - это последовательности, содержащие фиксированное количество экземпляров одного типа.

Рекомендуемый способ создания типов массивов - умножение типа данных на положительное целое число:

TenPointsArrayType = POINT * 10

Пример "надуманного" типа и структуры, в которую входит массив из 4-х объектов POINT():

>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = ("x", c_int), ("y", c_int)
...
>>> class MyStruct(Structure):
...     _fields_ = [("a", c_int),
...                 ("b", c_float),
...                 ("point_array", POINT * 4)]
>>> print(len(MyStruct().point_array))
# 4

Экземпляры создаются обычным способом, вызывая класс:

>>> from ctypes import *
>>> class POINT(Structure):
...     _fields_ = ("x", c_int), ("y", c_int)
... 
>>> TenPointsArrayType = POINT * 5
>>> arr = TenPointsArrayType()
>>> for pt in arr:
...     print(pt.x, pt.y)
... 
# 0 0
# 0 0
# 0 0
# 0 0
# 0 0

Приведенный выше код вывел серию строк 0 0, поскольку содержимое массива инициализировано нулями.

Также могут быть указаны правильные значения (int), с которыми массив инициализируется:

>>> from ctypes import *
>>> TenIntegers = c_int * 10
>>> ii = TenIntegers(1, 2, 3, 4, 5, 6, 7, 8, 9, 10)
>>> print(ii)
# <c_long_Array_10 object at 0x...>
>>> for i in ii: print(i, end=" ")
...
# 1 2 3 4 5 6 7 8 9 10