Le problème ici est que la fonction est définie comme suit
double __cdecl add(int len, double array[]) { }
Cependant, à moins que vous ne spécifiez le type de valeur de retour, ctypes prend par défaut la valeur suivante int
. Cela revient à déclarer la fonction en C comme suit
int __cdecl add(int len, double array[]);
Parce que la déclaration et la définition ne correspondent pas, votre code a comportement indéfini c'est-à-dire :
- Une fonction est définie avec un type qui n'est pas compatible avec le type (de l'expression) pointé par l'expression qui dénote la fonction appelée (6.5.2.2).
Dans ce cas précis, vous travaillez sur une architecture où les valeurs entières et à virgule flottante sont renvoyées dans des registres. int
y double
Les valeurs de retour sont stockées dans différents registres. Maintenant, le registre qui contient la valeur de retour de type int
dans cette ABI se trouve contenir le N
comme un reliquat. La valeur de retour correcte était contenue dans un registre à virgule flottante, mais elle n'a jamais été utilisée, car ctypes s'attendait à obtenir une valeur int
.
La solution correcte est donc de faire
dll.add.restype = c_double