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 :

Modules et common


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut Modules et common
    Bonjour

    Voilà mon problème j'utilise souvent les common pour avoir des blocs de variables en commun (par exemple une série de parametres) que je colle dans mes différentes subroutine pour m'en servir un peu ou je veux.

    Le problème c'est que si je veux utiliser les common avec implicit none il faut que je déclare deux fois les variables. Une fois dans le common et une autre fois en disant leur type ect ...

    Du coup j'avais envie d'essayer de faire ça avec un module, seulement je sais pas faire et je trouve pas d'exemple simple d'utilisation de module.

    Voici un exemple :

    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
     
    Program 
    implicit none
    integer::nstlim,nptr,ntwr,ntwx,nmropt
    common /npar/  nstlim,nptr,ntwr,ntwx,nmropt
     
    .....
     
    end 
     
    subroutine plop
    implicit none
    integer::nstlim,nptr,ntwr,ntwx,nmropt
    common /npar/  nstlim,nptr,ntwr,ntwx,nmropt
    ...
    end
    Je voudrais remplacer le common par un module ...

    Je voudrais aussi savoir si dans certaines subroutine je peux déclarer que les variables sont des parametres (non modifiables) et dans d'autre qu'ils soient modifiables.

    Merci

  2. #2
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Bonjour,

    Pour ce qui est de l'utilisation (à l'ancienne) de variables en 'common', je proposerai plutôt de passer par un fichier externe qui est ensuite inclus dans le(s) routine(s) correspondante.
    Par ex, tu crée le fichier 'common_data.inc':
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    integer::nstlim,nptr,ntwr,ntwx,nmropt
    common /npar/  nstlim,nptr,ntwr,ntwx,nmropt
    et tes codes seraient alors de la forme:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    Program 
    implicit none
    include "common_data.inc"
     
    .....
     
    end 
     
    subroutine plop
    implicit none
    include "common_data.inc"
    ...
    end
    Et ne pas oublier à la compilation d'indiquer au compilateur ou trouver le fichier 'common_data.inc' (généralement c'est l'option -Ichemin/vers/fichiers/a/inclure ; généralement pas nécessaire à préciser si le fichier à inclure est dans le même répertoire que le code).

    Pour ce qui est d'utiliser un module au lien d'un 'common' la syntaxe 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
     
    module common_data
    ! module contenant les variables en commun
    implicit none
    integer::nstlim,nptr,ntwr,ntwx,nmropt
    end module common_data
     
     
    program mon_super_programme
    use common_data
    implicit none
    ...
    end program mon_super_programme
     
     
    routine ma_super_routine
    use common_data
    implicit none
    ...
    end routine ma_super_routine
    Et pour répondre à ta dernière question, on peut utiliser les spécificateurs 'intent(in)' ou 'intent(out)' dans une subroutine pour spécifier si les arguments sont "en entrée" (donc ne devant pas être modifiés par la routine) ou en sortie.
    Par exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    subroutine ma_routine(operation,donnee,resultat)
    implicit none
    integer,intent(in) :: operation ! valeur en entrée
    real,intent(in) :: donnee ! valeur en entrée
    real,intent(out) :: resultat ! valeur en sortie
    ...
    end subroutine ma_routine
    Bonne continuation.

  3. #3
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Le coup des intent in et out je connaissait mais je me demandais si je pouvais déclarer en parameter des variables d'un common ou d'un modules. Et en fait non car si je déclare un parameter il veut la valeur à la déclaration. Donc en fait si tu déclare un parameter tu le déclares pour tout le programme.

    Merci pour la syntaxe des modules !

    Juste une dernière question, est ce que les variables définies dans le modules doivent être redéclarée dans la routine ? et est ce que ça joue le role d'un common ? C'est à dire que les valeurs sont transmises aussi ?

    Par exemple si j'initialise dans une routine les variables contenu dans le common, est ce qu'elle garde leurs valeurs dans les autres routines et dans le prog principal ? En fait est ce que les variables du modules sont locales ou globales ?

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    489
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 489
    Par défaut
    Oui, le fonctionnement avec les modules est le même qu'avec des common: les variables sont "partagées" par toutes les routines qui incluent le module, et de ce point de vue on peut dire qu'elles sont globales.

  5. #5
    Membre émérite
    Avatar de Ladgalen
    Homme Profil pro
    Enseignant Chercheur
    Inscrit en
    Novembre 2007
    Messages
    466
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Enseignant Chercheur

    Informations forums :
    Inscription : Novembre 2007
    Messages : 466
    Par défaut
    Si dans mon module j'initialise des valeurs, comme par exemple :

    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 parm
          implicit none
          ! les parametre AMBER
          integer::nstlim,ntpr,ntwr,ntwx,nmropt
          integer::irest,ntx,ig
          nstlim = 0 
          ntpr   = 0
          ntwr   = 0
          ntwx   = 0
          nmropt = 0
          irest  = 0
          ntx    = 0
          ig     = 0
     
          ! nombre de pas dans les bouts AMBER
          integer,parameter::npas=5
     
          ! les fichiers input/output
          character(len=100)::input,restrtin,top
          character(len=100)::output,restrtout,crd,dumpave
          END MODULE parm
    Est ce que les valeurs vont reprendre la valeur 0 dés que je fais un use parm ?

  6. #6
    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 syntaxe n'est pas bonne, mais oui, les valeurs sont initialisées au chargement, donc disponibles dès le premier use.

    La syntaxe : Tu peux donner une valeur initiale à la déclaration, comme par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
          MODULE parm
          implicit none
          ! les parametre AMBER
          integer :: nstlim = 0 ! documentation ...
          integer :: ntpr   = 0 ! ...
          integer :: ntwr   = 0 ! ...
          integer :: ntwx   = 0 ! ...
          integer :: nmropt = 0 ! ...
          integer :: irest  = 0 ! ...
          integer :: ntx    = 0 ! ...
          integer :: ig     = 0 ! ...
          ...
          END MODULE parm
    Une méthode alternative consiste à ajouter une procédure d'initialisation dans le module :

    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 parm
       implicit none
       ! les parametre AMBER
       integer::nstlim,ntpr,ntwr,ntwx,nmropt
       integer::irest,ntx,ig
     
       ! nombre de pas dans les bouts AMBER
       integer,parameter::npas=5
     
       ! les fichiers input/output
       character(len=100)::input,restrtin,top
       character(len=100)::output,restrtout,crd,dumpave
     
    contains
     
       subroutine Initialise
          nstlim = 0 
          ntpr   = 0
          ntwr   = 0
          ntwx   = 0
          nmropt = 0
          irest  = 0
          ntx    = 0
          ig     = 0
       end subroutine Initialise
     
    END MODULE parm
    Tu dois évidemment appeler la subroutine d'initialisation à la première occasion. Cette méthode est souvent requise quand les éléments à initialiser sont plus complexe (allocate, open, ...).

Discussions similaires

  1. un common dans un module ?
    Par Ladgalen dans le forum Fortran
    Réponses: 3
    Dernier message: 10/09/2009, 21h08
  2. cherche module ou langage pour récupérer des données audio..
    Par Ry_Yo dans le forum Langages de programmation
    Réponses: 5
    Dernier message: 12/05/2003, 17h44
  3. PerlDoc sur une fonction d'un module
    Par lesouriciergris dans le forum Modules
    Réponses: 2
    Dernier message: 13/03/2003, 20h50
  4. Quoi ?! Common Dialog fait crasher DirectDraw ?
    Par Magus (Dave) dans le forum DirectX
    Réponses: 4
    Dernier message: 21/10/2002, 19h01

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