IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
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

Fortran Discussion :

subroutine et tableaux dynamiques


Sujet :

Fortran

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 18
    Par défaut subroutine et tableaux dynamiques
    Bonjour,

    j'ai cherché, et cherché encoreune solution a mon probleme, en vain, donc je m'en remets a vous. Voici le probleme : j'ecris une subroutine dont les output sont 3 tableaux. La taille de ces tableaux depend de l'utilisateur (taille définie en input de la subroutine). Je remplis alors en fait mes trois tableaux dynamiques dans ma subroutine. Mais je ne comprends pas comment les passer dans le programme principal : je ne comprends pas comment les définir, les allouer, etc ....

    Je ne sais pas si je suis très clair, je peux réexpliquer mieux que ca si ca n'est pas suffisant.

    Merci !

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Par défaut
    Salut,

    Tu peux recourir à la façon suivante :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
     
    PROGRAM MATRIX_SPE
    IMPLICIT NONE
    REAL(KIND=8),ALLOCATABLE,DIMENSION(:,:) :: MATRIX
     
    INTEGER :: NI, NJ !NI et NJ sont donnés par l'utilisateur
     
    INTERFACE
    SUBROUTINE REMPLISSAGE_TABLEAUX(NI,NJ,MATRIX)
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: NI, NJ
    REAL(KIND=8),DIMENSION(:,:),INTENT(OUT) :: MATRIX
    END SUBROUTINE REM°PLISSAGE_TABLEAUX
    END INTERFACE
     
    ALLOCATE(MATRIX(NI,NJ))
     
    CALL REMPLISSAGE_TABLEAUX(NI,NJ,MATRIX)
     
    [...]
    DEALLOCATE(MATRIX)
    END PROGRAM
     
    SUBROUTINE REMPLISSAGE_TABLEAUX(NI,NJ,MATRIX)
    IMPLICIT NONE
    INTEGER, INTENT(IN) :: NI, NJ
    REAL(KIND=8),DIMENSION(:,:),INTENT(OUT) :: MATRIX !les talbeaux en sortie
    REAL(KIND=8),DIMENSION(NI,NJ) :: TMP_MATRIX !Un tableau défini en interne de la subroutine de taille NI, NJ
     
    TMP_MATRIX=1.0
     
    MATRIX=TMP_MATRIX
    END SUBROUTINE REMPLISSAGE_TABLEAUX
    Le soucis vient de cela : l'utilisateur peut spécifier ses tailles de tableau, MAIS en sortie, ces tableaux doivent avoir été définis dans la partie du programme les recevant (qui peut être une autre subroutine par ailleurs).

    En gros : il faut définir les tableaux dans le programme, puis on peut les remplir comme bon nous semble ensuite (via subroutine).

    En espérant avoir pu t'aider,

    Marlan

    Nota : ici le tableau TMP_MATRIX illustre un tableau créé dans la sous routine et de taille NI,NJ. Cela étant, il ne peut pas sortir de celle-ci en étant défini de cette manière.

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Mars 2012
    Messages
    18
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2012
    Messages : 18
    Par défaut
    Cette solution me paraît très bien. Cependant, j'ai un problème : dans ton exemple, NI et NJ sont entrer par l'utilisateur. Moi, ce que je vaus faire, c'est entrer une valeur (appelons la v), qui est la seule variable d'une expression plutot compliquée : f(v). Je connais l'expression, et je la calcule donc. Mais je voudrais que la dimension de mon vecteur soit égale à f(v). Et je ne comprends pas trop comment faire ...

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Mai 2010
    Messages
    152
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2010
    Messages : 152
    Par défaut
    Si j'ai bien suivis tu veux stocker tous les résultats de f(v) dans un seul et même vecteur dont tu ne connais pas les dimensions à la base?

    Pourquoi ne pas écrire les résultats de f(v) dans un fichier alors?

    Si tel est bien le problème, il y a une autre solution mais qui est très coûteuse : faire une ré-allocation comme suit :

    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
    22
    23
    24
    25
     
    PROGRAM RE_ALLOCATE
    IMPLICIT NONE
    REAL(KIND=8),ALLOCATABLE,DIMENSION(:) :: VECT
    REAL(KIND=8),ALLOCATABLE,DIMENSION(:) :: TMP_VECT
    INTEGER :: NB_CALC,I
     
     
    ALLOCATE(VECT(1))
    DO I=1,NB_CALC
    CALL CALCUL(VECT(I)) !On calcul et stocke la valeur de VECT
     
    !Agrandissement de la taille de VECT de 1 élément à chaque itération
    ALLOCATE(TMP_VECT(SIZE(VECT,dim=1)))
    TMP_VECT=VECT
    DEALLOCATE(VECT)
    ALLOCATE(VECT(SIZE(TMP_VECT,dim=1)+1))
    DEALLOCATE(TMP_VECT)
     
    END DO
     
    [...]
     
    DEALLOCATE(VECT
    END PROGRAM RE_ALLOCATE
    Dans ce programme bidon, la taille de VECT est augmentée à chaque itérations. Cela étant, je me répète, ce procédé est extrêmement coûteux en mémoire. Mon conseil (si j'ai toujours bien compris ta question) serait de recourir à une écriture dans un fichier puis une relecture du fichier pour stocker les valeurs du calcul dans un tableau.

    En espérant avoir pu t'aider,

    Marlan

Discussions similaires

  1. Tableaux dynamiques
    Par sebduth dans le forum Fortran
    Réponses: 5
    Dernier message: 05/07/2005, 15h36
  2. tableaux dynamiques
    Par Mynautor dans le forum C++
    Réponses: 23
    Dernier message: 12/02/2005, 02h45
  3. [D7] Tableaux dynamiques dans un record
    Par bobby-b dans le forum Langage
    Réponses: 2
    Dernier message: 30/06/2004, 23h23
  4. Article sur les tableaux dynamiques
    Par Eric Sigoillot dans le forum Langage
    Réponses: 2
    Dernier message: 16/04/2004, 22h00
  5. [Kylix] Tableaux dynamiques sour Kylix2
    Par Krän dans le forum EDI
    Réponses: 6
    Dernier message: 07/10/2003, 14h31

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo