#python #python-c-extension
#python #python-c-extension
Вопрос:
Я вызываю pow()
функцию математической библиотеки C. Моя установка — Python3.5 в Windows 10, но я попробовал ту же программу в Python2.7 с тем же результатом. Возврат из функции не соответствует ожиданиям. Не уверен, что происходит. Код приведен ниже. Результат, который я получаю, равен 1.0.
from ctypes import *
libc = cdll.msvcrt
libc.pow.argtypes = [c_double, c_int]
libc.pow.restype = c_double
libc.pow(2.3, 2)
Ответ №1:
Дважды проверьте свои типы, я почти уверен, что прототип для pow
двойной pow(двойной a, двойной b);
Так что изменяет эту строку
libc.pow.argtypes = [c_double, c_int]
Для
libc.pow.argtypes = [c_double, c_double]
Всякий раз, когда вы вызываете функции c из python, всегда проверяйте правильность типов, которые вы вводите из python, не полагайтесь на приведение, как в c / c
Комментарии:
1. Это правильно. Похоже на ошибку интерфейса. Он должен перехватить это как неправильный тип аргумента, а не возвращать неправильный результат.
Ответ №2:
Существует несоответствие типов. Также используйте c_double для power. Вот так. Это должно сработать.
libc.pow.argtypes = [c_double, c_double]
Комментарии:
1. IIRC, ваше добавление «также» является излишним.
2. @Hurkyl Спасибо. Отредактировано.
Ответ №3:
pow в C libray принимает double, double в качестве входных аргументов. Вот почему.
from ctypes import *
libc = cdll.msvcrt
libc.pow.argtypes = [c_double, c_double]
libc.pow.restype = c_double
libc.pow(2.3, 2.0)