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