Maison > développement back-end > Tutoriel Python > Pourquoi ma fonction C renvoie-t-elle une valeur incorrecte lorsqu'elle est appelée depuis Python à l'aide de ctypes ?

Pourquoi ma fonction C renvoie-t-elle une valeur incorrecte lorsqu'elle est appelée depuis Python à l'aide de ctypes ?

Mary-Kate Olsen
Libérer: 2024-12-24 20:50:14
original
586 Les gens l'ont consulté

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

Fonction C renvoyant une valeur incorrecte lorsqu'elle est appelée depuis Python via Ctypes

Dans une tentative d'invocation d'une fonction C depuis Python en utilisant Ctypes, une incompatibilité dans le résultat attendu est apparu. La fonction en question a élevé un nombre donné à une puissance spécifiée, renvoyant le résultat comme prévu lorsqu'elle est appelée directement en C. Cependant, lors de son appel depuis Python, une valeur différente et incorrecte a été obtenue.

Le fichier partagé abritant la fonction C a été produit à l'aide de la commande :

$ gcc -fPIC -shared -o test.so test.c
Copier après la connexion

Suite à quelques permutations de la configuration de la fonction C, la valeur attendue a effectivement été renvoyée dans certains cas, indiquant que le problème ne provenait pas de une faille inhérente au code C. Notamment, lorsque la fonction a été simplifiée pour calculer un carré simple (c'est-à-dire renvoyer x*x au lieu d'utiliser une boucle for), Python a renvoyé le résultat correct.

Le but ultime était d'accéder à un C bidimensionnel. tableau depuis 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;
}
Copier après la connexion
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))
Copier après la connexion

Lors de l'appel de la fonction depuis C, la sortie attendue de 125,0 a été observée. Cependant, Python a donné une valeur de 0,0 à la place.

Après une enquête plus approfondie, l'écart a été attribué à une erreur dans la spécification des types d'arguments de la fonction C dans Python. Au lieu de argtype, l'orthographe incorrecte de argtypes a été utilisée par inadvertance.

functions.power.argtypes = [c_float, c_int]
Copier après la connexion

Une fois cette faute de frappe corrigée, la valeur correcte (125.0) a été renvoyée avec succès lors de l'appel de la fonction depuis Python.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal