2012-08-03 13 views
7

単純な問題のように思えます。 Pythonコードから呼び出す必要のあるさまざまなC関数があります。現在、私はctypesを通してこれをやろうとしています。私は、既存のコードの大きな断片を変更する前に、すべてが意図どおりに動作するようにするために使用している簡単なサンプル実装の問題があります。 C関数はいくつかのパラメータをとり、さまざまな数学的計算を行い、次にdouble値を返します。これは私がテストとして使用しているCファイルです。私の実際のテスト機能でPythonから呼び出された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; 
} 

は、私は、彼らが値を受信して​​いることを確認するために val1ととval2を印刷しています。その目的のためにすべてが大丈夫です。この関数を呼び出す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が返され、期待どおりに出力されます。私はそれを倍に設定すると、計算はCコードで正しいです(私はそれらをチェックするために印刷します)が、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)の配列を構築するあなたが関数の引数の型を設定し、argtypesrestypeメンバーを使用してPythonで型を返す必要があり

答えて

9

resultdoubleとなります。

また、このctypes tutorialも参照してください。これには多くの有用な情報があります。

+0

ソリューションとリンクをありがとうございました。チュートリアルはまさに私が探していたものです! – lively

関連する問題