Soutenez-nous
Publicité
+ Répondre à la discussion
Affichage des résultats 1 à 2 sur 2
  1. #1
    Invité de passage
    Inscrit en
    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

  2. #2
    Invité de passage
    Homme Profil pro
    Doctorant
    Inscrit en
    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

    Par défaut

    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 ?

Liens sociaux

Règles de messages

  • Vous ne pouvez pas créer de nouvelles discussions
  • Vous ne pouvez pas envoyer des réponses
  • Vous ne pouvez pas envoyer des pièces jointes
  • Vous ne pouvez pas modifier vos messages
  •