ctypes 回调函数的无效返回类型

8 投票
1 回答
1146 浏览
提问于 2025-04-16 18:45

我在用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_FUNCCOMPARE_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_FUNCCountingFunction的代码,我可以给你更详细的解答。

撰写回答