#python #ctypes
#python #ctypes
Вопрос:
Я столкнулся с проблемой при реализации с ctypes. У меня есть 2 функции C:
antichain** decompose_antichain(antichain*, int, char (*)(void*, void*), void** (*)(void*));
counting_function** decompose_counting_function(counting_function*);
где antichain и counting_function — это две структуры. Антицепь можно рассматривать как набор, содержащий элементы неизвестного типа (в данном примере counting_function). Функция decompose_antichain принимает в качестве аргумента (среди прочего) функцию, которую нужно использовать для разложения элементов, содержащихся в антицепи (-> функция, прототипом которой является void** (*) (void*)).
Теперь я хотел бы использовать decompose_antichain из Python. Я использовал ctypes:
lib = cdll.LoadLibrary("./mylib.dylib")
#CountingFunction, Antichain and other definitions skipped
DECOMPOSE_COUNTING_FUNCTION_FUNC = CFUNCTYPE(POINTER(c_void_p), POINTER(CountingFunction))
decompose_counting_function_c = lib.decompose_counting_function
decompose_counting_function_c.argtypes = [POINTER(CountingFunction)]
decompose_counting_function_c.restype = POINTER(c_void_p)
decompose_antichain_c = lib.decompose_antichain
decompose_antichain_c.argtypes = [POINTER(Antichain), c_int, DECOMPOSE_COUNTING_FUNCTION_FUNC, COMPARE_COUNTING_FUNCTIONS_FUNC]
decompose_antichain_c.restype = POINTER(POINTER(Antichain))
(...)
antichains_list = decompose_antichain_c(antichain, nb_components, COMPARE_COUNTING_FUNCTIONS_FUNC(compare_counting_functions_c), DECOMPOSE_COUNTING_FUNCTION_FUNC(decompose_counting_function_c))
Последняя строка выдает ошибку: недопустимый тип результата для функции обратного вызова.
Я не вижу, откуда возникла проблема. Кто-нибудь может мне помочь? Спасибо
Ответ №1:
Вам нужно убедиться, что типы argtypes и типы результата совпадают. Похоже, вы поменяли местами типы аргументов decompose_antichain_c. У вас есть DECOMPOSE_COUNTING_FUNCTION_FUNC, COMPARE_COUNTING_FUNCTIONS_FUNC
в argtypes, который не соответствует объявлению функции C, которую вы привели выше. Затем вы пытаетесь вызвать его с помощью COMPARE_COUNTING_FUNCTIONS_FUNC
first и DECOMPOSE_COUNTING_FUNCTION_FUNC
second.
DECOMPOSE_COUNTING_FUNCTION_FUNC
также выглядит неправильно. Вероятно, это должно CFUNCTYPE(POINTER(c_void_p), c_void_p)
быть просто предположением из остальной части кода.
Я могу дать более подробный ответ, если вы предоставите код, который создает COMPARE_COUNTING_FUNCTIONS_FUNC
и CountingFunction