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!