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 :
- La classe C_Point contient la procédure interne "translater" qui permet de translater un C_Point d'un vecteur avec la syntaxe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 type(C_Point) :: A, B type(C_Vecteur) :: v B = A%translater(v)- Dans la classe C_Vecteur, je surcharge le constructeur pour pouvoir créer un C_Vecteur à partir de deux points, avec la syntaxe :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4 type(C_Point) :: A, B type(C_Vecteur) :: v v = C_Vecteur(A,B)
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
Partager