Précédent   Forum du club des développeurs et IT Pro > Autres langages > Python & Zope > Interfaçage autre langage
Interfaçage autre langage Forum d'entraide pour l'interfaçage avec d'autres langages (ctypes, api C, swig, ...)
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse
 
Outils de la discussion
Publicité
'
Vieux 23/09/2010, 14h12   #1
lelapindepauline
Invité de passage
 
Inscription : septembre 2010
Messages : 1
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 1
Points : 0
Points : 0
Par défaut [SWIG] C-Python : les tableaux 2D

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 :
Code :
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 :
Code :
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 :
Code :
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
lelapindepauline est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/04/2011, 16h28   #2
Remy_F
Invité de passage
 
Homme
Doctorant
Inscription : avril 2011
Messages : 3
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : France

Informations professionnelles :
Activité : Doctorant

Informations forums :
Inscription : avril 2011
Messages : 3
Points : 1
Points : 1
J'ai le même type de problème que toi (la même erreur dans python en fait), tu as réussi à le résoudre depuis ou pas ?
Remy_F est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse
Outils de la discussion

Navigation rapide


Fuseau horaire GMT +2. Il est actuellement 13h01.


 
 
 
 
Partenaires

Hébergement Web