0

ctypes を使用して Python から C DLL を呼び出しています。ほとんどの機能について、すべて正常に動作しています。しかし...今、入力に16進定数を必要とする関数があり、それを正しく渡すことができないようです。

私はCソースを持っていませんが、ドキュメントから、関数定義は次のようになります:

sensv_bn* NewSensvToFinding_bn (const node_bn* Qnode, const nodelist_bn* Vnodes, int what_find)

それらはDLL内の他の関数によって作成されているため、私は合格QnodeVnodesていて適切であるとほぼ確信しています。問題は、int呼び出されwhat_findた .

DLL に付属するヘッダー ファイルから、次の行が表示されます。 enum {ENTROPY_SENSV = 0x02, REAL_SENSV = 0x04, VARIANCE_SENSV = 0x100, VARIANCE_OF_REAL_SENSV = 0x104}; /* for NewSensvToFinding_bn */

私が渡そうとしてwhat_findいる値は、その値がVARIANCE_OF_REAL_SENSV16 進値0x104です。

これを変換せずに渡し、int としてキャストしようとしましctypes.c_int(0x104)たが、関数はポインターではなく 0 を返します。同じ結果で、変換せずに渡すことも試みました。

私が実行すべきより適切な変換はありますか? 私は少しC n00bなので、これが本当に素朴な質問であれば申し訳ありません.

4

1 に答える 1

4

Python と C の両方で、16 進リテラルを使用して整数を定義できます。これらは base-16 として解釈されますが、は依然として整数です。これは、同じ値の代替表記にすぎません。

>>> 0x02
2
>>> 0x104
260
>>> import ctypes
>>> ctypes.c_int(0x104)
c_int(260)

8 進数 ( 0o404、または Python 2 のみ0404) または 2 進数 ( 0b100000100) 表記を使用して、同じ整数値を指定することもできます。

署名は が必要であることを指定しているintため、整数値を渡します。必要に応じて、Python ソース コードでその整数値を 16 進リテラルとして指定しますが、C コードは整数値を期待するだけであり、16 進表記を使用してその値を作成したかどうかは気にしません。

関数呼び出しが正しい定数で機能しない場合は、別の何かが間違っています。

于 2013-05-24T23:51:21.283 に答える