web-dev-qa-db-fra.com

Pointeurs et tableaux dans les types Python

J'ai un DLL contenant une fonction C avec un prototype comme celui-ci:

int c_read_block(uint32 addr, uint32 *buf, uint32 num);

Je veux l'appeler de Python en utilisant ctypes. La fonction attend un pointeur sur une partie de la mémoire dans laquelle elle écrira les résultats. Je ne sais pas comment construire et transmettre une telle quantité de mémoire. La documentation de ctypes n'est pas d'une grande aide.

Construire un tableau et le passer "byref", comme ceci:

 cresult = (c_ulong * num) () 
 err = self.c_read_block (addr, byref (cresult), num) 

Donne ce message d'erreur:

ArgumentError: argument 3: <type 'exceptions.TypeError'>: expected LP_c_ulong instance instead of pointer to c_ulong_Array_2

J'imagine que c'est parce que le tableau ulth Python ne ressemble en rien à un tableau c uint32. Devrais-je utiliser create_char_string. Si c'est le cas, comment persuader Python de "convertir" ce tampon en LP_c_ulong?

35
Andrew Bainbridge

Vous pouvez lancer avec le cast function :)

>>> import ctypes
>>> x = (ctypes.c_ulong*5)()
>>> x
<__main__.c_ulong_Array_5 object at 0x00C2DB20>
>>> ctypes.cast(x, ctypes.POINTER(ctypes.c_ulong))
<__main__.LP_c_ulong object at 0x0119FD00>
>>> 
52
Mark Rushakoff

Vous pouvez convertir le résultat, mais ctypes vous permet d'utiliser directement un tableau à la place d'un pointeur. Le problème est la byref dans votre code (ce qui serait l'équivalent d'un pointeur sur un pointeur):

Donc au lieu de:

cresult = (c_ulong * num)()
err = self.c_read_block(addr, byref(cresult), num)

essayer:

cresult = (c_ulong * num)()
err = self.c_read_block(addr, cresult, num)
0
ephemer