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
Lepaskan: 2024-12-24 20:50:14
asal
589 orang telah melayarinya

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
Salin selepas log masuk

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;
}
Salin selepas log masuk
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))
Salin selepas log masuk

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]
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
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
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan