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 c : Sélectionner tout - Visualiser dans une fenêtre à part
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 bash : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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 : Sélectionner tout - Visualiser dans une fenêtre à part
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

-