Ctypes を介して Python から呼び出すと、C 関数が間違った値を返す
Ctypes を使用して Python から C 関数を呼び出そうとすると、不一致が発生します予想通りの結果が現れました。問題の関数は、指定された数値を指定されたべき乗に引き上げ、C で直接呼び出すと期待どおりの結果を返しました。しかし、Python 内から呼び出すと、異なる間違った値が取得されました。
共有ファイルC 関数のハウジングは、次のコマンドを使用して生成されました。
$ gcc -fPIC -shared -o test.so test.c
C 関数の構成をいくつか並べ替えると、一部のインスタンスでは期待値が実際に返されました。この問題は C コードの固有の欠陥から生じたものではないということです。特に、単純な二乗を計算するように関数が簡略化された場合 (つまり、for ループを使用する代わりに x*x を返す)、Python は正しい結果を返しました。
最終的な目標は、2 次元の C にアクセスすることでした。 Python 内からの配列。
#include <stdio.h> float power(float x, int exponent) { float val = x; for(int i=1; i<exponent; i++){ val = val*x; } return val; }
from ctypes import * so_file = '/Users/.../test.so' functions = CDLL(so_file) functions.power.argtype = [c_float, c_int] functions.power.restype = c_float print(functions.power(5,3))
C から関数を呼び出すと、予想される出力 125.0 が観察されました。ただし、Python では代わりに 0.0 の値が返されました。
さらに調査した結果、この不一致は、Python 内で C 関数の引数の型を指定する際のエラーであることが判明しました。 argtype の代わりに、argtypes の間違ったスペルが誤って使用されました。
functions.power.argtypes = [c_float, c_int]
このタイプミスが修正されると、Python から関数を呼び出すときに正しい値 (125.0) が正常に返されるようになりました。
以上がctypes を使用して Python から呼び出すと、C 関数が間違った値を返すのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。