2009-08-25 4 views
4

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 

Répondre

4

Looks comme vous voulez the cast function:

La fonction cast peut être utilisée pour transformer une instance ctypes en un pointeur vers un type de données ctypes différent. cast prend deux paramètres, un objet ctypes qui est ou peut être converti en un pointeur quelconque, et un type de pointeur ctypes. Elle retourne une instance du second argument, qui fait référence au même bloc de mémoire comme premier argument:

>>> a = (c_byte * 4)() 
>>> a 
<__main__.c_byte_Array_4 object at 0xb7da2df4> 
>>> cast(a, POINTER(c_int)) 
<ctypes.LP_c_long object at ...> 
>>> 
+0

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. –

Questions connexes