Проблема здесь в том, что функция определена как
double __cdecl add(int len, double array[]) { }
Однако, если вы не укажете тип возвращаемого значения для нее, ctypes по умолчанию будет int
.Это аналогично объявлению функции в C как
int __cdecl add(int len, double array[]);
Поскольку объявление и определение не совпадают, ваш код имеет неопределенное поведение , то есть:
- Функция определяется с типом, который не совместим с типом (выражения), на который указывает выражение, обозначающее вызываемую функцию (6.5.2.2).
Inв этом конкретном случае вы работаете в архитектуре, где целочисленные значения и значения с плавающей запятой возвращаются в регистрах;однако возвращаемые значения int
и double
хранятся в различных регистрах.Теперь регистр, который содержит возвращаемое значение типа int
в этом ABI, содержит N
в качестве остатка.Правильное возвращаемое значение содержалось в регистре с плавающей запятой, однако оно никогда не использовалось, поскольку ctypes ожидал получить int
.
Таким образом, правильное исправление - это
dll.add.restype = c_double