9

私は一見単純な問題に苦労しています。Python コードから呼び出す必要があるさまざまな C 関数があります。現在、ctypes を使用してこれを実行しようとしています。既存のコードの大部分を変更する前に、すべてが意図したとおりに機能することを確認するために使用している単純な実装例に問題があります。C 関数は、いくつかのパラメーターを取り、さまざまな数学的計算を行ってから、double 値を返します。これは、私がテストとして使用している C ファイルです。

#include "Python.h"

double eval(double* args, int length, double* rands, int randLength, int debug)
{
    double val1 = args[0];
    double val2 = rands[0];
    double ret = val1 + val2;
    return ret;
}

私の実際のテスト関数では、値を受け取っていることを確認するためにval1val2を出力しています。その点ではすべて問題ありません。この関数を呼び出す Python は次のとおりです。

test = ctypes.CDLL("/home/mjjoyce/Dev/C2M2L/AquaticWavesModel.so")
rand = Random();

args = [2]
argsArr = (ctypes.c_double * len(args))()
argsArr[:] = args

argsRand = [rand.random()]
argsRandArr = (ctypes.c_double * len(argsRand))()
rgsRandArr[:] = argsRand

result = test.eval(argsArr, len(argsArr), argsRandArr, len(argsRandArr), 0)
print "result", result

これが返された結果を出力するとき、通常は大きな負の数をダンプします。Python が値を処理できるようになる前に、何らかの変換を行う必要があると思いますが、私の人生ではその答えを見つけることができません。私は永遠に検索してきましたが、明らかな情報を見逃しているのか、間違った情報を検索しているのかはわかりません.

また、関数の戻り値の型を int に変更すると、計算が正しくなり、期待どおりに int が返されて出力されます。double に設定すると、C コードでの計算は正しくなります (チェックするために出力します) が、Python は返された結果を好みません。

私が見逃しているアイデアはありますか?

4

1 に答える 1

16

argtypesおよびrestypeメンバーを使用して、Python で関数の引数の型と戻り値の型を設定する必要があります。

test.eval.argtypes = [ctypes.POINTER(ctypes.c_double),
                      ctypes.c_int,
                      ctypes.POINTER(ctypes.c_double),
                      ctypes.c_int,
                      ctypes.c_int]
test.eval.restype = ctypes.c_double

次に、行っているように呼び出すことができます(ctypes.c_double * length)。値で初期化された型の配列を構築resultすると、double.

このctypes tutorialも参照してください。役立つ情報がたくさんあります。

于 2012-08-03T21:04:44.573 に答える