首頁 > 後端開發 > Python教學 > 為什麼使用 ctypes 從 Python 呼叫我的 C 函數時傳回不正確的值?

為什麼使用 ctypes 從 Python 呼叫我的 C 函數時傳回不正確的值?

Mary-Kate Olsen
發布: 2024-12-24 20:50:14
原創
586 人瀏覽過

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 程式碼中的固有缺陷。值得注意的是,當函數被簡化為計算一個簡單的平方(即傳回 x*x 而不是使用 for 迴圈)時,Python 傳回了正確的結果。

最終目標是存取二維 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,而不是 argtype。

functions.power.argtypes = [c_float, c_int]
登入後複製

修正此拼字錯誤後,從 Python 呼叫函數時成功傳回正確的值 (125.0)。

以上是為什麼使用 ctypes 從 Python 呼叫我的 C 函數時傳回不正確的值?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板