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 :

Garder en mémoire des valeurs issues d'une subroutine


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2010
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2010
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Garder en mémoire des valeurs issues d'une subroutine
    Bonjour,
    J'utilise un programme qui permet de faire des appels à des fonctions et subroutines Fortran. J'en ai programmé qui permet de récupérer un fichier texte, de l'enregistrer sous une matrice. A partir de cette matrice, je peux faire des calculs. Jusque là ça fonctionne.
    Le premier problème, c'est cette subroutine est tout le temps appelé, et recharger la matrice à chaque fois est chronophage. Pour palier à ce problème, j'utilise l'attribut SAVE. Elle permet de garder en mémoire la matrice lorsque la subroutine se termine. Ca fonctionne très bien...
    ... sauf si la fonction est appelé une deuxième fois. Dans ce cas là, il y a un conflit avec la variable déjà enregistrée.
    Est-ce que quelqu'un aurait une solution pour sauvegarder ces matrices de façon indépendante?
    Merci d'avance.
    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
          subroutine sbilin(table,x,y,step,z)
          Implicit none
    c Fonction d'interpolation bilinéaire
    c table : nom du fichier
    c X : première variable
    c Y : seconde variable
    c step : permet de ne sauvegarder qu'une seule fois la table
    c Z : variable de sortie
     
          double precision :: x,y,z,num
          real,save :: xmin,xmax,ymin,ymax
          integer,save :: xn,yn
          integer :: i,i1,i2,j1,j2,ierr,step
          real,save,allocatable,dimension(:,:,:) :: m
          character(len=2000) :: string
          character*(*) :: table
     
          if (step==0) then
    c Cette étape ne sera effectuée qu'une seule fois, elle permet de sauvegarder le fichier de données sous forme d'une matrice 
    c Comptage du nombre de colonne 
          open(unit=11,file=table)
          read(11,fmt="(a)",iostat=ierr) string
          yn=1
          do i = 2, len_trim(string)
          if ( (string(i:i)=='	') .and. (string(i-1:i-1) /= '	') ) then
               yn=yn+1
          end if
          end do
          yn=yn-1
     
    c Comptage du nombre de ligne
          xn=-1
          do while (ierr==0)
          read(11,*,iostat=ierr)
          xn=xn+1
          end do
          close(11)
     
    c Creation de la matrice      
          allocate(m(0:xn,0:yn,1:10000))
          open(unit=11,file=table)
    c Lecture du fichier et enregistrement dans une matrice      
          do i=0,xn
          read (11,*) m(i,:)
          end do
          close(11)   
     
     
    c Définition de xmin,xmax,ymin, ymax,xmin
          xmin=m(1,0)
          xmax=m(xn,0)
          ymin=m(0,1)
          ymax=m(0,yn)
     
          step=1
          end if

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2010
    Messages
    103
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2010
    Messages : 103
    Points : 1 035
    Points
    1 035
    Billets dans le blog
    1
    Par défaut allocate est répété
    Bonjour,

    le problème est que l'instruction allocate() est répétée à chaque fois qu'on appelle la procédure alors que le tableau est déjà alloué. Tu peux essayer quelque chose comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    if (.not.allocated(m)) then
          allocate(m(0:xn,0:yn,1:10000))
          open(unit=11,file=table)
          do i=0,xn
          read (11,*) m(i,:)
          end do
          close(11)
    endif

Discussions similaires

  1. comment garder en mémoire la valeur d'une variable
    Par java250r dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 12/04/2012, 18h53
  2. Réponses: 5
    Dernier message: 19/11/2010, 12h28
  3. garder en mémoire des valeurs postées
    Par boriskov dans le forum Langage
    Réponses: 1
    Dernier message: 21/08/2008, 11h43
  4. Réponses: 12
    Dernier message: 19/06/2008, 11h10
  5. fonction sur la somme des valeurs issues d'une requete
    Par iam dans le forum Bases de données
    Réponses: 5
    Dernier message: 15/06/2006, 21h35

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