Retourner un array avec ctypes
Salut à tous !
J'essaie de faire une bibliothèque en C et d'y accéder depuis Python. J'ai choisi d'utiliser ctypes.
Le problème, c'est que je souhaite retourner un Array, mais je n'y arrive pas. Voici mon code :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
| /* Fichier: bidule.c */
#include <stdio.h>
/*---------------------------------------------------------------------------*/
long *toto(int n) {
int i;
long img[n*n];
for (i=0; i<n*n; i++) {
img[i] = i;
};
return img; /*&img[0][0];*/
}
/*---------------------------------------------------------------------------*/
int tata(int n) {
int i;
long *t = toto(n);
for (i=0; i<n*n; i++) {
printf("%ld ", t[i]);
};
printf("\n-----\n");
return n;
}
/*---------------------------------------------------------------------------*/ |
que je compile avec :
Code:
1 2
| gcc -shared -Wl,-soname,bidule.so.1 -o bidule.so bidule.o
gcc -Wall -fPIC -c bidule.c |
Mon code python est le suivant :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14
|
from ctypes import cdll, c_int, c_long, c_double
mylib = cdll.LoadLibrary("bidule.so")
dim = 3
mylib.tata.argtypes = [c_int]
x = mylib.tata(dim)
mylib.toto.argtypes = [c_int]
mylib.toto.restype = c_long * (dim**2)
x = mylib.toto(dim)
print type(x)
print [_ for _ in x] |
Le résultat est :
Code:
1 2 3 4
| 0 1 2 3 4 5 6 7 8
-----
<class '__main__.c_long_Array_9'>
[-1075527424, 148238472, 0, -1208711504, 8191, 0, 148518376, -1208037388, -1207760664] |
La 1ère ligne est renvoyée par la fonction "tata" et la dernière par python. Normalement, ça aurait du être [0,1,2,3,4,5,6,7,8] :(
Il se peut que le problème vienne du code C, car malgré le fait que "tata" retourne bien "0 1 2 3 4 5 6 7 8", j'ai cette erreur à la compilation :
Code:
1 2 3 4
| gcc -Wall -fPIC -c bidule.c
bidule.c: In function toto:
bidule.c:16: attention : cette fonction retourne l'adresse d'une variable locale
gcc -shared -Wl,-soname,bidule.so.1 -o bidule.so bidule.o |
Merci d'avance à tous ceux qui essaieront de comprendre :)
PS : je suis sous Linux, gcc-4.3.2, python-2.5.4
-