ホームページ > バックエンド開発 > Python チュートリアル > ctypes を使用して Python から呼び出すと、C 関数が間違った値を返すのはなぜですか?

ctypes を使用して Python から呼び出すと、C 関数が間違った値を返すのはなぜですか?

Mary-Kate Olsen
リリース: 2024-12-24 20:50:14
オリジナル
590 人が閲覧しました

Why Does My C Function Return an Incorrect Value When Called from Python Using ctypes?

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート