光学設計とその周辺、そしてたまに全く関係ないやつ

学んだことを書き留めていきたいと思いますが、ありふれたことを書いても人類の進歩に貢献しないので、専門的な事柄をメインにしたいと思います。なお私の専門とは光学設計とか画像処理とかです。

pythonからC++で作ったdllを読み出すときに戻り値がおかしい

きっかけは以下の内容を参考に自分でもちょっと似たようなことをやろうとしたときである
qiita.com

具体的には以下のようなdoubleを返す関数GetDataを定義したのだが、その戻り値をpythonで表示させるとなぜか変な値になる、、、

Cpp_to_python.cpp

double GetData(int a, int b)
{
    return (a + b)/13;
}


失敗
test.py

lib = windll.LoadLibrary("Cpp_to_python.dll")
GetData=dll.GetData
print(dll.GetData(10, 50)) #


結論を言うと以下のように書くとうまくいく。ちゃんと戻り値の型を指定してあげる。引数もdoubleの場合は、c_doubleとしてあげる。
test.py

lib = windll.LoadLibrary("Cpp_to_python.dll")
GetData=dll.GetData
GetData.argtypes=[c_int,c_int]
GetData.restype = c_double

print(dll.GetData(10, 50)) #

元々の例ではうまくいったのはintがデフォルトなのかなと思ったが、確かに以下のドキュメントにそう書いてある。
docs.python.org

以上、まったく大した内容ではなかった