Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Interfaçage autre langage Python Discussion :

[SWIG] C-Python : les tableaux 2D


Sujet :

Interfaçage autre langage Python

  1. #1
    Nouveau Candidat au Club
    [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 :Sélectionner tout -Visualiser dans une fenêtre à part
    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 :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
    %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 :Sélectionner tout -Visualiser dans une fenêtre à part
    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
    Candidat au Club
    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 ?