Ctypes pass float в функцию возвращает случайные числа

1

Чтобы дать некоторый фон, я использую linux, и у меня есть код C следующим образом:

int c_func(const char* dir, float a, float b, float c, float d )
{
    printf("%s\n", dir);
    printf("%f\n",a);
    printf("%f\n",b);
    printf("%f\n",c);
    printf("%f\n",d);

    return 0;
}

Это простая функция, которая принимает строку и 4 поплавки в качестве аргументов и выводит их, поскольку я пытаюсь проверить свой интерфейс phython/C. Мой код python выглядит следующим образом:

calling_function = ctypes.CDLL("/home/ruven/Documents/Sonar/C interface/Interface.so")
calling_function.c_func.argtypes = [ctypes.c_char_p, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float]
calling_function.c_func.restype =  ctypes.c_float

for _fv in _testFV:
                _predOut = calling_function.c_func("hello",_fv[0], _fv[1], _fv[2], _fv[3])
                exit(1)

Чтобы уточнить, _fv[0], _fv[1], _fv[2], _fv[3] являются [1.969591, 112.7779, 1.8701470000000002, 111.7575] соответственно. И _testFV - это список из 117 других списков. Я просто хочу извлечь первый список из _testFV.

После запуска этого кода я могу правильно напечатать строку, но поплавки кажутся большими случайными числами (1849375168, 3, 4805786, 9397952) вместо фактических значений _fv[0], _fv[1], _fv[2], _fv[3]. Поэтому, чтобы проверить, передаю ли я правильные значения функции calling_function.c_func, я включил инструкцию печати для печати значений _fv[0], _fv[1], _fv[2], _fv[3] и их типов. Я проверил, и значения являются поплавками, и в функцию вводятся правильные цифры, но распечатываются случайные числа. Я думал, что я мог бы неправильно описать повтор, но я думал, что restype должен быть объявлен как int, так как код C возвращает 0.

Вопрос 1: Почему функция распечатывает случайные числа вместо поплавков, которые я вводил в функцию.

Вопрос 2: Предполагается, что функция напечатает 1 строку и 4 поплавки, поэтому я должен объявить restype как 1 строку и 4 поплавки?

Вещи, которые я пробовал:

  1. Изменение всех переменных float в double.

  2. Изменение restype для int и double.

  3. Изменение аргументов функции calling_function.c_func в python ("hello",1,2,3,4) а функция в python может печатать правильные значения. Когда я меняю аргументы на ("привет", 1,2,2,3,3,4,4,3), он снова дает случайные числа. Я считаю, что есть определенное объявление типа, которое я сделал неправильно, но я не уверен, что.

  4. Изменение строки restype на calling_function.c_func.restype = [ctypes.c_char_p, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float] но это дает следующую ошибку: TypeError: restype должен быть типом, вызываемым или Никто.

Я не совсем уверен, что происходит. Любая помощь приветствуется. Спасибо!

Теги:
python-2.7
ctypes
typeerror

1 ответ

0
Лучший ответ

Использование c_float для argtypes и c_int для restype работает для меня:

foo.c:

int
foo(const char* dir, float a, float b, float c, float d )
{
    printf("%s\n", dir);
    printf("%f\n", a);
    printf("%f\n", b);
    printf("%f\n", c);
    printf("%f\n", d);

    return 0;
}

С Python 2.7:

>>> f = ctypes.CDLL('./foo.so')
>>> f.foo.argtypes = [ctypes.c_char_p, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float]
>>> f.foo.restype = ctypes.c_int
>>> f.foo('hello', 1.0, 1.1, 1.2, 1.3)
hello
1.000000
1.100000
1.200000
1.300000
0
>>>
  • 0
    Я только что понял, что есть проблема с моим компьютером, и что он не сохраняет файлы C. Мне удалось решить эту проблему, и теперь я могу запустить программу. Я не могу удалить этот вопрос, так как stackoverflow дал мне предупреждение об удалении ответов на вопросы. Спасибо, что нашли время ответить на мой вопрос.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню