Actuellement, je suis en train de déplacer un goulot d'étranglement de performance dans mon code python vers c, pour étudier les effets de performance. Ce code exécutera une simulation et rapportera les résultats à python via ctypes. Cependant, j'ai des problèmes pour faire correspondre mes types correctement.Mutation d'un tableau d'entiers utilisant ctypes
Bien que je cherche à résoudre ce problème particulier, je suis également à la recherche de conseils plus généraux sur le travail avec ctypes, car la documentation et la procédure semble un peu mince.
je la fonction c suivante:
extern "C" {
void f(int* array, int arraylen) {
for(int i = 0; i < arraylen; i++) {
array[i] = g() // mutate the value array[i];
}
}
}
Et le code suivant en python:
import ctypes
plib = ctypes.cdll.LoadLibrary('./mylib.so')
_f = plib.f
_f.restype = None
_f.argtypes = [ ctypes.POINTER(ctypes.c_int), ctypes.c_int ]
seqlen = 50
buffer = ctypes.c_int * seqlen
_f(buffer, seqlen)
Cependant, cet extrait meurt avec le retraçage suivant:
Traceback (most recent call last):
File "particle.py", line 9, in <module>
_f(buffer, seqlen)
ctypes.ArgumentError: argument 1: <type 'exceptions.TypeError'>: expected LP_c_int instance instead of _ctypes.ArrayType
Merci Mark, votre extrait me suffisait de savoir quel était le problème, je l'avais oublié de la parenthèses de mon instanciation de tableau, qui avait déclenché l'incompatibilité de type. –