Rumah >pembangunan bahagian belakang >Tutorial Python >Mengapa Fungsi C Saya Mengembalikan Nilai Yang Salah Apabila Dipanggil dari Python Menggunakan ctypes?

Mengapa Fungsi C Saya Mengembalikan Nilai Yang Salah Apabila Dipanggil dari Python Menggunakan ctypes?

Mary-Kate Olsen
Mary-Kate Olsenasal
2024-12-24 20:50:14601semak imbas

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

Fungsi C Mengembalikan Nilai Salah Apabila Dipanggil daripada Python melalui Ctypes

Dalam percubaan untuk menggunakan fungsi C daripada Python menggunakan Ctypes, ketidakpadanan dalam hasil yang diharapkan muncul. Fungsi yang dipersoalkan menaikkan nombor yang diberikan kepada kuasa tertentu, mengembalikan hasil seperti yang dijangkakan apabila dipanggil terus dalam C. Walau bagaimanapun, apabila menggunakan nombor tersebut dari dalam Python, nilai yang berbeza dan tidak betul telah diperoleh.

Fail kongsi menempatkan fungsi C dihasilkan menggunakan arahan:

$ gcc -fPIC -shared -o test.so test.c

Berikutan beberapa pilih atur konfigurasi fungsi C, nilai yang dijangkakan telah dikembalikan dalam beberapa keadaan, menunjukkan bahawa isu itu tidak berpunca daripada kecacatan yang wujud dalam kod C. Terutama, apabila fungsi itu dipermudahkan untuk mengira segi empat sama mudah (iaitu, kembalikan xx dan bukannya menggunakan gelung for), Python mengembalikan hasil yang betul.

Matlamat utama adalah untuk mengakses C dua dimensi tatasusunan dari dalam 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))

Apabila memanggil fungsi dari C, output jangkaan 125.0 diperhatikan. Walau bagaimanapun, Python menghasilkan nilai 0.0 sebaliknya.

Setelah penyiasatan lanjut, percanggahan itu dikesan kepada ralat dalam menentukan jenis hujah fungsi C dalam Python. Daripada argtype, ejaan argtype yang salah telah digunakan secara tidak sengaja.

functions.power.argtypes = [c_float, c_int]

Setelah kesilapan menaip ini diperbetulkan, nilai yang betul (125.0) telah berjaya dikembalikan apabila memanggil fungsi daripada Python.

Atas ialah kandungan terperinci Mengapa Fungsi C Saya Mengembalikan Nilai Yang Salah Apabila Dipanggil dari Python Menggunakan ctypes?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn