Чтобы дать некоторое представление, я использую 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
, я включил оператор print для вывода значения _fv[0], _fv[1], _fv[2], _fv[3]
и их типов. Я проверил, и значения являются числами с плавающей точкой, и правильные числа вводятся в функцию, но случайные числа выводятся на печать. Я подумал, что мог неправильно объявить restype, но подумал, что restype должен быть объявлен как int, так как код C возвращает 0.
Вопрос 1: Почему функция печатает случайные числа вместо чисел, которые я ввожу в функцию.
Вопрос 2: функция должна выводить 1 строку и 4 числа с плавающей запятой, поэтому я должен объявить restype как 1 строку и 4 числа с плавающей запятой?
Вещи, которые я пробовал:
Изменение всех переменных с плавающей запятой на удвоение.
Изменение restype на int и double.
Изменение аргументов calling_function.c_func
в python на ("hello",1,2,3,4)
, и функция в python способна выводить правильные значения. Когда я изменяю аргументы на ("привет", 1.2,2.3,3.4,4.3), это снова дает мне случайные числа. Я считаю, что есть какое-то объявление типа, которое я сделал неправильно, но я не уверен, что.
Изменение строки restype на calling_function.c_func.restype = [ctypes.c_char_p, ctypes.c_float, ctypes.c_float, ctypes.c_float, ctypes.c_float]
, но это приводит к следующей ошибке: TypeError: restype должен быть типа, вызываемого или None.
Я не совсем уверен, что происходит. Любая помощь приветствуется. Спасибо!