1

サードパーティの DLL から関数をロードしました。経由でライブラリのエントリ ポイントである関数にアクセスできましたctypes.windll.LoadLibrary。この関数には、多くの 2 次元配列を含む 30 個のパラメーターがあります。関数プロトタイプは、ほとんどの場合、パラメーターが参照によって渡されることを指定します。関数呼び出しを行うと、内部変数に問題があることを示すリターン コードが返されます。これにより、間違ったポインタを渡したように思えます。(あいまいです。)私の質問は、どのような状況でctypes.byref参照として渡す必要があるかです。たとえば、次のものがあるとします。

double_matrix = (ctypes.c_double * 100) * 100
my_array = double_matrix()

my_array または ctypes.byref(my_array) を渡す必要がありますか?

my_string = ctypes.create_string_buffer("Hello world!")

types.create_string_buffer() を使用して作成されたオブジェクトはどうですか? 参照渡しが必要な場合、my_string または ctypes.byref(my_string) を渡す必要がありますか?

編集:

DLL のコードがありません。

関数プロトタイプは、各タイプが約 5 つか 6 つあることを除いて、基本的にこのように見えます。

int process(char *input, int indicator, double (*dmatrix)[100][100], int (*groups)[100]);

ありがとう

4

1 に答える 1

0

通常、プロトタイプが次のようになっているとします。

int process(char *input, int indicator, double (*dmatrix)[100][100], int (*groups)[100]);

次に、次のことを試す価値があると一般的に考えることができます

次のようにパラメーターを渡します。 参照による入力 値によるインジケーター 参照による dmatrix 参照によるグループ

一般的に言えば、プロトタイプが ac 関数であり、Python の ctypes を参照していると仮定します。プロセス関数は、入力、dmatrix、およびグループのパラメーターのアドレス参照を渡すことを期待しています。一方、標識変数は直接値として渡されます。パラメーターが参照によって渡される場合、一般に、受信関数が値を変更できることを意味し、どのような変更が行われたとしても、呼び出し元は変更を直接分析できます (両方が同じ特定のアドレス空間を共有しているため)。

30 個のパラメーターを何度も渡す必要がある場合は、関数のターゲット パラメーター リストの構造に適合する構造にすべてをパックするブリッジ関数を考え出し、単純に関数を呼び出します。次に、ブリッジ関数の途中で結果 (ある場合) をアンパックします。

もちろん、これはある程度の推測であるため、一部は火の試練です...

于 2013-12-12T15:17:25.173 に答える