Académique Documents
Professionnel Documents
Culture Documents
Cours6 F90
Cours6 F90
Responsable :
Ivan Delbende
Ivan.Delbende@sorbonne-universite.fr
6
Fonctions intrinsèques
concernant les tableaux (6)
Type de la Nom de la fonction La fonction retourne : Type de
fonction l'argument
INTEGER, MAXLOC (tab) la position relative de la INTEGER or
DIMENSION plus grande valeur du REAL,
(rang_tab) tableau tab DIMENSION
MINLOC (tab) la position relative de la (…) :: tab
plus petite valeur du
tableau tab
Responsable :
Ivan Delbende
Ivan.Delbende@sorbonne-universite.fr
● Remarques
➢ Le résultat renvoyé par la fonction est contenu
dans une variable de même nom que la fonction
➢ Les arguments de la fonction sont appelés des
arguments muets (dummy). Ils doivent tous être
déclarés, ils ont un attribut supplémentaire :
INTENT (IN) … nous y reviendrons plus loin. 10
Fonctions définies par
le programmeur (3)
L'appel à la fonction INTEGER FUNCTION ordre_grandeur ( x )
REAL, INTENT ( IN ) :: x
ordre_grandeur = FLOOR ( LOG10 ( ABS(x) ) )
END FUNCTION ordre_grandeur
On sait maintenant
définir nos propres
fonctions…
… mais où doit-on le
faire ??
18
Le MODULE et la directive USE
MODULE lecture ! Module placé avant le programme appelant
IMPLICIT NONE
CONTAINS
REAL FUNCTION lit_reel (x, y)
REAL, INTENT (IN) :: x, y
PRINT *, ' Entrez un reel compris entre ', x, ' et ', y
DO
READ *, lit_reel
IF (lit_reel >= x .AND. lit_reel <= y) EXIT
PRINT *, ' Faites un nouvel essai ! '
END DO
END FUNCTION lit_reel
END MODULE lecture
CONTAINS
REAL FUNCTION lit_reel (x, y)
REAL, INTENT (IN) :: x, y
PRINT *, ' Entrez un reel compris entre ', x, ' et ', y
DO
READ *, lit_reel
IF (lit_reel >= x .AND. lit_reel <= y) EXIT
PRINT *, ' Faites un nouvel essai ! '
END DO
END FUNCTION lit_reel
END MODULE lecture
PROGRAM calcul_trace
USE proc
IMPLICIT NONE
REAL, DIMENSION (0:5, 0:5) :: A = 1.
PRINT *, 'Trace de A = ', trace (A) ! Donne 6
24
END PROGRAM calcul_trace
Argument de type tableau (4)
Responsable :
Ivan Delbende
Ivan.Delbende@sorbonne-universite.fr
tmp = a
a=b début de
fin d'appel
b = tmp l'appel
END SUBROUTINE
● Appel :
REAL :: x = 1., y = 4.5
CALL echange_deux_reels ( x, y )
PRINT *, ' x = ', x, ' y = ', y
14
CALL echange_deux_reels (1., x) ! Incorrect car 1. n'est pas une var.
Attribut INTENT
dans une procédure (3)
● Conséquences sur les arguments d'appel :
➢ avec INTENT(IN) : l'argument d'appel peut être une
variable, une expression ou une constante
➢ avec INTENT(OUT) et INTENT(INOUT) : l'argument d'appel
ne peut être qu'une variable
● Dans une FUNCTION les arguments sont en général
utilisés avec INTENT(IN), même si on peut utiliser
d'autres attributs INTENT (à éviter)
● L'attribut INTENT n'est pas obligatoire mais vivement
recommandé car il évite des erreurs.
Attribut INTENT obligatoire en 2A005
(INTENT ne concerne que les
arguments muets des procédures) 15
Instruction RETURN
● L'instruction RETURN permet de quitter la
procédure avant END FUNCTION/SUBROUTINE
● Dans le cas d'une FUNCTION, il faudra s'assurer
que la valeur à retourner est correctement
positionnée avant RETURN.
REAL FUNCTION maximum (x, y)
REAL, INTENT(IN) :: x, y
IF (x < y) THEN
maximum = y
RETURN
ELSE
maximum = x
RETURN
END IF
! des instructions situées ici ne seraient jamais exécutées
ma_f = var_glob + x
END PROGRAM mon_prog END FUNCTION ma_fnct
SUBROUTINE ma_sub(…)
END SUBROUTINE ma_sub
END MODULE mon_module 18
Portée et durée de vie
d’une variable
● Portée : partie du code au sein de laquelle la
variable est accessible
➢ Par défaut, la portée est limitée à l'unité de programme
dans laquelle la variable a été déclarée
19
Structure simplifiée d'un
programme Fortran
PROGRAMME PRINCIPAL MODULE
SUBROUTINE ma_sub(…)
END SUBROUTINE ma_sub
END MODULE mon_module 20
Portée et durée de vie
d’une variable
● Portée : partie du code au sein de laquelle la
variable est accessible
➢ Par défaut, la portée est limitée à l'unité de programme
dans laquelle la variable a été déclarée
● Durée de vie : temps pendant lequel la variable
existe en mémoire
➢ Par défaut, la durée de vie est limitée à la durée de vie
de l'unité de programme dans laquelle la variable a été
déclarée
les variables locales « disparaissent » lorsque
la procédure se termine
la valeur des variables locales n'est pas
conservée d'un appel à l'autre ……. sauf si …..
21
Variable statique (1)
L'attribut SAVE permet de prolonger la durée de vie
d'une variable locale à celle de l'exécutable.
variable statique
REAL FUNCTION maximum (x, y)
IMPLICIT NONE
REAL, INTENT(IN) :: x, y
INTEGER, SAVE :: compteur = 0
compteur = compteur + 1
PRINT *, ' Cette fonction a été appelée ', compteur, ' fois '
IF (x < y) THEN
maximum = y
ELSE
maximum = x
END IF
END FUNCTION maximum
22
Variable statique (2)
compteur = compteur + 1
PRINT *, 'Cette fonction a été appelée ', compteur, 'fois'
IF (x<y) THEN
maximum = y
ELSE
maximum = x
END IF
23
END FUNCTION maximum
Variable statique (3)
produit = 1 ! Correct
DO i = 2, n
produit = produit * i
END DO
factorielle = produit
END FUNCTION factorielle