不完全型はメンバーがまだ指定されていない構造体、共用体もしくは配列です。 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 >>>
ご意見やご指摘をお寄せになりたい方は、 このドキュメントについて... をご覧ください。