3

構造体をパラメータとして使用する C ライブラリの関数を呼び出そうとしています。どうすればいいですか?ドキュメントで行われているのと同様の構造の Ctypes 表現を作成しましたが、直接渡すとうまくいきません。

例を見つけようとしましたが、見つかったすべての例は構造へのポインターを渡していました。

4

2 に答える 2

3

コードを見ないとわかりませんが、構造をインスタンス化する必要があると思います。ドキュメントから:

from ctypes import *

class POINT(Structure):
    _fields_ = [("x", c_int),
                ("y", c_int)]

point = POINT(10, 20)

最後の行は、point と呼ばれる POINT 構造体のインスタンスを作成します。

構造の定義、使用方法、エラー メッセージを示していただけると非常に助かります。

于 2013-03-26T21:53:10.183 に答える
3

私はまったく同じ問題を抱えていました。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)

これはうまくいくようです。

于 2013-05-23T04:41:21.513 に答える