ctypes 回调函数的无效返回类型
我在用ctypes实现的时候遇到了一个问题。我有两个C语言的函数:
antichain** decompose_antichain(antichain*, int, char (*)(void*, void*), void** (*)(void*));
counting_function** decompose_counting_function(counting_function*);
这里的antichain和counting_function是两个结构体。antichain可以看作是一个集合,里面包含了类型不确定的元素(在这个例子中是counting_function)。decompose_antichain这个函数的参数之一就是用来分解antichain里面元素的函数(它的原型是void** (*) (void*))。
现在我想在Python中使用decompose_antichain。我用了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 个回答
1
你需要确保参数类型和返回类型是匹配的。看起来你把decompose_antichain_c
的参数类型搞混了。你在参数类型中用了DECOMPOSE_COUNTING_FUNCTION_FUNC
和COMPARE_COUNTING_FUNCTIONS_FUNC
,这和你上面给出的C函数声明不一致。然后你试着先用COMPARE_COUNTING_FUNCTIONS_FUNC
,再用DECOMPOSE_COUNTING_FUNCTION_FUNC
来调用它。
DECOMPOSE_COUNTING_FUNCTION_FUNC
看起来也不对。根据其他代码的推测,它可能应该是CFUNCTYPE(POINTER(c_void_p), c_void_p)
。
如果你提供创建COMPARE_COUNTING_FUNCTIONS_FUNC
和CountingFunction
的代码,我可以给你更详细的解答。