Bonjour
Je suis stagiaire (en acoustique lol, et pas tr�s dou� en code) et on me demande d'interfacer du C (pour la rapidit� des calculs) avec du Python (pour l'interface).
J'ai choisi d'utiliser swig, et ca marche plut�t pas mal, sauf quand il s'agit de tableaux 2D.
Pour faire simple (j'ose esp�rer que r�soudre ce probl�me r�soudra tous les autres), j'ai une fonction C qui calcule le produit de 2 matrices 2*2 pass�es en param�tres, et remplace m1 par le r�sultat. Fonction du type :
void multiplie(complex **m1[2], complex **m2[2])
Quand j'appelle cette fonction depuis Python, mes matrices sont des 2D-arrays cr��s avec Numpy.
Mon fichier d'interface ressemble donc � ca :
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
| %module acoustic
%{
#define SWIG_FILE_WITH_INIT
#include "acoustic.h"
%}
%include "numpy.i"
%init %{
import_array();
%}
%typemap(in) Py_complex* ARGOUT_ARRAY[ANY][ANY] {
$1 = ($1_ltype) Py_complex_AsLong($input);
}
%include "acoustic.h"
%apply (Py_complex* ARGOUT_ARRAY[ANY][ANY]) {(complex* *m[ANY])};
void multiplie(complex* *m[2], complex* *m2[2]) ; |
La compilation se passe bien, l'importation dans Python aussi. Mais lorsque j'ex�cute la fonction, je re�ois le message d'erreur suivant :
1 2 3
| Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError: in method 'multiplie', argument 1 of type 'complex **[2]' |
Je pense que le probl�me vient du fichier d'interface. Ca fait une semaine que je parcours le web en long et en large pour trouver une solution, mais j'avoue que j'ai du mal � comprendre les typemaps (qui sont � la source de mon probl�me il me semble ?).
Autre chose me d�range : je suis oblig� de passer la matrice � la fonction sous la forme **m[2], sinon l'ex�cution du code C n'aboutit pas. Mais dans la doc de swig, c'est plut�t *m[2][2] que je devrai utiliser...
Si quelqu'un pouvait m'�clairer, je lui en serai fortement reconnaissant.
Merci d'avance
Lelapindepauline
Partager