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
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; }
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))
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]
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!