Vous êtes ici : Accueil / Forums & ML / Forums Python / Forum général Python / Passage d'un tableau en paramètre

Passage d'un tableau en paramètre

Remonter à Forum général Python
  • Passage d'un tableau en paramètre

    Envoyé par Dreyliciouss le 2 Août 2010 à 07:51
    Bonjour à tous,

    Je souhaite passer un tableau en paramètre d'un programme python à un programme fortran. Pour cela, j'utilise f2py (contenu dans le module numpy)

    Voici le programme python dans lequel j'appelle ma routine fortran : http://pastebin.com/MT8mLmaV
    Les valeurs du tableau sont calculées à l'aide d'une fonction ("projRot") écrite dans un autre programme python. Je pense qu'il n'est pas nécessaire de vous la transmettre puisque les valeurs sont bien mises dans le tableau et que le problème intervient lorsque je veux récupérer ce tableau dans ma routine fortran.
    Et voici le programme fortran contenant la routine qui récupère le tableau (le tableau est appelé "Proj" dans python) : http://pastebin.com/UExTzEhp

    Cependant, lorsque j'affiche les valeurs du tableau dès sa récupération dans ma routine (nommée "executable") les valeurs du tableau sont toutes nulles alors qu'elles ne devraient pas toutes l'être.
    Sauriez-vous d'où vient ce problème?

    Merci d'avance pour votre aide.
    • Re: Passage d'un tableau en paramètre

      Envoyé par troisseize le 3 Août 2010 à 10:32
      Si je comprends bien, reponseComplete.py et _reponseComplete.so sont créés par swing et distutils. Donc il doit y avoir des fichiers reponseComplete.c reponseComplete.h reponseComplete.i et setup.py.

      Sinon, il y a une autre erreur dans la subroutine "executable" dans les dimensions des boucles.

      Voilà ce que j'ai modifié:


      SUBROUTINE EXECUTABLE(val,b,c)

      INTEGER, INTENT(IN) :: c,b
      REAL, DIMENSION(b,c), INTENT(IN) :: val
      INTEGER :: li,co

      DO li = 1,b
      DO co= 1,c
      WRITE (*,*) val(li,co)
      END DO
      END DO

      ! CALL ECRIPROJ(val,b,c)


      RETURN
      END SUBROUTINE EXECUTABLE



      #file: toto.py
      import EcriProj
      import numpy as np

      a = np.arange(4*2).reshape(4,2)

      EcriProj.executable(a)



      f2py -m EcriProj -c EcriProj.f
      python toto.py



      0.0000000
      1.0000000
      2.0000000
      3.0000000
      4.0000000
      5.0000000
      6.0000000
      7.0000000



    • Re: Passage d'un tableau en paramètre

      Envoyé par Dreyliciouss le 3 Août 2010 à 10:42
      En fait, mon programme marche très bien pour le tableau "tab" qui se trouve dans "appelProj.y" mais dès que je veux l'utiliser sur Proj (les dimensions sont plus grandes), les valeurs ne sont pas bonnes.
      L'inversion des dimensions des boucles était fait exprès car sinon j'ai une erreur de segmentation lorsque les dimensions sont grandes. Il me semblait qu'un tableau tableau[i][j] en python était égal à tableau(j)(i) en fortran. Ce n'est pas le cas?
    • Re: Passage d'un tableau en paramètre

      Envoyé par Dreyliciouss le 3 Août 2010 à 09:44
      Pourtant, en écrivant les valeurs du tableau dans un fichier texte, on voit que les valeurs ne sont pas toutes nulles.
      Mais il n'y a rien a faire quand je transmet le tableau à la routine, elles deviennent toutes nulles.
    • Re: Passage d'un tableau en paramètre

      Envoyé par Dreyliciouss le 2 Août 2010 à 08:55
      Pour faire plus simple :

      j'apelle la routine avec la ligne "execute(Proj, dim1,dim2)" dans mon programme python. Proj est le tableau de dimension dim1 et dim2.

      Ensuite ma routine pour le récupérer est le suivant : http://pastebin.com/d846QwZi

      Lorsque j'affiche les valeurs du tableau dans la routine, les valeurs sont toutes nulles mais ne devraient pas l'être.
    • Re: Passage d'un tableau en paramètre

      Envoyé par Dreyliciouss le 2 Août 2010 à 09:13
      Dans la routine "exuctable" j'ai oublié de remplacer r et q par b et a mais ce n'est pas la raison de mon problème...
      Est ce que quelqu'un aurait une idée de pourquoi les valeurs du tableau ne passent pas bien?
      Y a-t-il une manipulation à faire avant de transmettre le tableau et ses dimensions à la routine?
    • Re: Passage d'un tableau en paramètre

      Envoyé par troisseize le 2 Août 2010 à 18:18
      Salut,

      Ce serait plus facile de trouver le problème si on pouvait faire tourner le code.

      Est-ce que tu peux envoyer tous les fichiers nécessaires pour compiler le Fortran et executer le code Python? Si cela t'arrange, tu peux m'envoyer un fichier zip ou tar.gz à david.froger@gmail.com
    • Re: Passage d'un tableau en paramètre

      Envoyé par Dreyliciouss le 3 Août 2010 à 08:01
      J'ai tout envoyé dans un fichier tar.gz
    • Re: Passage d'un tableau en paramètre

      Envoyé par troisseize le 3 Août 2010 à 08:47
      En compilant EcriProj.f, gfortran m'informe qu'un tableau est indicé par un réel.


      gfortran -c EcriProj.f



      EcriProj.f:19.32:

      WRITE (*,*) val(li,col)
      1
      Warning: Extension: REAL array index at (1)


      C'est précisément dans la subroutine "executable" qui pose problème. L'indice a utilisé n'est pas "col" mais "co". Comme "col" n'est pas déclaré, il est implicitement déclaré comme un réel à valeur 0 ou aléatoire (je ne sais pas). Donc l'instruction write affiche des valeurs hors du tableau.

      Les avis son partagés sur le sujet, mais personnellement je n'aime pas (comme la plupart des choses en Fortran...) les déclarations implicites, que l'on peut éviter en mettant "implicit none" avant la déclaration des variables.

      À priori ça peut être juste ça le problème, même si je n'ai pas pu tester l'ensemble:


      python appelProj.py




      Traceback (most recent call last):
      File "appelProj.py", line 15, in
      from calculAlgebric import *
      File "(...)/calculAlgebric.py", line 15, in
      from reponseComplete import *
      File "(...)/reponseComplete.py", line 25, in
      _reponseComplete = swig_import_helper()
      File "(...)/reponseComplete.py", line 17, in swig_import_helper
      import _reponseComplete
      ImportError: No module named _reponseComplete
    • Re: Passage d'un tableau en paramètre

      Envoyé par Dreyliciouss le 3 Août 2010 à 09:02
      Avez-vous compilé tous les fichiers python nécessaires au calcul des valeurs du tableau?
      En changeant le col par co je récupère toujours un tableau vide.
      L'ajout de l'instruction IMPLICIT NONE ne change rien non plus.
    • Re: Passage d'un tableau en paramètre

      Envoyé par Dreyliciouss le 3 Août 2010 à 11:37
      Le problème est résolu car il ne faut pas inverser le nombre de ligne et de colonne. Merci beaucoup pour votre aide en tout cas!
    • Re: Passage d'un tableau en paramètre

      Envoyé par Dreyliciouss le 3 Août 2010 à 10:43
      Ah, il y a eu un bug. Je reprend :

      L'inversion des dimensions des boucles était fait exprès car sinon j'ai une erreur de segmentation lorsque les dimensions sont grandes. Il me semblait qu'un tableau tableau(i)(j) en python était égal à tableau(j)(i) en fortran. Ce n'est pas le cas?
Rendu par Ploneboard