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 :

Définir une méthode sur un type dérivé


Sujet :

Fortran

  1. #1
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut Définir une méthode sur un type dérivé
    Bonjour,

    est-il possible d'utiliser une fonction comme élément d'un type dérivé, c'est à dire de l'invoquer directement à partir de l'objet :
    ?

    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
    module m
    	type TA
    		integer :: n
    	end type TA
    	contains
    	function f(a) result(s)
    		type(TA), intent(in) :: a
    		integer :: s
     
    		s = a%n
    	end function f
    end module m
     
    program appli
    	use m
     
    	type(TA) :: a = TA(1)
     
    	write (*, *), f(a)
    end program appli
    La fonction "f" est invoquée "de l'extérieur" du type "TA".

    Existe t'il une façon de construire le type dérivé permettant une invocation similaire à :
    Cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    type TA
    	integer :: n
    	procedure(f), pointer, pass(a) :: f
    end type TA
    provoquant l'erreur de compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Error: Unclassifiable statement at (1)
    Quelle est la bonne syntaxe ?

    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Va à la section 8.1 du manuel http://fortran.developpez.com/cours/fortran-2003/

    Je n'ai pas regardé si tu respecte la syntaxe. Reste à savoir si ton compilateur supporte le tout (tout comme le select type)...

  3. #3
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Merci de votre réponse.

    En effet l'exemple donné compile avec "ifort" et fonctionne bien, moyennant l'ajout du mot clé "import" dans la définition de l'interface.

    Cependant, si la subroutine ne prend que comme paramètre l'objet implicite, "ifort" plante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    : catastrophic error: **Internal compiler error: segmentation violation signal raised** Please report this error along with the circumstances in which it occurred in a Software Problem Report.  Note: File and line given may not be explicit cause of this error.
     
    compilation aborted for test.f (code 3)
    Donc il semble que cela ne soit pas encore très stable.

    Sinon quelles sont les bonnes pratiques de programmation fortran avec les précédents standards qui permettent de mimer l'approche orienté objet :
    constructeur, méthode, destructeur ... ?

    Faut il forcément utiliser un module par type d'objet rassemblant la définition du type ainsi que les opérations qui lui sont associées ?

    Merci.

  4. #4
    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
    Points : 1 346
    Points
    1 346
    Par défaut
    Citation Envoyé par seriousme Voir le message
    Sinon quelles sont les bonnes pratiques de programmation fortran avec les précédents standards qui permettent de mimer l'approche orienté objet :
    constructeur, méthode, destructeur ... ?

    Faut il forcément utiliser un module par type d'objet rassemblant la définition du type ainsi que les opérations qui lui sont associées ?
    À cause de diverses contraintes, je n'ai pas accès à un compilateur F03. Je travaille uniquement en F95. J'utilise toujours la stratégie "un module = un type = un ensemble de fonctions (méthodes) associées" et j'ajoute des interfaces pour avoir des noms génériques de fonction. 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
    23
    24
    25
    26
    27
     
    module ModuleMonType
       implicit none
     
       type TMonType
          ...
       end type
     
       interface Init
          module procedure MonTypeInit
       end interface
     
       interface Calc
          module procedure MonTypeCalc
       end interface
     
       interface Free
          module procedure MonTypeFree
       end interface
     
    contains
     
    subroutine MonTypeInit(Self, ...)
     
    ...
     
    end module
    Le code client peut alors faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    ...
    type (TMonType) :: UnObjet
    type (TAutreType) :: UnAutreOjet
     
    call Init(UnObjet)
    call Init(UnAutreObjet)
    ...
    Le résultat n'est évidemment pas aussi élégant que si j'utilisais UnOjet%Init(), mais c'est très lisible et très facile d'entretien.

  5. #5
    Membre expert
    Avatar de Pragmateek
    Homme Profil pro
    Formateur expert .Net/C#
    Inscrit en
    Mars 2006
    Messages
    2 635
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Formateur expert .Net/C#
    Secteur : Conseil

    Informations forums :
    Inscription : Mars 2006
    Messages : 2 635
    Points : 3 958
    Points
    3 958
    Par défaut
    Ah oui très bonne méthode, le résultat syntaxique est vraiment très similaire à ce qui serait obtenu avec de la pure POO.

    Mais au delà de l'aspect du code le plus important est que les règles d'encapsulation notamment sont respectées.

Discussions similaires

  1. Déclencher une méthode sur un timeout
    Par hugsdan dans le forum Servlets/JSP
    Réponses: 3
    Dernier message: 19/02/2007, 13h26
  2. Réponses: 2
    Dernier message: 26/01/2007, 10h50
  3. [C#]Appeler une méthode sur un object
    Par gilles641 dans le forum Windows Forms
    Réponses: 7
    Dernier message: 04/04/2006, 16h38
  4. [Evénements]Ajout d'une méthode sur un événement d'un bouton
    Par Salam59 dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 28/03/2006, 15h47
  5. [EJB] Appeler une méthode sur un EJB
    Par c+cool dans le forum Java EE
    Réponses: 12
    Dernier message: 27/01/2006, 11h44

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