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 :

vecteur allocatable passé par référence


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Nouveau candidat au Club
    Inscrit en
    Janvier 2012
    Messages
    1
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 1
    Par défaut vecteur allocatable passé par référence
    Bonjour,

    Malgré des recherches sur plusieurs forums je n'ai pas pu trouver la réponse à mon problème. J'espère la trouver ici

    Mon problème est le suivant : j'essaie de passer en argument a une subroutine un vecteur allocatable mais ça ne marche pas. Voici un bout de code ou le problème apparait.
    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
     
          MODULE allocvars
          implicit none
          real,dimension(:,:),allocatable :: field
          END MODULE
     
          PROGRAM main
          use allocvars
          implicit none
          allocate(field(5,5))
          field=4.0
          write(*,*) 'field in main : ',field(2,2)
          call sub(field)
          END
     
          SUBROUTINE sub(fieldbyreference)
          use allocvars
          implicit none
          real,dimension(:,:),allocatable :: fieldbyreference
          write(*,*) 'field in sub (from module):',field(2,2)
          write(*,*) 'field in sub (from reference):',fieldbyreference(2,2)
          END
    Et voici le résultat :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    [wasabi1024@computer fortranpb]$ gfortran main.f 
    [wasabi1024@computer fortranpb]$ ./a.out 
     field in main :    4.0000000    
     field in sub (from module):   4.0000000    
    Segmentation fault
    Quelqu'un comprend pourquoi le passage par référence ne fonctionne pas?

  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 n'as pas spéciafié le type entrée/sortie de ton champ fieldbyreference.
    Qui plus est, il n'est pas nécessaire de préciser le status ALLOCATABLE sur un tableau en entrée de subroutine.
    Le code corrigé serait :

    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
          MODULE allocvars
          implicit none
          real,dimension(:,:),allocatable :: field
          END MODULE
    
          PROGRAM main
          use allocvars
          implicit none
         INTERFACE
                   SUBROUTINE sub(fieldbyreference)
                   use allocvars
                   implicit none
                   real,dimension(:,:),INTENT(IN) :: fieldbyreference
                   END SUBROUTINE sub
          END INTERFACE
          allocate(field(5,5))
          field=4.0
          write(*,*) 'field in main : ',field(2,2)
          call sub(field)
          END
    
          SUBROUTINE sub(fieldbyreference)
          use allocvars
          implicit none
          real,dimension(:,:),INTENT(IN) :: fieldbyreference
          write(*,*) 'field in sub (from module):',field(2,2)
          write(*,*) 'field in sub (from reference):',fieldbyreference(2,2)
          END

  3. #3
    Modérateur

    Profil pro
    Inscrit en
    Août 2006
    Messages
    974
    Détails du profil
    Informations personnelles :
    Localisation : Canada

    Informations forums :
    Inscription : Août 2006
    Messages : 974
    Par défaut
    La version Marlan ne va pas marcher non plus : il faut une interface explicite pour un « dummy argument » qui est de type « assumed shape », (real,dimension(:,:),INTENT(IN) :: fieldbyreference)

    Tu peux faire une recherche de « interface explicite » dans le forum pour plus d'info.

  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
    A, oui, bien vu. Désolé de mon erreur, je corrige le post.

Discussions similaires

  1. [RegEx] Récupération variable passé par référence
    Par Aurélien LEQUOY dans le forum Langage
    Réponses: 3
    Dernier message: 11/06/2013, 09h09
  2. Réponses: 3
    Dernier message: 15/05/2010, 15h13
  3. Variables inexistantes passées par référence
    Par lysandre dans le forum Langage
    Réponses: 7
    Dernier message: 07/09/2008, 23h48
  4. [VB.NET]Objet passé par référence
    Par olbi dans le forum VB.NET
    Réponses: 4
    Dernier message: 02/07/2007, 14h28
  5. [POO] Problème de paramètre passé par référence
    Par dug dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 31/08/2005, 20h29

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