このトピックに関するすべての質問/回答を読み込もうとしましたが、何もできませんでした。私がしようとしているのは、共有オブジェクトに構造体を送り、それを返してアクセス可能にすることだけです。Ctypes:返されたポインタを構造体にマッピングする
私は構造体を作成できました。これは共有オブジェクトにうまく伝えることができます。構造体から特定の値を返すとうまくいくので、私はこれを知っています。 Pythonで構造体の定義は、以下に見られることができます。
class ROW(ctypes.Structure):
_fields_ = [("Address",ctypes.c_int16),
("FirstRegister",ctypes.c_int16),
("NumberOfRegisters",ctypes.c_int16),
("Sampling", ctypes.c_int16)]
class CONNECTOR(ctypes.Structure):
_fields_ = [("NumberOfRows", ctypes.c_int16),
("Rows", ROW * 200)]
# Initialise an array of connectors (CON1, CON2, CON11, CON12)
ConArray = CONNECTOR * 4
con = ConArray()
# Initialise an array of ROW struct
RowArray = ROW * 200
row = RowArray()
は、私は、SQLiteのデータベースからデータを持つ構造体を移入し、使用して特定のデータにアクセスすることができcon[n].Rows[m].Address
など
私は現在、1つだけ送信しようとしていますコネクタを一度に使用し、まったく同じ構造体を返します。
関連するコードは、以下に見られることができます。
testlib = ctypes.cdll.LoadLibrary('_example.so')
x = testlib.square_array
x.argtype = ctypes.POINTER(CONNECTOR)
x.restype = ctypes.POINTER(CONNECTOR)
y = x(ctypes.byref(con[0]))
私は関数を呼び出し、多くの異なる方法を試してみましたが、この1つは最も有望であると思われます。問題は、y.Rows[0].Address[0]
で特定の値にアクセスしようとすると、エラーが発生します:AttributeError: 'LP_CONNECTOR' object has no attribute 'Rows'
。
代わりにした場合、私は直接関数を呼び出す:35664848
:
x = testlib.square_array(ctypes.byref(con[0]))
は、私はメモリアドレス、例えばを表し仮定int
を受けます。
私はあらゆる種類のオプションを試しましたが、私はCには全く慣れていません(同僚はコードのC側すべてを扱います)。提案されたソリューションはありますか?私はちょうど1つの小さなものが欠けているように感じますが、この点に到達するだけで何日もかかりました。
更新:追加されたCコードは
Cコードは、見ることができる。
はexample.c:
#include "example.h"
CONNECTOR* square_array(CONNECTOR* con)
{
printf("Value of Row 0 Address%i\n",con->Rows[0].Address);
return (con);
}
example.h:
struct ROW;
struct CONNECTOR;
typedef struct {
short int Address;
short int FirstRegister;
short int NumberOfRegisters;
short int Sampling;
}ROW;
typedef struct {
short int NumberOfRows;
ROW Rows[200];
}CONNECTOR;
CONNECTOR Connectors[4];
'square_array'関数の宣言はどのように見えますか? – CristiFati
申し訳ありませんが、私はそれを含めるために私の質問を更新しました。私たちが見つけた先の例を編集したので、これは 'square_array'と呼ばれます。それは最終的な名前ではありません。 'printf()'ステートメントは、特定の値にアクセスしているときに正しい結果を出力します。しかし、私は返された構造全体をどうすればよいか分かりません。 –