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 :

Gestion de la mémoire : subroutine et module


Sujet :

Fortran

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut Gestion de la mémoire : subroutine et module
    Bonjour à tous.

    Venant du monde C++ et me mettant depuis peu au Fortran pour un projet, j'aurai besoin de vos éclaircissements sur la gestion de la mémoire.
    Concrètement que se passe-t-il quand on passe un tableau en argument d'une subroutine ?
    Celui-ci est-il recopié en mémoire, ou la subroutine travaille-t-elle sur le tableau original ?

    De même dans le cas où le programme principal et l'une des subroutines utilisent un module dans lequel est déclaré un tableau, combien de fois ce tableau est-il créé en mémoire ?

    Merci

  2. #2
    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
    Citation Envoyé par Kaluza Voir le message
    Bonjour à tous.

    Venant du monde C++ et me mettant depuis peu au Fortran pour un projet, j'aurai besoin de vos éclaircissements sur la gestion de la mémoire.
    Concrètement que se passe-t-il quand on passe un tableau en argument d'une subroutine ?
    Celui-ci est-il recopié en mémoire, ou la subroutine travaille-t-elle sur le tableau original ?
    Le standard ne le dit pas. Il est possible d'avoir un argument intent in, intent out ou intent inout. Dans le cas intent in, ça ne dit pas non plus que c'est par valeur. La clause intent sert plutôt à renseigner le compilateur aux fins d'optimisation. Généralement, le passage se fait par pointeur (ou by ref), indépendamment de la clause intent. Il y a donc une seule copie du tableau. C'est vrai aussi pour les scalaires.

    Dans le cas où tu voudrais passer une section de tableau seulement, il est cependant possible, si le dummy argument ne le prévoit pas, qu'il y ait création d'une copie de la section à l'appel, et une mise à jour de la section du tableau au retour (si intent out ou inout). Pour prévoir les sections de tableau et éviter la copie, le dummy doit être déclaré avec la forme (:). N.B. : Le prototypage est alors obligatoire (par module ou par interface).
    Citation Envoyé par Kaluza Voir le message
    De même dans le cas où le programme principal et l'une des subroutines utilisent un module dans lequel est déclaré un tableau, combien de fois ce tableau est-il créé en mémoire ?
    Une seule, par définition : Les variables d'un module sont communes à l'ensemble des utilisateurs du module.

  3. #3
    Membre extrêmement actif
    Inscrit en
    Avril 2008
    Messages
    2 573
    Détails du profil
    Informations personnelles :
    Âge : 65

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 573
    Par défaut passage d'arguments par reference
    bonjour
    Indubitablement,je n'ai pas vu de compilateur fortran passer des parametres par valeur comme pour un language "low-level" tel que c ou c++.
    La regle etablie pour tous les compilateurs est de passer par reference,c.à.d que c'est l'adresse de l'argument qui est passe .
    Cela peut etre verifie aisement si on fait appel en c ou c++ à un sous programme fortran,car on doit passer des pointeurs pour les tableaux, et des operateurs adresses pour des variables scalaires.
    Les clauses INTENT ne signifient pas qu'on passe par valeur mais bien par reference avec les restrictions suivantes:

    INTENT(IN) The procedure must not change the argument.

    INTENT(OUT) The argument is undefined on entry and may be given a value in the procedure.

    INTENT(INOUT) The argument may be given a value in the procedure.

    Aussi n'y a t-il de recopie en memoire.
    Idem pour les modules
    Et c'est la l'un des avantages de fortran-une seule regle de passage des arguments et aussi l'une des difficultes majeure avec les fameux "effets de bord" des variables.
    Le seul moyen de l'eviter est le pool de variables communes dans des modules specialise pour eviter de passer par des arguments puisque l'occupation memoire est identique.
    arguments.
    bon code....

  4. #4
    Membre éclairé
    Homme Profil pro
    Doctorant en Astrophysique
    Inscrit en
    Mars 2009
    Messages
    312
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Doctorant en Astrophysique
    Secteur : Enseignement

    Informations forums :
    Inscription : Mars 2009
    Messages : 312
    Par défaut
    Merci beaucoup pour ces explications très claires.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [VMS] Chargement dynamique de module et gestion de la mémoire
    Par gege2061 dans le forum Autres systèmes
    Réponses: 0
    Dernier message: 09/01/2008, 18h25
  2. Réponses: 17
    Dernier message: 02/02/2006, 12h03
  3. Réponses: 11
    Dernier message: 26/12/2004, 22h50
  4. Gestion de la mémoire entre plusieurs DLL
    Par Laurent Gomila dans le forum C++
    Réponses: 7
    Dernier message: 27/07/2004, 15h28
  5. Gestion des variables - mémoire ?
    Par RIVOLLET dans le forum Langage
    Réponses: 4
    Dernier message: 26/10/2002, 12h44

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