構造体をパラメータとして使用する C ライブラリの関数を呼び出そうとしています。どうすればいいですか?ドキュメントで行われているのと同様の構造の Ctypes 表現を作成しましたが、直接渡すとうまくいきません。
例を見つけようとしましたが、見つかったすべての例は構造へのポインターを渡していました。
コードを見ないとわかりませんが、構造をインスタンス化する必要があると思います。ドキュメントから:
from ctypes import *
class POINT(Structure):
_fields_ = [("x", c_int),
("y", c_int)]
point = POINT(10, 20)
最後の行は、point と呼ばれる POINT 構造体のインスタンスを作成します。
構造の定義、使用方法、エラー メッセージを示していただけると非常に助かります。
私はまったく同じ問題を抱えていました。C libxxxx.so ファイルと対応する .h ファイルがあります。それだ。最初の .h ファイルで定義された関数プロトタイプのいくつかは、スタック上の構造体を渡す必要があります。構造体は、2 番目の .h ファイルで定義されます。usb1 Python ライブラリ ラッパーを調べたところ、すべての構造体が関数プロトタイプへのポインターとして渡されます。(ポインターへのポインターとしても使用されるものもあります。)
この構造体のラッパーを作成しました。
typedef struct _SE_ADDR{
int slot; /**< The index of the target slot. */
int fpga; /**< The index of the target FPGA. */
int reg; /**< The index of the target register. */
} SE_ADDR;
Python ラッパー モジュールで、この構造体を表すクラスを作成しました。
class SE_ADDR(Structure):
_fields_ = [('slot', c_int),
('fpga', c_int),
('reg', c_int)]
SE_ADDR_p = POINTER(SE_ADDR) #Pointer to SE_ADDR required for se_waitForData_new
次に、ラッパーをインポートした後、上記の @picomancer の方法で使用しました。
addr = wrapper.SE_ADDR(0,0,0)
これはうまくいくようです。