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épendance cyclique de classe (POO)


Sujet :

Fortran

  1. #1
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut Dépendance cyclique de classe (POO)
    Bonjour,

    Je sollicite votre aide sur un problème que je n'arrive pas à résoudre.

    J'essaye de créer une bibliothèque de manipulation géométrique en Fortran 2003 avec un formalisme orienté objet.

    Voici un exemple simple de ce que j'essaye de faire :
    • Une classe "C_Point", définie dans le 1er module
    • Une classe "C_Vecteur", définie dans le 2ème 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
    ! Module de définition de la classe C_Point
    module classe_Point
    use classe_Vecteur
    implicit none
     
    type :: C_Point
       real(kind=8) :: x, y  ! Coordonnées d'un point
       contains
       procedure, pass :: translater
    end type
     
    contains
     
    function translater( self, vect )
       implicit none
       class(C_Point)   :: self
       type (C_Vecteur) :: vect
     
       ! Instruction pour translater
    end function
     
    end 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
    ! Module de définition de la classe C_Vecteur
    module classe_Vecteur
    use classe_Point
    implicit none
     
    type :: C_Vecteur
       real(kind=8) :: x, y  ! Composantes du vecteur
    end type
     
    interface C_Vecteur
       module procedure :: make_vecteur  ! Surcharge du constructeur de C_Vecteur pour pouvoir créer un vecteur à partir de deux C_Point
    end interface
     
    contains
     
    function make_vecteur( point1, point2 ) result( vect )
       implicit none
       type(C_Point)   :: point1, point2
       type(C_Vecteur) :: vect
     
       vect%x = point2%x - point1%x
       vect%y = point2%y - point1%y
    end function
     
    end module

    Dans cet exemple :


    Le problème c'est que les classes ont besoin l'une de l'autre :
    • La classe C_Point a besoin de C_Vecteur pour la procédure "translater"
    • La classe C_Vecteur a besoin de C_Point pour le constructeur


    Et donc la compilation plante. Y a-t-il un moyen de faire ce genre de choses en Fortran ?

    Merci d'avance de votre aide

    J'utilise le compilateur ifort version 16

  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
    J'ai regardé 1 minute...

    Tes types Point et Vecteur sont trop liés pour être définis dans des modules distincts. À moins que ce soit un exemple simplifié rendant la solution suivante difficile, tu devrais tout mettre dans le même module.

  3. #3
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour Sylvain,

    Merci pour ta réponse.

    Mais comme tu dis, ceci n'est qu'un exemple très simple. A terme, je vais devoir ajouter pas mal de procédures à ces types et aussi ajouter d'autres types géométriques (genre triangle, cercle, rectangle ...).
    Donc si je dois tout mettre dans le même module, ça va vite devenir illisible.

    Si ce n'est pas possible au niveau de la programmation, peut-être avec des astuces de compilation dans le makefile ?

    Temporairement, j'ai trouvé une solution de bricolage :
    • Les types sont définis dans un module sans les fonctions assocées (module_def_Point). Donc aucune dépendance n'est nécessaire pour ces modules.
    • Les fonctions sont définies dans un second module (module_func_Point).


    Par contre en faisant comme ça, je ne peux plus vraiment faire de "type-bound procedure" comme "translater" dans mon exemple. Ca devient une fonction classique et je trouve ça un peu dommage de perdre la syntaxe orientée objet.

    En tout cas merci pour ton aide

  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
    Je crois que tu devrais avoir un ou quelques types de bas niveau (ex: TPoint et TVecteur) avec des services de base dans un module de base. De là, tu pourrais dériver des types et services associés plus évolués.

  5. #5
    Futur Membre du Club
    Inscrit en
    Septembre 2009
    Messages
    13
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 13
    Points : 5
    Points
    5
    Par défaut
    Bonjour Sylvain,

    Finalement j'ai opté pour la solution que tu as proposée, à savoir tout regrouper dans 1 seul module. Mais pour garder une lisibilité acceptable, j'ai découpé mon module en plusieurs fichier que j'inclu avec l'instruction include "fichier.f90"

Discussions similaires

  1. Communication Corba et dépendances cycliques
    Par Elmotardo dans le forum Général Java
    Réponses: 2
    Dernier message: 20/09/2010, 10h00
  2. Forcer une dépendance cyclique pour les tests unitaire
    Par jamesleouf dans le forum Maven
    Réponses: 5
    Dernier message: 18/05/2010, 15h37
  3. classes POO ou simples fonctions?
    Par crayonpro dans le forum Langage
    Réponses: 2
    Dernier message: 02/11/2009, 10h36
  4. Outil pour voir les dépendances (cycliques) ?
    Par oodini dans le forum C++
    Réponses: 7
    Dernier message: 09/03/2009, 11h28
  5. Dépendance vers les classes d'un WAR
    Par PurpleOwl dans le forum Maven
    Réponses: 3
    Dernier message: 26/03/2008, 17h37

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