0

ctypes を介して共用体の配列を C++ DLL に渡そうとしていますが、Python は初めてです。それらを構築する簡単な方法はありますか。たとえば、次のようになります。

class MyValue(Union):
  _fields_ = [
    ("ftNone"  , c_void_p),
    ("ftString", c_char_p),
    ("ftInt"   , c_int   ),
    ("ftBigInt", c_long  ),
    ("ftFloat" , c_char_p)
  ]
MyValues = MyValue * 20

CMethod(MyValues(
 ('ftInt'    = 12),
 ('ftString' = 'testing')
))

または、これを行うより良い方法はありますか? 基本的に、混合型の配列を DLL に渡したいと考えています。

4

1 に答える 1

1

ctypes 配列は、位置引数で初期化されます。初期値は、ctypes データ オブジェクト、単純なデータ型 ( などの単純な型の配列の場合c_int * 20) と互換性のある Python オブジェクト、またはコピーする配列のデータ型の一時的なインスタンスを作成するために使用される位置引数のタプルにすることができます。 ( memcpy) 配列に。

適切なコンバーターを選択するにはキーワード引数が必要なので、呼び出しMyValueて一時インスタンスを手動で作成するかsetattr、初期化された配列の各項目を呼び出す必要があります。*前者の場合、ジェネレーター式を**アンパックと組み合わせて使用​​できます(チュートリアルを参照してください)。

values = [
    ('ftInt', 12),
    ('ftString', 'testing'),
]

arr = MyValues(*(MyValue(**{k: v}) for k, v in values))

setattrそして、ループ内で配列を更新するために使用する代替手段は次のとおりです。

arr = MyValues()
for item, value in zip(arr, values):
    setattr(item, *value) # note the * unpacking

_PyCData_set(Modules/ctypes/_ctypes.c)にキーワード引数 dict のサポートを追加するとよいでしょう。

于 2013-10-15T03:40:38.017 に答える