Неполные типы - это структуры, объединения или массивы, члены которых еще не указаны. В языке C они определяются форвардными объявлениями - которые определены позже:
struct cell; /* forward declaration */ struct cell { char *name; struct cell *next; };
Прямой перевод в код модуля ctypes
будет таким, но он работать не будет:
>>> from ctypes import * >>> class cell(Structure): ... _fields_ = [("name", c_char_p), ... ("next", POINTER(cell))] ... # Traceback (most recent call last): # File "<stdin>", line 1, in <module> # File "<stdin>", line 2, in cell # NameError: name 'cell' is not defined
Потому что ячейка нового класса class cell
недоступна в самом операторе класса. В ctypes
можно определить класс ячейки cell
и установить атрибут _fields_
позже, после объявления пустого класса:
>>> from ctypes import * >>> class cell(Structure): ... pass ... >>> cell._fields_ = [("name", c_char_p), ... ("next", POINTER(cell))]
Попробуем создать два экземпляра ячейки и поставим указатели друг на друга, а потом, несколько раз проследуем цепочке указателей:
>>> c1 = cell() >>> c1.name = "foo" >>> c2 = cell() >>> c2.name = "bar" >>> c1.next = pointer(c2) >>> c2.next = pointer(c1) >>> p = c1 >>> for i in range(8): ... print(p.name, end=" ") ... p = p.next[0] ... foo bar foo bar foo bar foo bar