ctypes недопустимый тип результата для функции обратного вызова

#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