2011-06-01 17 views
8

Tengo un problema al implementar con ctypes. Tengo 2 funciones C:ctypes tipo de resultado no válido para una función de devolución de llamada

antichain** decompose_antichain(antichain*, int, char (*)(void*, void*), void** (*)(void*)); 
counting_function** decompose_counting_function(counting_function*); 

donde antichain y counting_function son dos estructuras. Un antichain se puede ver como un conjunto, que contiene elementos de tipo desconocido (en este ejemplo, función de contar). La función decompose_antichain toma como argumento (entre otras cosas) la función que se utiliza para descomponer los elementos que contiene el antichain (-> una función cuyo prototipo es nulo ** (*) (void *)).

Ahora me gustaría usar decompose_antichain de Python. Usé 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)) 

La última línea produce el error: tipo de resultado no válido para una función de devolución de llamada.

No puedo ver de dónde viene el problema. ¿Alguien puede ayudarme? Gracias

Respuesta

1

Debe asegurarse de que los argipos y los tipos de resultados coincidan. Parece que intercambiaste los tipos de argumento de decompose_antichain_c. Tiene DECOMPOSE_COUNTING_FUNCTION_FUNC, COMPARE_COUNTING_FUNCTIONS_FUNC en los argipos, que no coincide con la declaración de la función C que proporcionó anteriormente. A continuación, intente llamarlo primero con COMPARE_COUNTING_FUNCTIONS_FUNC y luego con DECOMPOSE_COUNTING_FUNCTION_FUNC.

DECOMPOSE_COUNTING_FUNCTION_FUNC también se ve mal. Probablemente debería ser CFUNCTYPE(POINTER(c_void_p), c_void_p) simplemente adivinando del resto del código.

que puedo dar una respuesta más detallada si se proporciona el código que crea COMPARE_COUNTING_FUNCTIONS_FUNC y CountingFunction

Cuestiones relacionadas