next up previous contents
Next: La gestion dynamique et Up: Les procédures génériques (MODULE Previous: Les procédures génériques (MODULE   Contents

Interface Operator

Considérons l'instruction

$\displaystyle x = a + b
$

le même symbole + peut désigner suivant le type de a et b des opérations différentes :

x est un entier si a et b sont des entiers

x est un réel si a et b sont des réels ou a entier et b réel ...

x est un tableau du même profil que a si a et b sont deux tableaux de même profil.


L'opération + ( -,/ ou *) est déjà prédéfinie, et selon le type des opérandes elle fournit un résultat différent.

Fortran offre la possibilité de :

$ \bullet$ donner une signification à tout autre symbole(+, -, /, *,...) lorsqu'il porte sur des types différents de ceux pour lesquels il est déjà défini.

Exemple. Interface operator (+)
Interface operator (-)

$ \bullet$ créer de nouveaux opérateurs de la forme .op.op désigne une suite quelconque de caractères.

Exemple. Interface operator (.SOMME.)

Exemple de Surdéfinition de l'opérateur +

Cette technique est utilisée pour doter d'opérateurs simples des types dérivées, afin d'en simplifier la manipulation.

 
       MODULE  opplusmod
          IMPLICIT NONE
          TYPE point
             INTEGER :: num
             REAL    :: x,y
          END TYPE point
          INTERFACE OPERATOR(+)
             MODULE PROCEDURE point_plus_point, point_plus_entier
          END INTERFACE
          CONTAINS
 
         FUNCTION  point_plus_point( p1, p2) RESULT(ppp)
             TYPE(point), INTENT(IN) :: p1,p2
             TYPE(point)             :: ppp
       
             ppp = point(p1%num+p2%num, p1%x+p2%y, p1%y+p2%y)
          END FUNCTION  point_plus_point

         FUNCTION  point_plus_entier( p, n) RESULT(ppn)
             TYPE(point), INTENT(in) :: p
             INTEGER    , INTENT(in) :: n 
             TYPE(point)             :: ppn
       
             ppn = point(p%num+n, p%x, p%y)
         END FUNCTION  point_plus_entier
      END MODULE opplusmod
Ce module a permis de définir la somme de deux structures comme on le souhaite par l'interface operator (+).

Voici un exemple d'utilisation de ce module :

       Program operateur
          USE opplusmod
          IMPLICIT NONE
          TYPE(point) :: a,b,c
 
          a = point(3, 2., 3.) 
          b = point(2, 4., 5.2)
          c = a+b 
          PRINT*,'a+b =',c
          PRINT*,'c+14 =',c+14

Exercices

  1. Soit $ A$ une matrice tridiagonale stockée sous la forme $ A(N,3)$ et $ x$ un vecteur de taille $ N$. Définir l'opération

    $\displaystyle y = A*x
$

    à l'aide de l'interface operator(*).
  2. On dispose de la structure suivante :
    	       TYPE rationnel
     	         integer :: num, den
     	      END rationnel
    
    ce type permet de définir une fraction rationnelle numérateur sur denominateur.

    Ecrire une interface operator (+) permettant de supporter les instructions suivantes

                   f = f1+f2
                   f = f1+2
                   f = 2+f1
    

   


next up previous contents
Next: La gestion dynamique et Up: Les procédures génériques (MODULE Previous: Les procédures génériques (MODULE   Contents
Mazen Saad 2002-12-12