不完全型はメンバーがまだ指定されていない構造体、共用体もしくは配列です。 Cでは、前方宣言により指定され、後で定義されます:
struct cell; /* 前方宣言 */ struct { char *name; struct cell *next; } cell;
ctypesコードへの直接的な変換ではこうなるでしょう。 しかし、動作しません:
>>> class cell(Structure): ... _fields_ = [("name", c_char_p), ... ("next", POINTER(cell))] ... Traceback (most recent call last): File "<stdin>", line 1, in ? 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))] >>>
試してみましょう。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, ... p = p.next[0] ... foo bar foo bar foo bar foo bar >>>
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。