Sunteți pe pagina 1din 110

Cours Fortran 90/95

Lauren e Viry

CCH
2
Table des matieres

1 Introdu tion 11
1.1 Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
1.2 Nouveautes de la norme Fortran90 . . . . . . . . . . . . . . . . . . . . . . . 12
1.3 Cara teristiques obsoletes de la norme Fortran90 . . . . . . . . . . . . . . . 13

1.4 Evolution vers la norme Fortran95 . . . . . . . . . . . . . . . . . . . . . . . 13
1.5 Cara teristiques obsoletes de la norme Fortran95 . . . . . . . . . . . . . . . 14
1.6 Cara teristiques supprimees de la norme Fortran95 . . . . . . . . . . . . . . 14

2 Generalites 15
2.1 Elements syntaxiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.1 Les identi ateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
2.1.2 Formats du ode sour e . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.3 Commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.1.4 Con ept de type en Fortran 90 . . . . . . . . . . . . . . . . . . . . . 17
2.1.5 Variables s alaires : De laration . . . . . . . . . . . . . . . . . . . . . 17
2.1.6 Initialisation a la de laration . . . . . . . . . . . . . . . . . . . . . . 19
2.1.7 Con ept de sous-type : pre ision des nombres . . . . . . . . . . . . . 19
2.1.8 Constantes litterales d'un type intrinseque . . . . . . . . . . . . . . . 20
2.1.9 Fon tions intrinseques liees au sous-type . . . . . . . . . . . . . . . . 21

3
4 
TABLE DES MATIERES

2.2 Unite de programme et pro edures . . . . . . . . . . . . . . . . . . . . . . . 22


2.2.1 Introdu tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22
2.2.2 Programme prin ipal . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.3 Pro edures externes . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
2.2.4 Module . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 24
2.2.5 Pro edure interne . . . . . . . . . . . . . . . . . . . . . . . . . . . . 25

3 Stru ture de ontr^ole 27


3.1 Introdu tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2 Constru tion DO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
3.2.1 Clause de ontr^ole iterative . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.2 Clause de ontr^ole WHILE . . . . . . . . . . . . . . . . . . . . . . . 28
3.2.3 Clause de ontr^ole vide . . . . . . . . . . . . . . . . . . . . . . . . . 29
3.2.4 Utilisation de bou les etiquetees . . . . . . . . . . . . . . . . . . . . 30
3.2.5 Quelques pre autions . . . . . . . . . . . . . . . . . . . . . . . . . . . 31
3.3 Constru tion CASE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
3.3.1 Quelques remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . 33

4 Types derives 35
4.1 Introdu tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 35
4.2 De nition et de laration de stru ture . . . . . . . . . . . . . . . . . . . . . . 35
4.2.1 De nition du type PERSONNE . . . . . . . . . . . . . . . . . . . . . 35
4.2.2 De laration d'un objet de type PERSONNE . . . . . . . . . . . . . . 36
4.2.3 Tableau de type derive . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3 Constru teur de stru ture . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.3.1 Constante litterale de type PERSONNE . . . . . . . . . . . . . . . . 36

TABLE DES MATIERES 5

4.3.2 Initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 36
4.4 Operateur d'a es a une omposante . . . . . . . . . . . . . . . . . . . . . . 37
4.5 Operateurs sur des objets de type derive . . . . . . . . . . . . . . . . . . . . 37
4.6 Attribut SEQUENCE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.7 Type derive et pro edures . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.8 Quelques limites d'utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . 40
4.9 Type derive - Langage oriente objet . . . . . . . . . . . . . . . . . . . . . . 41

5 Extensions tableaux 43
5.1 Introdu tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.1.1 De nition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 43
5.1.2 De laration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2 Sto kage en memoire d'un tableau . . . . . . . . . . . . . . . . . . . . . . . 44
5.3 Constru teur de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.4 Manipulation de tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.4.1 Manipulation globale d'un tableau . . . . . . . . . . . . . . . . . . . 46
5.4.2 Manipulation de se tions de tableaux . . . . . . . . . . . . . . . . . 46
5.5 Tableau en argument de pro edure . . . . . . . . . . . . . . . . . . . . . . . 47
5.5.1 Tableau a pro l impli ite . . . . . . . . . . . . . . . . . . . . . . . . 47
5.5.2 Se tion de tableau en argument de pro edure . . . . . . . . . . . . . 49
5.5.3 Tableau de taille nulle . . . . . . . . . . . . . . . . . . . . . . . . . . 50
5.6 Gestion de memoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.6.1 Tableaux automatiques . . . . . . . . . . . . . . . . . . . . . . . . . 51
5.6.2 tableaux dynamiques(allo atable, pro l di ere) . . . . . . . . . . . . 52
5.7 Instru tion et onstru tion WHERE . . . . . . . . . . . . . . . . . . . . . . 53
5.8 Fon tions intrinseques sur les tableaux . . . . . . . . . . . . . . . . . . . . . 54
6 
TABLE DES MATIERES

6 Pointeurs 59
6.1 Introdu tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
6.2 De laration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.3 Etat d'un point pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.3.1 De nitions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
6.3.2 Fon tion intrinseque : ASSOCIATED . . . . . . . . . . . . . . . . . 60
6.4 Allo ation dynamique de memoire . . . . . . . . . . . . . . . . . . . . . . . 60
6.5 Instru tion NULLIFY . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.6 Pointeurs dans les a e tations et les expressions . . . . . . . . . . . . . . . . 61
6.6.1 Operateur "=" . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61
6.6.2 A e tation de pointeur : operateur "=>" . . . . . . . . . . . . . . . 62
6.6.3 Attribut TARGET . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
6.6.4 A e tation de pointeur sur une omposante de stru ture . . . . . . . 63
6.7 Argument de pro edure de type pointeur . . . . . . . . . . . . . . . . . . . . 64
6.8 Resultat d'une fon tion de type pointeur . . . . . . . . . . . . . . . . . . . . 65
6.9 Tableaux de pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.9.1 De nition - De laration . . . . . . . . . . . . . . . . . . . . . . . . . 65
6.9.2 Tableaux utilises omme alias . . . . . . . . . . . . . . . . . . . . . . 66

7 Interfa e 69
7.1 Interfa e de pro edure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
7.1.1 De nition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 69
7.1.2 Erreurs non dete tees a la ompilation : as d'une interfa e impli ite 70
7.1.3 Interfa e "expli ite" : pro edure interne . . . . . . . . . . . . . . . . 71
7.1.4 Interfa e "expli ite" : blo interfa e . . . . . . . . . . . . . . . . . . 71
7.1.5 Interfa e "expli ite" : module . . . . . . . . . . . . . . . . . . . . . . 72

TABLE DES MATIERES 7

7.1.6 Interfa e expli ite : module ave pro edure . . . . . . . . . . . . . . 73


7.1.7 Interfa e expli ite : module ave blo d'interfa e . . . . . . . . . . . 74
7.1.8 Interfa e "expli ite" : 5 as possibles . . . . . . . . . . . . . . . . . . 75
7.1.9 Cas d'interfa e "expli ite" obligatoire . . . . . . . . . . . . . . . . . 75
7.2 Arguments de pro edure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 75
7.2.1 Arguments : attribut INTENT et OPTIONAL . . . . . . . . . . . . 75
7.2.2 Passage d'arguments par mots- les . . . . . . . . . . . . . . . . . . . 76
7.2.3 Pro edure en argument . . . . . . . . . . . . . . . . . . . . . . . . . 76
7.3 Interfa e generique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.3.1 De nition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.3.2 Exemple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 77
7.3.3 t1r et t2r sont deux sous-programmes externes : . . . . . . . . . . 78
7.3.4 t1r et t2r sont deux sous-programmes de module : . . . . . . . . . 79
7.4 Sur hage d'operateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.4.1 De nition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.4.2 Interfa e OPERATOR . . . . . . . . . . . . . . . . . . . . . . . . . . 80
7.4.3 Interfa e ASSIGNMENT . . . . . . . . . . . . . . . . . . . . . . . . 81
7.4.4 Remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83

8 Contr^ole de visibilite 85
8.1 Introdu tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
8.2 Attributs PRIVATE et PUBLIC . . . . . . . . . . . . . . . . . . . . . . . . 85
8.3 Contr^ole de visibilite : type derive . . . . . . . . . . . . . . . . . . . . . . . 87
8.4 Type derive semi-prive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
8.5 Parametre ONLY de l'instru tion USE . . . . . . . . . . . . . . . . . . . . . 89
8 
TABLE DES MATIERES

9 Pro edure re ursive 91


9.1 De nition . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 91
9.2 Clause RESULT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 92

10 Nouveautes sur les E/S 95


10.1 Introdu tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
10.2 E/S sans depla ement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
10.3 Instru tion NAMELIST . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
10.3.1 De laration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
10.3.2 Usage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
10.4 Instru tion INQUIRE par liste de sortie . . . . . . . . . . . . . . . . . . . . 98
10.5 Nouveaux spe i ateurs d'instru tions . . . . . . . . . . . . . . . . . . . . . 99
10.5.1 Instru tion OPEN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
10.5.2 Instru tion INQUIRE . . . . . . . . . . . . . . . . . . . . . . . . . . 100
10.6 Nouveaux des ripteurs d'edition . . . . . . . . . . . . . . . . . . . . . . . . . 100
10.6.1 Des ripteurs d'edition relatifs aux valeurs de type derive . . . . . . . 101

11 Quelques nouvelles fon tions intrinseques 103


11.1 Introdu tion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.2 Pre ision et odage numerique . . . . . . . . . . . . . . . . . . . . . . . . . 103
11.3 Fon tions numeriques elementaires . . . . . . . . . . . . . . . . . . . . . . . 104
11.3.1 Ave onversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
11.3.2 Sans onversion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
11.4 Fon tions elementaires de type ara tere . . . . . . . . . . . . . . . . . . . . 104
11.4.1 Conversion entier- ara tere . . . . . . . . . . . . . . . . . . . . . . . 104
11.4.2 Manipulation de ha^ne de ara teres . . . . . . . . . . . . . . . . . . 104

TABLE DES MATIERES 9

11.4.3 Fon tions de omparaison lexi ale . . . . . . . . . . . . . . . . . . . 105


11.4.4 Transformation pour les manipulations de ha^nes de ara teres . . . 105
11.5 Horloge en temps reel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
11.6 Fon tions de generation de nombres aleatoires . . . . . . . . . . . . . . . . . 106
10 
TABLE DES MATIERES
Chapitre 1

Introdu tion

1.1 Historique

Dans les debuts de l'informatique, la programmation etait un exer i e fastidieux et peu


able. Puis au bout d'un ertain temps, une odi ation dire te des instru tions ma hines,
onnue sous le nom de ode assembleur t son apparition. Dans les annees 50, il devint
evident que ette fa on de programmer etait de nouveau mal ommode.

On forma alors une equipe dirigee par John Ba kus de la so ite IBM, en vue de
developper un langage de programmation simple a omprendre et aussi e a e, ou presque
qu'un langage d'assemblage. Ce f^ut la naissan e du langage Fortran (FORmula TRANslation).
Les programmeurs etaient soulages (presque ! !) du fardeau que representait l'usage de l'as-
sembleur et pouvaient se on entrer sur leur probleme.

Inevitablement les diale tes du langage apparurent et furent a l'origine de problemes de


portabilite. Ainsi, en 1966, L'Ameri an Standard Asso iation ( e qui devait devenir l'Ame-
ri an National Standard Institute, ANSI) emit la premiere norme on ernant un langage de
programmation onnue sous le nom de Fortran 66. Il s'agissait de l'interse tion de tous
les diale tes.

La proliferation de diale tes demeura un probleme apres la publi ation de la norme


Fortran 66. Cette situation, ombinee a un ertain nombre d'imperfe tions du langage, en-
gendra l'apparition d'un grand nombre d'outils appeles prepro esseurs destines a produire
a partir d'un ode sour e e rit dans un diale te, un programme en Fortran normalise. Ces
programmes etaient bien souvent di iles a lire. Ces problemes furent en partie resolus

11
12 CHAPITRE 1. INTRODUCTION

par la publi ation d'une nouvelle norme, en 1978, onnue sous le nom de Fortran 77. La
periode de transition entre les deux normes fut plus longue qu'elle n'aurait d^u l'^etre, du
fait de retards dans la sortie des nouveaux ompilateurs et les deux normes oexisterent
longtemps.

Dans le milieu des annees 80, la re onversion a Fortran 77 etait bien engagee alors que
Fortran 66 perdait onsiderablement du terrain.

Apres 30 ans d'existen e, Fortran n'est plus le seul langage de programmation dispo-
nible sur les ordinateurs. Il est reste predominant dans le domaine du al ul numerique a
l'usage des her heurs, des te hni iens et des ingenieurs. Dans le but de maintenir le langage
orre tement a jour, le Comite te hnique X3J3 a redite par l'ANSI a elabore une nouvelle
norme onnue sous le nom de Fortran 90.

1.2 Nouveautes de la norme Fortran90


S'il s'agissait de normaliser les extensions proposees par les onstru teurs, la nouvelle
norme est avant tout un developpement du langage qui introduit pour Fortran des a-
ra teristiques nouvelles issues des progres en matiere de on eption de langage, es a-
ra teristiques etant deja experimentees par d'autres langages tels que APL,ALGOL, PAS-
CAL, ADA, C ... En 1994, on voit appara^tre les premiers ompilateurs CRAY et IBM.

Les nouveautes les plus notables orrespondent a la possibilite :


{ de manipuler des tableaux au moyen d'une notation aussi puissante que on ise.
{ de manipuler des types de donnees de nis par l'usager et bien adaptes a ses appli a-
tions.
{ d'e e tuer une allo ation dynamique de la memoire.
D'autres nouveautes permettent d'a ro^tre les possibilites de realiser une programmation
s^ure et stru turee.

Voi i un resume des nouveautes :


{ Modules destines a ontenir des de nitions donnees globales et des bibliotheques de
pro edures.
{ Pro edure interne (CONTAINS) et pro edures re ursives.
{ Nouveau format pour le ode sour e : format libre, identi ateur, de laration," !",
"&", " ;".
{ Parametrisation des types intrinseques.
Choix de la pre ision des nombres par le parametre KIND =) portabilite
{ Objets de types derives et operations sur es types (Identique a stru t en C).

1.3. CARACTERISTIQUES 
OBSOLETES DE LA NORME FORTRAN90 13

{ Nouvelles stru tures de ontr^ole : DO...ENDDO, SELECT CASE, WHERE.


{ Extensions tableaux : pro l, onforman e, manipulation, fon tions intrinseques.
{ Pointeurs (Identique a C ave un fon tionnement un peu di erent)
{ Allo ation dynamique de memoire (Identique a mallo en C).
{ Arguments : OPTIONAL, INTENT, PRESENT. Passage par mot- le.
{ Blo interfa e, interfa e generique, sur harge d'operateurs.
{ Quelques ameliorations dans les E/S
{ Nouvelles fon tions intrinseques
{ Obsoles en e de ertaines ara teristiques dete tees par le ompilateur

On a la ompatibilite as endante entre Fortran 77 et Fortran 90. La norme For-


tran 90 favorise une logique de programmation utilisant une stru ture de blo s.
Remarques : L'attribut SAVE est automatiquement donne aux variables initialisees a la
de laration ou par DATA.

1.3 Cara teristiques obsoletes de la norme Fortran90


On designe par ara teristiques obsoletes, les ara teristiques qui sont su eptibles d'^etre
eliminees lors d'une pro haine phase de normalisation. Ce sont des ara teristiques redon-
dantes et pour lesquelles une meilleure methode peut ^etre utilisee.

 IF arithmetique.
 Bran hement sur une instru tion ENDIF depuis l'exterieur.
 Variation de la syntaxe d'une bou le DO
{ Partage d'une m^eme instru tion par plusieurs bou les DO.
{ Fins de bou le DO autres que CONTINUE ou ENDDO.
{ Variables d'indi e et instru tions de ontr^ole reels simple ou double pre ision.
 Instru tion ASSIGN et l'instru tion GOTO assigne.
 ASSIGN d'une etiquette de FORMAT.
 Instru tion RETURN multiple.
 Instru tion PAUSE.
 Des ripteur d'edition H.

1.4 E volution vers la norme Fortran95


Le pro essus de normalisation se poursuit mais les apports de la norme Fortran95 sont
mineurs. Des extensions sont proposes pour une adaptation aux ma hine paralleles dis-
14 CHAPITRE 1. INTRODUCTION

tribuees.
{ Instru tion et onstru tion FORALL,
{ les attributs PURE et ELEMENTAL pour les pro edures sans e et de bord,
{ la fon tion intrinseque NULL() pour for er un pointeur a l'etat non asso ie,
{ fon tion utilisateur dans les expressions de spe i ation,
{ extension de la onstru tion WHERE : blo s imbriques,
{ fon tion intrinseque CPU TIME,
{ liberation des tableaux dynamiques lo aux n'ayant pas l'attribut SAVE,
{ initialisation par defaut pour les objets de type derive,
{ extension des fon tions intrinseques CEILING, FLOOR,MAXLOC, MINLOC,
{ Commentaire dans les spe i ations de NAMELIST,
{ modi ations pour s'adapter a IEEE 754/854.

1.5 Cara teristiques obsoletes de la norme Fortran95


En raison des gros investissements de developpement de logi iels en Fortran, X3J3
et WG5 ont de ide d'in lure la presque totalite de la norme Fortran90. Les seules a-
ra teristiques de Fortran90 qui disparaissent de la norme Fortran90 sont les suivantes :
{ Le format xe du ode sour e,
{ le IF arithmetique,
{ n de bou le DO autre que END DO ou CONTINUE,
{ l'instru tion RETURN se ondaire rempla e par une onstru tion CASE,
{ GO TO al ule rempla e par une onstru tion CASE,
{ fon tion instru tion rempla e par les fon tions internes,
{ l'instru tion DATA pla ee au sein des instru tions exe utables,
{ le type hara ter(len=*) de longueur impli ite en retour de fon tion,
{ le type hara ter* dans les de larations.

1.6 Cara teristiques supprimees de la norme Fortran95


Fortran90 ontient l'integralite de Fortran77, par ontre ertaines ara teristiques ont
ete supprimees de la norme Fortran95 :
{ Index de bou le DO en reel et double pre ision,
{ bran hement a l'instru tion END IF depuis l'exterieur du blo IF - ENDIF,
{ instru tion PAUSE,
{ instru tions ASSIGN et GO TO assigne,
{ des ripteur d'edition nH.
Chapitre 2

Generalites

2.1 Elements syntaxiques

2.1.1 Les identi ateurs

Les noms utilises pour designer les di erentes entites sont des suites de 1 a 31 a-
ra teres alphanumeriques (lettres, hi res, "unders ore") dont le premier doit ^etre
une lettre.
On ne distingue pas les minus ules et les majus ules.

Il n'y a pas de mot reserve en Fortran 90. Dans l'absolu, on peut utiliser les mots-
les omme REAL, INTEGER, IF ... omme identi ateurs. Ce qui n'est pas onseille au
regard de la lisibilite du ode.

Exemples :

{ Noms valides en Fortran 90 :

a
A_thing
X1
REAL
TIME_OF_FLIGHT
{ Noms non valides :

15
16  ERALIT
CHAPITRE 2. GEN  
ES

1A ar le premier ara tere est un hi re


un prix ar il ontient un ara tere blan
$SIGNE ar il ontient un ara tere non alphanumerique

2.1.2 Formats du ode sour e


Format libre :
Fortran 90 o re un nouveau format d'e riture de ode sour e.

{ les instru tions d'un programme sont e rites sur des lignes d'au plus 132 ara teres.
{ les ara teres blan s en t^ete de ligne ne sont pas signi atifs.
{ Il est possible de oder plusieurs instru tions sur la m^eme ligne.
{ Une instru tion peut ^etre odee sur plusieurs lignes, on utilisera alors le ara tere
esperluette "&".
{ Lors de la oupure d'une ha^ne de ara teres, la suite de la ha^ne de ara teres doit
^etre pre edee par "&".
Exemples :

Format xe :
Le format xe de Fortran 90 orrespond a l'an ien format du Fortran 77 ave deux
extensions :
{ plusieurs instru tions possibles sur une m^eme ligne,
{ nouvelle forme de ommentaire (voir plus loin).
Son prin ipal inter^et est d'assurer la ompatibilite ave Fortran 77.

2.1.3 Commentaires
Fortran 90 o re la possibilite d'inserer des ommentaires dans les instru tions. Le hamp
de ommentaire devra ommen er par le ara tere " !", et se termine a la n de la ligne.

Quelques regles :
{ toute ligne dont le premier ara tere autre que le ara tere blan est " ! " est onsidere
omme un ommentaire,
{ un ommentaire peut ontenir n'importe quel ara tere en parti ulier "&". Par onsequent,
un ommentaire ne peut avoir de suite,

2.1. ELEMENTS SYNTAXIQUES 17

{ une ligne ommentaire peut ^etre inter alee entre des lignes suites.

Attention :
C Commentaire Fortran 77
Commentaire Fortran 77
? Commentaire Fortran 77
ne sont pas des ommentaires en Fortran 90 (format libre) et provoquent des erreurs a la
ompilation.

Exemples :

! on lit l'exposant
read*,x
! on lit la base
read*,y
if (y <= 0) then ! Cas d'erreur
print*,'la base y doit etre positive'
else
z=y**x ! On al ule la puissan e
end if ! fin de la bou le if (y <= 0)

2.1.4 Con ept de type en Fortran 90


En Fortran 90, il est possible de de nir et de manipuler di erents types de donnees,
haque type possedant son propre jeu de onstantes litterales. Des variables s alaires
nommees de e type seront mises en servi e. Leurs valeurs pourront ^etre de nies ou
inde nies (unde ned), 'est-a-dire ne pas avoir de valeur previsible. Il est possible de
reer des onstantes nommees dont les valeurs ne hangeront pas pendant l'exe ution du
programme.
Le langage ontient 5 types de donnees prede nis onnus sous le nom de types in-
trinseques. Chaque type intrinseque admet un sous-type par defaut et un ertain
nombre d'autres sous-types qui dependent de l'ordinateur.
Il est possible de de nir de nouveaux types de donnees a partir d'un groupe de
donnees appartenant a des types intrinseques.

2.1.5 Variables s alaires : De laration


La forme generale de la de laration d'une variable est la suivante :
18  ERALIT
CHAPITRE 2. GEN  
ES

type[[,liste attributs : : liste objets

Les di erents types :


{ real
{ integer
{ double pre ision
{ omplex
{ hara ter
{ logi al
{ type(nom de type) : type de ni par l'utilisateur.

Les di erents attributs :


parameter onstante litterale
dimension taille d'un tableau
allo atable objet dynamique
pointer objet de ni omme pointeur
target objet a essible par un pointeur ( ible)
save objet statique
intent mode d'un argument formel
optional argument formel fa ultatif
publi ou private visibilite d'un objet de ni dans un module
external ou intrinsi nature d'une pro edure

Exemples :

integer nb ol,nblign
real val1,val2
integer,save :: ompteur
integer,parameter :: n=5
double pre ision a(100)
double pre ision,dimension(100) :: a
omplex,dimension(-1:3,0:5) ::
real, dimension(:),pointer :: ptr

Typage par defaut :


Les regles sont les m^emes qu'en Fortran 77. Pourtant il est vivement re ommande d'uti-
liser l'instru tion IMPLICIT NONE qui impose a l'utilisateur la de laration de haque
variable. Un ertain nombre d'erreurs pourront ^etre ainsi dete tees a la ompilation.

2.1. ELEMENTS SYNTAXIQUES 19

2.1.6 Initialisation a la de laration

Il est possible d'initialiser une variable au moment de sa de laration. L'initialisation est
obligatoire lorsque l'objet a l'attribut parameter.

Exemples :

real somme=0.
integer, parameter :: n=5
integer,dimension(3) :: nbr=(/1,6,3/)

Attention :
En Fortran 77 toute variable initialisee n'est permanente que si l'attribut save ou pa-
rameter a ete spe i e pour ette variable, ou bien si la ompilation a ete faite en mode
stati .
Par ontre en Fortran 90, toute variable initialisee a la de laration re oit impli itement
l'attribut save.

2.1.7 Con ept de sous-type : pre ision des nombres

Les types intrinseques en Fortran 90 sont en fait des noms generiques renfermant ha un
un ertain nombre de sous-types que l'on peut sele tionner a l'aide du parametre KIND
lors de la de laration des objets.
Ce parametre est un mot- le a valeur entiere qui designe le sous-type souhaite pour un
type donne.

Les di erentes valeurs du parametre KIND sont dependantes du systeme utilise. Elles
orrespondent en general, au nombre d'o tets desires pour oder l'objet de lare. L'ordre de
grandeur et la pre ision sont garantis si l'on spe i e un parametre de sous-type.

A haque type orrespond un sous-type par defaut, sele tionne en l'absen e du parametre
KIND dans la de laration : 'est par exemple, la simple pre ision pour les reels.

En e qui on erne les ha^nes de ara teres, ette valeur indique le nombre d'o tets utilises
pour oder haque ara tere.

Exemples :
20  ERALIT
CHAPITRE 2. GEN  
ES

real(kind=8) x Reel double pre ision sur IBM RS/6000


et simple pre ision sur Cray .
integer(kind=2),target : : i Equivalent a integer*2 en Fortran 77.

2.1.8 Constantes litterales d'un type intrinseque


Il est possible d'indiquer le sous-type desire lors de l'e riture des onstantes litterales
d'un type intrinseque. Il sut pour ela de les suxer pour les onstantes numeriques
ou de les pre xer pour les onstantes ha^nes de ara teres, par la valeur du sous-type
voulu en utilisant le ara tere " " omme separateur.

Exemples :
{ entiers :
1 ! sous-type par defaut
-999 ! sous-type par defaut
72
{ reels :
1.0 ! sous-type reel simple pre ision
1.d0 ! sous-type reel double pre ision
1.0 8
integer, parameter : : styp=4
275.2 styp
{ omplexe :
(1.,3.2) ! sous-type par defaut
(1,.99E-2)
(1.0,3.7 4)
{ ara tere :
'une table' ! sous-type par defaut
'unetable' ! sous-type par defaut
'Il dit "bonjour"' ! sous-type par defaut
1 'prenom'
2 'prenom'
integer,parameter : : kanji=2
kanji ' '
L'alphabet "kanji" ontient plus de ara teres qu'il n'est possible d'en oder sur un
seul o tet.
{ logique

2.1. ELEMENTS SYNTAXIQUES 21

.false. ! sous-type par defaut


.false. 2
integer,parameter : : long=2
.false. long

2.1.9 Fon tions intrinseques liees au sous-type


Si dans la plupart des implementations, la valeur du parametre de sous-type indique le
nombre d'o tets o upes par une valeur, la norme n'est pas aussi rigide et impose unique-
ment a e parametre de ne pas ^etre negatif.

Fortran 90 fournit des fon tions intrinseques qui permettent de rendre portable les
hoix de pre isions et d'etendue faits dans un programme.

 kind(a) : renvoie la valeur du parametre de sous-type de l'argument a.


Exemples :
kind(1.O) : valeur asso iee au sous-type reel simple pre ision.
kind(1.Od0) : valeur asso iee au sous-type reel double pre ision.
real(kind=kind(1.0d0)) : de lare un reel double pre ision sur n'importe quelle ma hine.

 sele ted int kind(r) : re oit en argument un entier r et retourne un parametre de sous-
type permettant de representer les entiers n tels que :
10r < n < 10r
Elle retourne -1 si au un parametre de sous-type ne repond a la demande.

Exemples :

sele ted_int_kind(30) retourne -1


sele ted_int_kind(8)

 sele ted real kind(p,r) : Re oit deux arguments p et r qui sont respe tivement la
pre ision et l'etendue desirees et renvoie un parametre de sous-type permettant
de representer les reels repondant a la demande. Un seul de es deux arguments est
obligatoire.

La fon tion renvoie :


{ -1 si la pre ision demandee n'est pas disponible.
22  ERALIT
CHAPITRE 2. GEN  
ES

{ -2 si l'etendue n'est pas disponible


{ -3 si la pre ision et l'etendue ne sont pas disponibles.

Exemples :
a=sele ted_real_kind(8)
b=sele ted_real_kind(9,99)
integer, parameter :: pre = &
sele ted_int_kind(12,50)
real(kind=pre ),save :: x
real(pre ), save :: x
x=234.56_pre

En outre, il existe deux fon tions d'interrogation qui retournent respe tivement la pre ision
et l'etendue d'une entite reelle.
 range(a) : re oit un entier ou un reel et retourne pour le sous-type asso ie la valeur
minimale r telle que :
j
entier j < 10r
10 r
< j 
r eel j < 10
r

 pre ision(a) : re oit un reel et retourne la pre ision de imale ( nombre de hi res signi-
atifs de imaux) pour le sous-type asso ie.

Exemples :
range(5_2)
range(1.0d0)
range(1._8)
pre ision(1.0)
pre ision(1.0d0)

2.2 Unite de programme et pro edures


2.2.1 Introdu tion
A tuellement, la ne essite de de omposer un programme en plusieurs parties est generalement
admise.
En Fortran 90, ha une de es parties, appellee unite de programme, sera soit un
programme prin ipal, soit une pro edure externe, soit un module, et sera ompilee
separement.
 DE PROGRAMME ET PROCEDURES
2.2. UNITE  23

 Un programme omplet doit au moins ontenir un programme prin ipal.


 Une pro edure de nit une fon tion ou un sous-programme. Elle pourra ^etre :
{ une unite de programme. Il s'agit d'une pro edure externe. Elle pourra ^etre
onstruit ave d'autres langages que Fortran.
{ un element d'un ensemble de pro edures omposant une unite de programme ap-
pelee module. Il s'agit d'une pro edure de module
{ a l'interieur d'une pro edure de module, d'une pro edure externe ou d'un pro-
gramme prin ipal. Il s'agit dans e as d'une pro edure interne.
 Un module peut ontenir, outre un ensemble de pro edures, des de nitions de donnees,
des types derives, des blo s d'interfa es. Il peut ^etre utilise pour fournir des fa-
ilites autour d'un theme tel que le al ul matri iel, la gestion de donnees,...
 Une unite de programme ontenant une pro edure interne est appelee unite h^ote.

2.2.2 Programme prin ipal

Un programme prin ipal a la forme suivante :

[PROGRAM nom-programme
[instru tions de spe i ation
[instru tions exe utables
[CONTAINS
pro edures internes
END [ PROGRAM [nom-programme
{ L'instru tion PROGRAM est fa ultative ( onseillee)
{ L'instru tion END qui genere l'arr^et du programme est la seule instru tion non fa-
ultative. Si elle ontient un hamp nom-programme, il devra orrespondre a elui
present dans l'instru tion PROGRAM. Elle peut ^etre etiquetee et ^etre la ible d'une
instru tion de bran hement (a eviter).
{ Les instru tions de spe i ation peuvent ^etre des instru tions de de laration, des
de nitions de type, des blo s INTERFACE.
{ L'instru tion CONTAINS indique la presen e d'une ou plusieurs pro edures.

2.2.3 Pro edures externes

La pro edure externe est appelee depuis une autre unite de programme. Elle a une forme
similaire a elle du programme prin ipal.
24  ERALIT
CHAPITRE 2. GEN  
ES

instru tion subroutine


[instru tions de spe i ation
[instru tions exe utables
[CONTAINS
pro edures internes
END [ SUBROUTINE [nom-de-sous-routine
ou
instru tion-fun tion
[instru tions de spe i ation
[instru tions exe utables
[CONTAINS
pro edures internes
END [ FUNCTION [nom-de-fon tion
Exemple :

program jeu
....
all battre
all distribuer
all jouer
all affi her
end program jeu

Comment le programme "jouer" peut-il onna^tre le jeu fourni par "distribuer".


En Fortran 90, on utilisera deux types de methodes :
{ utiliser les arguments dans les appels (identique a Fortran 77)
{ utiliser la gestion des donnees au niveau d'un module.
L'emploi des modules permet d'eviter ompletement l'usage de l'instru tion COMMON et
des blo s ommuns.

2.2.4 Module
La forme generale d'un module est la suivante :

MODULE nom du module


[instru tions de spe i ation
[CONTAINS
sous-programmes de module
END [ MODULE [nom-de-module
 DE PROGRAMME ET PROCEDURES
2.2. UNITE  25

Exemple :

module etat
integer,dimension(52) :: artes
end module etat

Un module est a essible gr^a e a l'instru tion USE.


Les modules sont utiles pour :
 Les donnees globales
Reprenons le programme du jeu de artes et onsiderons le module etat pre edemment
de ni. L'instru tion " USE etat" pla ee au debut des sous-programmes "battre,
distribuer, jouer et a her rend a essible le tableau " artes" dans ha un de
es sous-programmes.
 L'en apsulation des types derives et des operateurs asso ies a es types
derives.( f hapitre "Interfa e")
 Contr^oler l'a essibilte des entites en rendant "privees" ertaines d'entre elles.
(Cf hap^tre "Contr^ole de visibilite").
Une pro edure de module a la m^eme forme qu'une pro edure externe. Elle a a es a
toutes les entites du module.
Un module peut a eder a d'autres modules par une instru tion USE.

2.2.5 Pro edure interne


On peut de nir une pro edure interne dans le programme prin ipal, dans une pro edure
externe et en n dans une pro edure de module.

Les pro edures internes sont de la forme :


instru tion-fun tion
[instru tions de spe i ation
[instru tions exe utables
END FUNCTION [nom-de-fon tion
ou

instru tion-subroutine
[instru tions de spe i ation
[instru tions exe utables
END SUBROUTINE [nom-de-fon tion
{ Une pro edure interne ne peut pas ontenir de pro edure interne.
26  ERALIT
CHAPITRE 2. GEN  
ES

{ Une pro edure interne a a es a toutes les entites de l'unite h^ote, elle peut en parti-
ulier appeler toutes les pro edures internes.
Chapitre 3

Stru ture de ontr^


ole

3.1 Introdu tion


Dans la plupart des traitements, une simple sequen e d'instru tions est inadaptee a la
formulation du probleme. Nous pouvons vouloir :
{ lorsqu'un traitement est repetitif, l'obtenir par iteration d'une seule instru tion.
{ passer le ontr^ole de l'exe ution a une partie d'un programme depuis une autre partie
du programme.
{ arr^eter l'exe ution.
Ces fa ilites, ne essaires dans un langage de programmation moderne, existaient deja
dans la norme Fortran 77 (bou le DO, instru tion et onstru tion IF, GOTO...).
Leur forme generale est elle d'une onstru tion en "blo " qui :
{ debute par une instru tion presentant un mot- le initial,
{ plusieurs instru tions presentant des mots- les intermediaires,
{ se termine par une instru tion presentant un mot- le nal asso ie au mot- le initial.
Chaque suite d'instru tions pla ee entre deux instru tions mots- les est appelee blo . Un
blo peut ^etre vide.
Les onstru tions exe utables peuvent ^etre emboitees, -a-d un blo peut ontenir une autre
onstru tion exe utable et dans e as, il la ontiendra integralement.
La norme Fortran 90 apporte quelques ameliorations des ara teristiques existantes (bou le
DO) et fournit un nouveau type de onstru tion, la onstru tion CASE.

3.2 Constru tion DO


La resolution de nombreux problemes mathematiques ne essite des iterations. La norme
Fortran 77 fournissait la onstru tion DO ave l'instru tion CONTINUE etiquetee omme

27
28 ^
CHAPITRE 3. STRUCTURE DE CONTROLE

instru tion nale. La nouvelle syntaxe de la onstru tion DO elimine l'instru tion CONTI-
NUE etiquetee.

La syntaxe generale est la suivante :

[nom : DO [ lause de ontr^ole


blo
ENDDO [nom

3.2.1 Clause de ontr^ole iterative


[nom : DO variable = expr1, expr2[, expr3
blo
ENDDO [nom

variable : nom d'une variable entiere.


expr1,expr2,expr3 : trois expressions s alaires entieres.
Les onstru tions DO et ENDDO doivent porter le m^eme nom ou ne pas avoir de nom.

Exemple :
do i=j+4,m,l(j)**2
somme=somme+a(i)
enddo

Remarque : Le nombre d'iterations est egal a :


expr 2 expr 1 + expr3
max( ; 0)
expr 3

3.2.2 Clause de ontr^ole WHILE


[nom : DO WHILE expression logique
blo
ENDDO [nom

Exemple :
3.2. CONSTRUCTION DO 29

somme=0.; i=1
vrai: do while (tab(i) >= 0.)
somme=somme+sqrt(tab(i))
enddo vrai

3.2.3 Clause de ontr^ole vide


[nom : DO [expression-logique
blo
ENDDO [nom

Exemple :
read(unit=11,iostat=eof) a
do while (eof ==0)
...
read(unit=11,iostat=eof) a
...
enddo

Instru tion EXIT :

Lorsque "expression-logique" est absente, on est en presen e d'une bou le in nie. Il faut
un moyen pour sortir de ette bou le.
L'instru tion EXIT permet de sortir d'une onstru tion DO.

EXIT [nom

[nom : est optionnel et permet de spe i er la onstru tion dont on veut sortir
dans le as de plusieurs onstru tions emboitees.
Exemple :
do
read*,nombre
if ( nombre == 0) exit
somme=somme+nombre
enddo
30 ^
CHAPITRE 3. STRUCTURE DE CONTROLE

Instru tion CYCLE

L'instru tion CYCLE transfere le ontr^ole de l'exe ution a l'instru tion ENDDO de la
onstru tion DO on ernee.

CYCLE [nom

Exemple :

do
read*,nombre
if ( eof /= 0) exit
if ( x <= 0.) y le
somme=somme+log(x)
enddo

3.2.4 Utilisation de bou les etiquetees

Exemple1 :

impli it none
integer :: i,l,m
real,dimension(10) :: tab
real :: som,som_max,res
!
som=0.0
som_max=1567.
exter: do i=1,n
read*,m,tab(1:m)
do i=1,m
all al ul(tab(i),res)
if (res < 0.) y le
somme=somme+res
if (somme > som_max) exit exter
enddo
enddo exter
3.2. CONSTRUCTION DO 31

Exemple2 :

b1: do i=1,n
do j=1,m
all sp(i+j,r)
if ( r < 0.) y le b1
enddo
enddo b1

3.2.5 Quelques pre autions


{ Deux onstru tions DO peuvent ^etre emboitees a ondition que l'etendue de la bou le
interieure soit ompletement ontenue dans elle de la bou le exterieure,
{ il est illegal d'e e tuer un bran hement a l'exterieur d'un blo DO vers l'interieur
d'un blo DO,
{ il est illegal pour une onstru tion DO (IF, CASE ou WHERE egalement) de n'^etre
que partiellement ontenue dans le blo d'une autre onstru tion.
{ de nombreuses petites bou les peuvent ^etre e rites de meilleure fa on en utilisant les
expressions ou a e tations portant sur les tableaux.

Mais ATTENTION a :

 l'ordre des iterations :


do i=1,n
a(i)=a(i-1)+7 ne peut ^etre rempla e par a(2 :n)=a(1 :n-1)+7
enddo
 l'utilisation des indi es de bou le :
Considerons la bou le suivante :

do i=1,n
...
if(i .eq. j) exit
...
enddo
l : valeur de l'indi e a la sortie de la bou le.
si n  0 la bou le n'est pas exe utee.
l=1
si n  j la sortie de bou le intervient au niveau de l'instru tion IF.
32 ^
CHAPITRE 3. STRUCTURE DE CONTROLE

l=j
si 0  n < j la bou le est e e tuee n fois.
l=n+1
Cet exemple indique a quel point il faut utiliser ave pre autions les indi es de bou le
a l'exterieur de la bou le.

3.3 Constru tion CASE


Fortran 90 fournit un moyen voisin de la onstru tion IF, pour hoisir une option parmi
plusieurs.
Le test porte sur la valeur unique d'une expression qui appartient a un ensemble unique
(les ensembles sont disjoints) d'une serie d'ensembles prede nis de valeurs.

[nom : SELECT CASE (expr)


[CASE sele teur [nom
blo ...
END SELECT [nom

expr : s alaire de type ara tere, logique ou entier.


sele teur : liste de valeurs ou d'intervalles disjoints, tous du m^eme type que expr.
Exemples :
ase(1)
ase(10 :20)
ase('a' :'f')
ase(1,6,9 :15,20)
CASE DEFAULT : liste de toutes les valeurs possibles non in luses dans les autres sele -
teurs de la onstru tion.

Exemples :

sele t ase(nombre)
ase(:-1) ! valeurs stri tement negatives
n_sign=-1
ase(0)
n_sign=0
ase(1:) ! valeurs stri tement positives
n_sign=1
end sele t
3.3. CONSTRUCTION CASE 33

...
sele t ase( h)
ase(' ','d','e')
type_ h=.true.
ase('i':'n')
type_int=.true.
ase default
type_real=.true.
end sele t

3.3.1 Quelques remarques


{ la liste des valeurs d'un sele teur ne peut pas ontenir plusieurs fois la m^eme valeur,
ni des intervalles non disjoints.
{ il ne peut y avoir qu'un sele teur DEFAULT.
{ la lause CASE DEFAULT n'est pas obligatoirement la derniere lause de la onstru -
tion CASE.
{ omme les onstru tions IF, les onstru tions CASE peuvent ^etre emboitees.
{ il n'est pas permis d'e e tuer un bran hement sur une instru tion CASE.
{ un bran hement sur l'instru tion END SELECT doit ^etre fait depuis l'interieur de la
onstru tion CASE qu'elle termine.
34 ^
CHAPITRE 3. STRUCTURE DE CONTROLE
Chapitre 4

Types derives

4.1 Introdu tion


Lorsqu'on programme, il est souvent utile de pouvoir manipuler des objets plus sophis-
tiques que eux fournis par les types intrinseques.
{ tableau : objet regroupant des donnees de m^eme type.
{ objets (stru ture) regroupant des donnees ( hamps ou omposantes) heterogenes.
Chaque omposante est identi ee par son nom.
Pour utiliser de tels objets, l'utilisateur de nit au prealable un type derive qui etend
les types prede nis. Les omposantes d'un objet de type derive peuvent ^etre soit de
type intrinseque soit egalement de type derive.

4.2 De nition et de laration de stru ture


Supposons que notre appli ation distingue haque personne par son nom, son ^age et un
ertain nombre de des ripteurs qui seront sto kes dans un tableau.

4.2.1 De nition du type PERSONNE

Pour utiliser un objet de type derive, la premiere etape onsiste a de nir e type derive.

Exemple :

35
36 
CHAPITRE 4. TYPES DERIV 
ES

TYPE PERSONNE
CHARACTER(LEN=16) : : NOM
REAL : : AGE
INTEGER,DIMENSION(3) : : DESCRIP
END TYPE

4.2.2 De laration d'un objet de type PERSONNE


Pour utiliser un objet de type PERSONNE, on de lare et objet de la fa on suivante :

TYPE(PERSONNE) : : PERS

4.2.3 Tableau de type derive


On peut de nir des tableaux de type derive.

TYPE(PERSONNE),DIMENSION(3) : : TABPERS
...

4.3 Constru teur de stru ture


Un onstru teur de stru ture est une fon tion de m^eme nom que le type derive ayant
pour arguments les valeurs a pla er dans les diverses omposantes.

4.3.1 Constante litterale de type PERSONNE


personne('ursule', 10.,(/2,50,127/))

4.3.2 Initialisation
integer,dimension(3) :: tabdes
type(personne),dimension(2) :: tpers
...
tpers(1)=personne('arsene',67.,(/1,15,154/))
...
tabdes=(/2,7,120/)

4.4. OPERATEUR  A
D'ACCES  UNE COMPOSANTE 37

tpers(2)=personne('eugenie',,80.,tabdes)
...

4.4 Operateur d'a es a une omposante


Chaque omposante d'une variable de type derive peut ^etre designee individuellement
au moyen du ara tere "sele teur de omposante" ( omponent sele tor), le ara tere
"%".

Exemple :
type(personne) :: vous
type(personne),dimension(2) :: tper

vous%nom : designe la omposante nom de l'objet vous.


vous%age : designe la omposante age de l'objet vous.
vous%des rip : designe la omposante des rip de l'objet vous omposee
d'un tableau de 3 entiers.
vous%des rip(1) : designe le premier element de l'objet omposante des rip de la
stru ture vous
tper%nom : est INCORRECT.

4.5 Operateurs sur des objets de type derive


{ Seul l'operateur d'assignation(=) est de ni pour les types derives.
{ Les omposantes d'un objet de type derive peuvent intervenir dans une expression.
{ On verra ulterieurement omment etendre un operateur existant sur des objets de
type derive.

Exemple :
type(personne) :: vous,moi,frere
...
vous=frere ! valide
frere%age=vous%age + 7.
! differen e d'age entre "vous" et "moi"
diff=vous%age - moi%age
38 
CHAPITRE 4. TYPES DERIV 
ES

4.6 Attribut SEQUENCE


Deux de nitions de type gurant dans des unites de portee di erentes de nissent le
m^eme type de donnees (m^eme unite de sto kage) si :
{ elles ont le m^eme nom
{ elles ont toutes deux l'attribut SEQUENCE
{ elles ont les m^emes omposantes non privees qui se orrespondent au niveau de l'ordre,
du nom et des attributs.

Exemple de de nition :

TYPE STOCKAGE
SEQUENCE
INTEGER :: I
REAL :: A(0:999)
END TYPE

Une telle pratique peut ^etre sour e d'erreur et n'o re au un avantage de plus par rap-
port a une de nition unique du type derive dans un module et a son utilisation a l'aide
d'une asso iation par module (USE).

Ne de nir qu'une seule fois un type derive est de loin la meilleure methode
pour eviter un grand nombre d'erreurs.

4.7 Type derive et pro edures


Une stru ture peut ^etre transmise en argument d'une pro edure et une fon tion peut
retourner un resultat de type derive.

Si le type derive n'est pas de ni de maniere unique via un module (maladroit), le type
de l'argument e e tif et le type de l'argument formel doivent :
{ posseder tous les deux l'attribut SEQUENCE, e qui assure un sto kage dans le m^eme
ordre des omposantes en memoire.
{ avoir le m^eme nom et la m^eme nature de omposantes. Mais ils peuvent avoir des
noms de type di erents.

4.7. TYPE DERIV  ET PROCEDURES
E  39

Exemple :
program identifi ation
impli it none
!
type personne
sequen e
hara ter(len=16) ::nom
real :: age
integer,dimension(3) ::des rip
end type
!
type(personne),external :: mise_a_jour
type(personne) ::identif
!
identif=personne('arsene',15,(/10,25,247/))
!
identif=mise_a_jour(identif,1990,1997)
!
stop
end
!
fun tion mise_a_jour(identif,annee1,annee2)
impli it none
integer :: i,annee1,annee2
type pers
sequen e
hara ter(len=16) ::nom
real :: age
integer,dimension(3) ::des rip
end type
type(pers) :: identif,mise_a_jour
!
mise_a_jour%age=identif%age+(annee2-annee1)
end fun tion mise_a_jour

Programmation onseillee : Une seule de nition, dans un module, du type PERSONNE.
module mod_pers
type personne
hara ter(len=16) ::nom
real :: age
integer,dimension(3) ::des rip
40 
CHAPITRE 4. TYPES DERIV 
ES

end type
end module mod_pers
!
program identifi ation
use mod_pers
impli it none
!
type(personne),external :: mise_a_jour
type(personne) ::identif
!
identif=personne('arsene',15,(/10,25,247/))
!
identif=mise_a_jour(identif,1990,1997)
!
stop
end
!
fun tion mise_a_jour(identif,annee1,annee2)
use mod_pers
impli it none
integer :: i,annee1,annee2
type(personne) :: identif,mise_a_jour
!
mise_a_jour%age=identif%age+(annee2-annee1)
end fun tion mise_a_jour

4.8 Quelques limites d'utilisation


{ l'attribut PARAMETER est interdit au niveau d'un hamp,
{ une stru ture est onsideree omme un s alaire, elle peut avoir une omposante qui
est un tableau. On peut onstruire des tableaux de stru ture,
{ l'attribut ALLOCATABLE (voir gestion de memoire) est interdit au niveau d'une
de nition de omposante, il est permis au niveau des tableaux de stru tures,
{ une omposante peut avoir l'attribut POINTER mais pas l'attribut TARGET,
{ l'attribut SEQUENCE pour un type derive est obligatoire si une stru ture est passee
en argument d'une pro edure externe au sein de laquelle une re-de nition de type est
ne essaire (utilisation tres maladroite des objets de type derive).

4.9. TYPE DERIV  - LANGAGE ORIENTE
E  OBJET 41

4.9 Type derive - Langage oriente objet


Pour fa iliter la manipulation des stru tures (objet de type derive) nous verrons qu'il
est possible :

de de nir des fon tions de manipulation de es stru tures :


{ sur harge les operateurs +, -, * ,
{ de nouveaux operateurs en les asso iant aux fon tions orrespondantes,
{ autres fon tions ou pro edures agissant sur es stru tures.
d'en apsuler le type et les fon tions operant sur les objets de e type dans un module
separe. Ce qui permettra d'y a eder fa ilement (USE <module>) en diminuant les
sour es d'erreurs, dans toutes les unites de programme en ayant besoin.
de rendre privee les omposantes de la stru ture. Si la de nition du type se fait dans un
module separe (en apsulation), seules les fon tions ou pro edures internes au module
ont a es aux omposantes privees et peuvent les modi er (se urite).

Sans ^etre un vrai langage oriente objet, Fortran 90 fournit ainsi des extensions objet bien
utiles pour la stru turation du programme et sa abilite.
42 
CHAPITRE 4. TYPES DERIV 
ES
Chapitre 5

Extensions tableaux

5.1 Introdu tion


Fortran est un langage dedie au al ul numerique, il se devait d'o rir dans sa syntaxe,
des fa ilites relatives au al ul ve toriel.
{ simpli ation de l'e riture au niveau programmation,
{ dete tion plus aisee par les ompilateurs des traitements portant sur les tableaux,
{ possibilite pour les ompilateurs de generer du ode objet ave une meilleure optimi-
sation que elle obtenue auparavant ave des bou les DO,
{ a es a un jeu tres omplet d'outils pour le traitement des tableaux (fon tions in-
trinseques et autres...).

5.1.1 De nition


Un tableau est un ensemble d'elements ayant m^eme type et m^eme valeur de parametre
de sous-type.
Un tableau peut ontenir jusqu'a 7 dimensions.

{ Le rang (rank) d'un tableau est son nombre de dimensions.


{ L'etendue du tableau dans une dimension est le nombre d'elements dans ette di-
mension.
{ Le pro l (shape) d'un tableau est un ve teur de rang 1 et d'etendue le rang du tableau
et dont haque element ontient l'etendue dans la dimension orrespondante.
{ La taille (size) du tableau est le produit des etendues sur toutes les dimensions.

Deux tableaux sont dits onformants s'ils ont m^eme pro l.

43
44 CHAPITRE 5. EXTENSIONS TABLEAUX

5.1.2 De laration

Il sut de pre iser l'attribut dimension lors de sa de laration en indiquant :


{ uniquement l'etendue de haque dimension.
real,dimension(5) : : tab
real,dimension(3,4) : : mat
Les elements su essifs de "tab" sont : tab(1),tab(2)...tab(5)
{ la borne superieure et la borne inferieure des indi es pour haque dimension.
real,dimension(-10 :4) : : ve t
" ve t" est un tableau de 15 elements : ve t(-10),ve t(-9),...,ve t(4)

Exemples :
1. real,dimension(-5 :4,0 :2) : : x
x est de rang 2, de pro l(10,3)
2. real,dimension(0 :9,3) : : y
y est de rang 2, de pro l(10,3)

=) x et y sont onformants de taille 30

3. real,dimension(-10 :5,-20 :-1,0 :1,2,2,2,2) : : grille


grille est un tableau de rang 7, de pro l (16,20,2,2,2,2,2) et de taille 16X20X25

4. les s alaires sont onsidedres omme etant de rang 0

5.2 Sto kage en memoire d'un tableau


De nombreuses implementations du langage Fortran rangent dans des zones de memoires
ontigues les elements du tableau selon un ordre obtenu en faisant varier plus vite les
premieres dimensions.

La norme n'impose pas ette methode de rangement en memoire


5.3. CONSTRUCTEUR DE TABLEAUX 45

5.3 Constru teur de tableaux


Il est possible d'initialiser un tableau au moment de sa de laration ou a l'aide d'une
instru tion d'a e tation, au moyen d'un onstru teur de tableau

 Constru teur d'un tableau de rang 1 :


Sa forme generale est :
(/ liste-valeurs- onstru teur /)
ou liste-valeurs- onstru teur est :
{ soit une expression
{ soit une bou le DO-impli ite de la forme
(/ liste-valeurs- onstru teur,variable=expr1,expr2[,expr3 /)
variable : variable nommee
expr1,expr2,expr3 : expressions s alaires entieres
liste-valeurs- onstru teur : expr1,expr2+expr3,...

Exemples :
{ (/2,7,5,1 /)
{ (/ ( I, I=1,4) /) qui produit (/ 1,2,3,4 /)
{ (/( I, I=2,8,2) /) qui produit (/ 2,4,6,8 /)
{ (/ ( I*I,I=1,4) /) qui produit (/ 1,4,9,16 /)
{ embo^tement de bou les DO impli ites
(/ (( I, I=1,3), J=1,2) /) qui produit (/ 1,2,3,1,2,3 /)
{ onstru teur de stru ture a l'interieur de onstru teur de tableaux (et inversement).

 Constru teurs de tableaux de rang > 1:

On peut onstruire un tableau de rang > 1 a l'aide d'un tableau de rang 1 et de


la fon tion intrinseque RESHAPE. (Voir fon tions intrinseques sur les tableaux)

Exemples :
reshape(sour e=(/ 1,2,3,4,5,6 /)), shape=(/ 2,3 /))
e qui donne : !
1 3 5
2 4 6
46 CHAPITRE 5. EXTENSIONS TABLEAUX

5.4 Manipulation de tableaux


5.4.1 Manipulation globale d'un tableau
Fortran90 permet de manipuler globalement des elements d'un tableau.
Plusieurs operateurs ont ete sur-de nis a n d'a epter des objets de type tableau omme
operande.
Pour que deux tableaux interviennent dans la m^eme expression, il faut qu'ils soient onfor-
mants.

Pour manipuler globalement un tableau, on peut :


{ soit indiquer son nom,
{ soit indiquer son nom suivi entre parentheses d'autant de ara teres " :", separes par
des virgules, qu'il y a de dimensions.

Exemples :
real,dimension(3,4) :: a,b
real,dimension(-1:1,-3:0) :: ,d
b=1.
=b.
a=b+1.
d=a(:,:) + b(:,:) + (:,:)

La deuxieme notation a l'avantage d'^etre plus laire.

5.4.2 Manipulation de se tions de tableaux


Il est possible de faire referen e a une partie d'un tableau appelee se tion de tableau.
Cette partie de tableau est egalement un tableau. Les indi es peuvent ^etre de nis par :
{ une suite arithmetique lorsqu'on a une se tion reguliere du tableau initial.
Cette suite arithmetique est de nie par un triplet de la forme :
valeur-min : valeur-max : pas
Exemples :
A(1,1 :N) ! elements des olonnes 1 a N de la ligne 1
A(1, :) ! Integralite de la ligne 1
A( :4,2) ! elements des lignes 1 a 4 de la olonne 2
A(1,1 :N :3) ! elements A(1),A(4),... de la ligne 1

5.5. TABLEAU EN ARGUMENT DE PROCEDURE 47

{ un ve teur d'indi es lorsqu'on a une suite quel onque d'indi es du tableau initial.
L'ensemble des elements est de ni par un ve teur d'indi es dont tous les elements
sont des entiers.

Exemples :
A(IPOINT) ! IPOINT est un tableau d'entiers
A(/1,7,3,2/) ! se tion du tableau A onstitue des elements A(1),A(7),A(3),A(2)
! dans et ordre
Une m^eme valeur peut apparaitre plusieurs fois dans un ve teur d'indi e, on parlera
de se tion non-univoque
Une se tion non-univoque ne doit pas apparaitre dans la partie gau he d'une instru -
tion d'a e tation.

Exemples :
A(/1,7,3,7/)=(/1,2,3,4/) ! illegal

Les valeurs 2 et 4 ne peuvent ^etre toutes les deux a e tees a V(7).

5.5 Tableau en argument de pro edure


5.5.1 Tableau a pro l impli ite

Lorsque l'on passe un tableau en argument d'une pro edure, il est souhaitable qu'argument
formel et argument e e tif aient m^eme pro l.
En Fortran77, la solution etait de transmettre les etendues des dimensions omme argu-
ments supplementaires (Si le tableau etait de dimension r, les etendues des r-1 premieres
dimensions susaient, la derniere n'intervenant pas dans le al ul d'adresse).

En Fortran90, il est possible de demander que l'argument formel endosse automati-


quement le pro l de l'argument e e tif.

Pour ela, il faut que l'interfa e soit expli ite (voir dans le hap^tre "Interfa e" les
di erentes methodes pour de nir une interfa e expli ite). Ce qui signi e que le ompilateur
onnait un ertain nombre de renseignements au moment de l'appel de la pro edure (type
de pro edure, proprietes des arguments et du resultat dans le as d'une fon tion) et qu'il
48 CHAPITRE 5. EXTENSIONS TABLEAUX

puisse e e tuer les dedu tions ne essaires.

Un tableau passe de ette maniere en argument d'une pro edure s'appelle un tableau a
pro l impli ite (assumed-shape array).

Exemple :
program stat
integer,parameter :: n=100
real,dimension(n) :: x
real :: moy,std
integer :: tl
! Definition de l'interfa e du sous-programme stat
interfa e
subroutine stat(x,n,moy,std, tl)
real,dimension(:,:) :: x
real :: moy,std
integer :: n, tl
end subroutine stat
end interfa e
...
all stat(x,n,moy,std, tl)
...
end program stat
subroutine stat(x,n,moy,std, tl)
real,dimension(:,:) :: x
real :: moy,std
integer :: n, tl
...
print*,size(x,1),size(x,2)
end subroutine stat

On est dans le as d'une interfa e expli ite, les ara teristiques du tableau "x" sont
onnues a l'interieur du sous-programme stat.

Remarque :
Dans le as d'un tableau a pro l impli ite, pour le ompilateur xlf90 du SP2, il y
a egalement transmission de la liste des bornes inferieures et superieures des indi es du
tableau.

5.5. TABLEAU EN ARGUMENT DE PROCEDURE 49

5.5.2 Se tion de tableau en argument de pro edure


Une se tion de tableau peut ^etre passee en argument d'une pro edure.

Attention :
Si elle onstitue un ensemble de valeurs non ontigues en memoire, le ompilateur devra
au prealable opier ette se tion dans un tableau d'elements ontigus passe a la pro edure,
puis en n de traitement le re opier dans la se tion initiale...

=) Degradation des performan es !

Exemple :
program tab_se t
impli it none
real,dimension(100,100) ::a1,a2
integer :: i
integer :: 1, 2, 3
! interfa e du sous-programme sub1
interfa e
subroutine sub1(x)
impli it none
real,dimension(:,:) :: x
end subroutine sub1
end interfa e
! interfa e du sous-programme sub2
interfa e
subroutine sub2(x)
impli it none
real,dimension(:,:) :: x
end subroutine sub2
end interfa e
a1=1.;a2=a1
all system_ lo k( ount= 1)
do i=1,100
all sub1(a1(30:70,20:50))
enddo
all system_ lo k( ount= 2)
do i=1,100
50 CHAPITRE 5. EXTENSIONS TABLEAUX

all sub2(a2)
enddo
all system_ lo k( ount= 3)
print*,'temps sub1=', 2- 1,' temps sub2=', 3- 2
end program tab_se t
!
! sous-programme sub1
!
subroutine sub1(x)
impli it none
real,dimension(:,:) :: x
x=x*2.
end subroutine sub1
!
! sous-programme sub2
!
subroutine sub2(x)
real,dimension(:,:) :: x
x(30:70,20:50)=x(30:70,20:50)*2.0
end subroutine sub2

5.5.3 Tableau de taille nulle

do i=1,n
x(i)=b(i)/a(i,i)
b(i+1:n)=b(i+1:n) - a(i+1:n,i)*x(i)
enddo

La sequen e de programme pre edente resout un systeme triangulaire inferieure d'equations


lineaires. Quand I prend la valeur N, les se tions ont une taille nulle.

F90 admet le tableau de taille nulle dans tout ontexte


{ Des qu'une borne inferieure se trouve ^etre plus grande que la borne superieure asso iee,
le tableau a automatiquement une taille nulle.
{ Deux tableaux de taille nulle et de m^eme rang peuvent avoir des pro ls di erents :
(0,2) et (0,3) par exemple. Ils ne sont pas onformables.
{ Un tableau de taille nulle est toujours onformable a un s alaire.
{ Un tableau de taille nulle est toujours de ni puisqu'il ne omporte au un element qui
ne puisse ^etre inde ni.

5.6. GESTION DE MEMOIRE 51

5.6 Gestion de memoire


5.6.1 Tableaux automatiques

Une pro edure peut avoir besoin de tableaux lo aux de taille variable.

Exemple :
subroutine permute(a,b)
real,dimension(:,:) :: a,b ! tableaux a profil impli ite
real,dimension(size(a)) :: travail ! le profil varie a haque appel
travail=a
a=b
b=travail
end subroutine permute

Les tableaux dont les de larations varient et qui ne sont pas des arguments formels sont
appeles des "tableaux automatiques" (automati -arrays). Ils onstituent un as parti-
ulier de la ategorie plus generale des objets automatiques.

Ces tableaux sont dimensionnes a l'aide d'expressions non onstantes obtenues a partir
de variables entieres passees en arguments formels ou a l'aide de la fon tion intrinseque size
appliquee a des tableaux passes egalement en argument.

Ils sont alloues dynamiquement a l'entree de la pro edure et liberes de fa on impli ite a
la sortie.

Les ha^nes de ara teres a longueur variable sont aussi une autre o asion de reer des
objets automatiques.

Exemple :
subroutine exemple(mot1)
hara ter(len=*) :: mot1
hara ter(len=len(mot1)) :: mot2
...
52 CHAPITRE 5. EXTENSIONS TABLEAUX

Remarque :
Dans les deux exemples pre ites, l'interfa e de la pro edure devra ^etre expli ite

5.6.2 tableaux dynamiques(allo atable, pro l di ere)


Parfois la dimension d'un tableau ne peut ^etre determinee qu'apres la le ture d'une
donnee ou l'exe ution d'un al ul.
{ Un tableau, pourvu qu'il ne soit ni un argument formel ni un resultat de fon tion,
peut ^etre dote de l'attribut ALLOCATABLE dans une instru tion de de laration a
laquelle on ne fournit que le rang du tableau on erne du type suivant.

REAL,DIMENSION( :, :),ALLOCATABLE : : A
Un tel tableau est appelle tableau a pro l di ere (deferred-shape-array) et il a le
statut de "non en ore alloue".

{ Son allo ation s'e e tuera par une instru tion ALLOCATE a laquelle on indiquera
les bornes de ses dimensions.

ALLOCATE(A(N,N-1))
Le tableau re upere alors le statut "alloue".

{ Un tableau alloue qui n'a plus d'utilite peut ^etre "desalloue" au moyen d'une instru -
tion DEALLOCATE.

DEALLOCATE(A)
Il re upere le statut "non en ore alloue".

{ La fon tion intrinseque allo ated permet d'interroger le systeme pour savoir si un
tableau est alloue ou non.

Exemple :
real,dimension(:,:),allo atable :: a
...
read*,n,m
if ( .not. allo ated(a) ) then
allo ate(a(n,m),stat=err)
endif
if (err =/ 0) then
5.7. INSTRUCTION ET CONSTRUCTION WHERE 53

print*,"Erreur a l'allo ation du tableau a"


endif
...
deallo ate(a)
...

5.7 Instru tion et onstru tion WHERE


 Instru tion WHERE :
L'instru tion WHERE est utile lorsque l'exe ution d'une operation sur un tableau
n'est souhaitee que sur ertains de ses elements.

Forme generale de l'instru tion WHERE :

WHERE (expression-logique-tableau) variable-tableau = expression-tableau


Exemple :

real,dimension(100) :: a
....
! Operation sur les elements stri tement positifs de a
where (a > 0.) a=1./a
....

 Blo WHERE :
Une m^eme instru tion expression-logique-tableau peut ^etre utilisee pour plusieurs ta-
bleaux de m^eme pro l.

Forme generale de la onstru tion WHERE :

WHERE ( expression-logique-tableau)
a e tation-de-tableaux
ELSEWHERE
a e tation-de-tableaux
END WHERE
Exemple :
54 CHAPITRE 5. EXTENSIONS TABLEAUX

where ( pression <= 1.0)


pression=pression+in p
temp=temp+5.0
elsewhere
pluie=.true.
end where

Remarque :
Si l'une des a e tations modi e expression-logique-tableau, 'est la valeur obtenue
pour ette expression lors de l'entree dans l'instru tion WHERE qui reste en vigueur
omme masque de ontr^ole.

5.8 Fon tions intrinseques sur les tableaux

Interrogation

allo ated(array) : renvoie la valeur logique .TRUE.


lbound(array[,dim) : renvoie un tableau d'entiers du type par defaut et de rang un qui
ontient la liste des bornes inferieures du tableau.
ubound(array[,dim) : renvoie un tableau d'entiers de type par defaut et de rang un qui
ontient la liste des bornes superieures du tableau.

5.8. FONCTIONS INTRINSEQUES SUR LES TABLEAUX 55

Redu tion

all(mask) : renvoie la valeur .TRUE. si tous les elements du tableau de type


logique ont une valeur .TRUE. ou si le tableau est de taille nulle.
any(mask) : renvoie la valeur .TRUE. si au moins un des elements du tableau
de type logique mask a une valeur vraie sinon elle renvoie .FALSE. .
ount(mask) : renvoie un entier (du type par defaut) egal au nombre d'elements
de mask qui ont la valeur .TRUE.
maxval(array) : Renvoie la valeur maximale des elements d'un tableau d'entiers ou
de reels. Si array est de taille nulle, le resultat est le nombre negatif le
plus grand en valeur absolue disponible sur l'ordinateur.
minval(array) : Renvoie la valeur minimale des elements d'un tableau d'entiers ou
de reels. Si array est de taille nulle, le resultat est le plus grand
nombre positif disponible sur l'ordinateur.
produ t(array) : Renvoie le produit des elements d'un tableau d'entiers de reels ou
de omplexes. Le resultat est egal a 1 si array est de taille nulle.
sum(array) : Renvoie la somme des elements d'un tableau d'entiers de reels ou
de omplexes. Le resultat est egal a 0 si array est de taille nulle.

Interrogation des tableaux

allo ated(array) : Renvoie la valeur logique .TRUE. si le tableau allouable array est
alloue, sinon la valeur .FALSE.
shape(sour e) : Renvoie un tableau d'entiers de rang 1 qui ontient le pro l du tableau
ou du s alaire sour e.
size(array[,dim) : Renvoie la taille totale du tableau array ou l'etendue le long de la
dimension dim
56 CHAPITRE 5. EXTENSIONS TABLEAUX

Constru tion de tableaux

merge(tsour e,fsour e,mask) : Dans sa fon tion prin ipale, permet de fusionner les
tableaux tsour e et fsour e sous le ontr^ole du tableau
mask.
pa k(array,mask[,ve tor) : Renvoie un tableau de rang un, ontenant les elements
de array orrespondant aux elements de valeur .TRUE.
de mask.
spread(sour e,dim,n opies) : renvoie un tableau de m^eme type et de m^eme parametre
de sous-type que sour e et de rang augmente d'une unite.
unpa k(ve tor,mask, eld) : De ompa te le tableau ve tor de rang un sous le ontr^ole
du tableau logique mask. eld est de m^eme pro l que
mask ou un s alaire ontenant les valeurs absentes du
tableau ompa te ve tor.

Changement de pro l d'un tableau

reshape(sour e,shape) : renvoie un tableau dont le pro l est donne par le tableau
d'entiers de rang un shape, et dont le type et le parametre
de sous-type sont eux du tableau sour e.

De alage pour les tableaux

shift(array,shift[,dim) : renvoie un tableau de m^eme type, de m^eme


parametre de sous-type et de m^eme pro l que
array. Une permutation ir ulaire de nie par le
tableau (ou le s alaire) shift du tableau array est
e e tuee.
eoshift(array,shift[,boundary[,dim) : m^eme type de fon tion ave un de alage.

Transposition de matri es

transpose(matrix) : renvoie le tableau transpose du tableau matrix.



5.8. FONCTIONS INTRINSEQUES SUR LES TABLEAUX 57

Transformation pour la lo alisation


maxlo (array[,mask) : renvoie un tableau d'entiers de type par defaut, de rang un et
de taille egale au rang de array. Sa valeur est la suite des indi es
reperant un element de valeur maximale dans le tableau array.
minlo (array[,mask) : fon tion similaire a maxlo mais elle renvoie des informations
relatives aux valeurs minimales.

Multipli ation de ve teurs et de matri es


dot produ t(ve tor a,ve tor b) : produit s alaire de deux ve teurs de rang1,
matmul(matrix a,matrix b) : multipli ation de deux matri es.
58 CHAPITRE 5. EXTENSIONS TABLEAUX
Chapitre 6

Pointeurs

6.1 Introdu tion


De nition :

Le pointeur est un objet qui pourra designer des objets di erents au ours de l'exe ution
d'un programme. L'objet designe par le pointeur est appele la ible du pointeur.

Exemple :

On onsidere la pro edure qui al ule le produit AX ou A est une matri e et X est un
ve teur.
Supposons que X et A sont des objets qui ont la apa ite de designer des objets di erents
de m^eme type en ours de programme. Considerons alors les etapes ne essaires au al ul de
W=BCZ ou B et C sont des matri es et Z est un ve teur.

{ 1ere etape
X pointe sur la ible Z
A pointe sur la ible C
La pro edure al ule Y=AX=CZ
{ 2eme etape
X pointe sur la ible Y
A pointe sur la ible B
La pro edure al ule W=AX=BY

59
60 CHAPITRE 6. POINTEURS

6.2 De laration


Un objet a qui l'on peut demander ainsi de faire referen e a d'autres objets est appele
pointeur et doit faire l'objet d'une de laration omportant l'attribut pointeur. Un pointeur
designe tout au ours du programme des objets de m^eme type.

Exemple :
real,pointer :: age
hara ter,pointer :: nom
real,pointer,dimension(:,:) :: a

Remarque :
Dans le as d'un tableau, seul le rang (le nombre de dimensions) doit ^etre de lare et les
bornes prennent les valeurs de l'objet designe par le pointeur.

6.3 Etat d'un point pointeur


6.3.1 De nitions
Un pointeur peut ^etre :
{ inde ni (unde ned) : son etat initial,
{ asso ie (asso iated) : lorsqu'il est asso ie a une ible qui pourra ^etre de nie ou
inde nie.
{ desasso ie (desasso iated) : depourvu de ible.

6.3.2 Fon tion intrinseque : ASSOCIATED


Son etat peut ^etre teste par la fon tion intrinseque ASSOCIATED.

6.4 Allo ation dynamique de memoire


L'instru tion ALLOCATE permet de rendre "asso ie" un pointeur et d'allouer dyna-
miquement de la memoire. L'instru tion DEALLOCATE permet de liberer la pla e ainsi
allouee.
6.5. INSTRUCTION NULLIFY 61

Exemple :
real,pointer :: pr
...
allo ate(pr)
! traitement sur pr
...
deallo ate(pr)
end

Remarques :
{ L'espa e alloue par l'instru tion ALLOCATE n'a pas de nom, on y a ede par l'in-
termediaire du pointeur.
{ Apres l'exe ution de l'instru tion DEALLOCATE le pointeur passe a l'etat desasso ie.
{ L'instru tion DEALLOCATE appliquee a un pointeur dont l'etat est indetermine
provoque une erreur.

6.5 Instru tion NULLIFY


Un pointeur peut ^etre expli itement "desasso ie" de sa ible par une instru tion
NULLIFY
NULLIFY (liste-objet-pointeur)
Remarques :
{ l'instru tion NULLIFY pourra ^etre utile pour faire passer un pointeur de l'etat "inde ni"
a l'etat "desasso ie".
{ l'instru tion NULLIFY ne pro ede pas a la desallo ation des ibles. Une instru tion
DEALLOCATE devra ^etre utilisee a haque fois qu'une desallo ation est requise.

6.6 Pointeurs dans les a e tations et les expressions


6.6.1 Operateur "="
Si un pointeur est asso ie a une ible, il peut intervenir dans une expression ou une a e -
tation ordinaire.
C'est a la ible du pointeur qu'il fait impli itement a es.
62 CHAPITRE 6. POINTEURS

Les donnees sont opiees depuis la ible asso iee au terme de droite vers la ible asso iee
au terme de gau he.

Exemple :
real,pointer :: ptr1,ptr2,ptr3
allo ate(ptr1,ptr2,ptr3)
ptr1=4.
ptr1=ptr2
ptr3=3*ptr2+ptr1
....
real,pointer :: ptr
real :: a,b
b=2
allo ate(ptr)
ptr=b
a=ptr
...

6.6.2 A e tation de pointeur : operateur "=>"


< POINTER> =) <CIBLE>

Le pointeur situe a gau he pointe sur une nouvelle ible. On distingue deux as :
{ la ible est une variable non-pointeur : elle devra posseder l'attribut TARGET.

Exemple :
real,dimension(4,4),target :: tab0
real,dimension(:,:),pointer :: tab
...
tab0=4.
tab=>tab0
...
{ la ible est un pointeur : la ible du terme de droite devient la ible du pointeur
de gau he. C'est une simple opie de pointeur.

Exemple :
real,dimension(:,:),pointer :: tab0,tab
6.6. POINTEURS DANS LES AFFECTATIONS ET LES EXPRESSIONS 63

...
allo ate(tab0(4,4))
tab0=1.
tab=>tab0
...
Remarques :
{ Le type, le parametre de type et le rang du pointeur et de la ible sont identiques.
{ Si la ible est un tableau, il donne son pro l et ses limites au pointeur.

6.6.3 Attribut TARGET


Une variable ible qui n'est pas un pointeur peut ^etre impliquee dans une a e tation de
pointeur a ondition d'^etre dotee de l'attribut TARGET.

Remarque :
C'est l'etape d'optimisation du ompilateur qui justi e et attribut. Le ompilateur saura
qu'une variable qui n'est ni un pointeur, ni une ible ne peut ^etre atteinte par un pointeur.

6.6.4 A e tation de pointeur sur une omposante de stru ture


On opere une a e tation de pointeur sur une omposante de stru ture lorsque la
stru ture est situee a gau he d'une a e tation ordinaire.

Exemple : liste ha^nee


type maillon
real :: valeur
integer :: index
type(maillon),pointer :: suivant
end type maillon
...
! Ajouter un element a la liste
type(maillon),pointer :: premier, ourant
...
! Allo ation de l'element ourant
allo ate( ourant)
64 CHAPITRE 6. POINTEURS

! Initialisation de ourant:
! Affe tation de pointeur entre ourant%suivant et premier
ourant=maillon(1,1,premier)
! ourant devient le premier de la liste
premier => ourant

6.7 Argument de pro edure de type pointeur


Un argument formel peut ^etre de type pointeur.
{ l'argument e e tif sera ne essairement de type pointeur,
{ l'etat d'asso iation de l'argument e e tif est transmis a l'argument formel,
{ au retour, l'argument e e tif re oit l'etat d'asso iation de l'argument formel.

ATTENTION : la ible peut devenir inde nie.


Dans le as d'une pro edure externe ou d'une pro edure en situation d'argument formel,
le ompilateur fait l'hypothese que l'argument formel n'est pas un pointeur.

=) Ne essite d'une spe i ation expli ite dans un blo d'interfa e

Un argument e e tif de type pointeur peut ^etre asso ie a un argument formel non-
pointeur.
=) l'argument e e tif doit ^etre asso ie a une ible.
C'est ette ible qui sera passee en parametre.

Exemple :
real,pointer,dimension(:,:) :: a
...
allo ate(a(80,80))
all find(a)
...
subroutine find( )
real,dimension(:,:) ::
...
Si un argument formel a l'attribut pointeur, on ne peut le de larer ave l'attribut
INTENT. Cela provient de l'ambiguite portant sur le fait de savoir si l'intention
d'usage porte sur la ible ou l'etat d'asso iation du pointeur.
Argument dote de l'attribut TARGET
{ si l'argument a l'attribut TARGET, tout pointeur l'ayant pour ible devient inde ni
au retour de la pro edure.

6.8. RESULTAT D'UNE FONCTION DE TYPE POINTEUR 65

{ un pointeur asso ie a un argument e e tif qui a l'attribut TARGET ne se retrouve


pas asso ie a l'argument formel mais garde l'argument e e tif pour ible.

6.8 Resultat d'une fon tion de type pointeur


Le resultat d'une fon tion peut ^etre un pointeur, e qui est tres utile lorsque la taille du
resultat depend d'un al ul e e tue dans la fon tion m^eme.

Exemple :
real,pointer,dimension(:) :: y
real,dimension(100) :: x
...
y => ompa te(x)
...
fun tion ompa te(x)
real,pointer,dimension(:) :: ompa te
real,dimension(:) :: x
! elimine les repetitions dans x
..... ! determine le nombre N
allo ate( ompa te(N))
... ! opie les valeurs onservees de x dans ompa te
end fun tion ompa te

Remarques :
{ Dans la fon tion, le pointeur devient "asso ie"
{ Un appel de fon tion retournant un pointeur gure habituellement dans une a e ta-
tion de pointeur (partie droite d'une a e tation de pointeur).

6.9 Tableaux de pointeurs


6.9.1 De nition - De laration
Le tableau de pointeur n'existe pas en Fortran90, une stru ture de donnees assimilable a
un tableau de pointeurs peut ^etre obtenue par simple de nition d'un type ontenant une
omposante pointeur.
66 CHAPITRE 6. POINTEURS

Exemple :
{ de laration de la matri e triangulaire (n,n)
type ligne
real,dimension(:),pointer :: r
end type
...
type(ligne),dimension(n) :: s,t
{ allo ation de la memoire ne essaire au sto kage des elements non nuls de la matri e.
do i=1,n
! allo ation de la ligne i
allo ate(t(i)%r(1:i))
enddo
{ L'a e tation s=t est equivalente a l'a e tation de pointeur sur les omposantes
des objets de type ligne :
s(i)%r ) t(i)%r

6.9.2 Tableaux utilises omme alias


Lorsqu'une se tion de tableau est utilisee tres souvent, il peut ^etre interessant de pouvoir
onsiderer ette se tion omme un tableau nomme.

Exemple :
real,dimension(m,n) :: table
real,dimension(:,:),pointer :: fenetre
...
fenetre => table(p1,q1) ! se tion du tableau table
...
! modifi ation des dimensions de fenetre
fenetre => table(p2,q2) ! autre se tion du tableau table
...

Remarque : Cette fa ilite des pointeurs sur des tableaux permet egalement d'indexer ou
de se tionner des tableaux omposantes de stru ture.

ident => personne%des rip


personne%des rip : tableau de rang 3
ident : pointeur de tableau de rang 3
6.9. TABLEAUX DE POINTEURS 67

ident(1,2,3) est une expression valide


68 CHAPITRE 6. POINTEURS
Chapitre 7

Interfa e

7.1 Interfa e de pro edure


7.1.1 De nition
L'interfa e d'une pro edure est onstituee prin ipalement des informations sui-
vantes :
{ type de pro edure (fon tion, sous-programme),
{ proprietes des arguments de la pro edure (arguments formels),
{ proprietes du resultat dans le as d'une fon tion.
On est dans le as d'une interfa e "expli ite" lorsque le ompilateur onnait l'interfa e
de la pro edure au moment de l'appel et d'une interfa e impli ite dans le as ontraire.

En fortran77 : Compte tenu de la ompilation separee et du passage des arguments par


adresse, on est dans le as d'une interfa e impli ite.

=) Peu de ontr^ole de oheren e entre parametres formels et parametres e e tifs.

En fortran90 : par defaut, on est dans le as d'une interfa e impli ite

69
70 CHAPITRE 7. INTERFACE

7.1.2 Erreurs non dete tees a la ompilation : as d'une interfa e impli ite

program stat
impli it none
integer ::i,n
real,dimension(:),allo atable ::v
real :: x, tl,moy,std
integer,dimension(20) :: w
allo ate(v(n))
v=5.
x=10
!
! Argument onstante numerique: erreur de type sur la onstante
all statuni(v,x,n,moy,std,7)
!
! Arguments inverses: ore dump a l'exe ution
all statuni(x,v,n,moy,std, tl)
!
! Argument omis: erreur dans les resultats
all statuni(v,n,moy,std, tl)
!
! Erreur de type: w ve teur d'entiers
all statuni(w,x,n,moy,std, tl)
!
! Un argument en trop
all statuni(v,x,n,moy,std, tl,y)
!
end program stat
!
subroutine statuni(v,x,n,moy,std, tl)
impli ite none
real,dimension(:) :: v
real :: x,moy,std, tl
integer :: n
moy=0.
std=0.
do i=1,n
moy=moy+v(i)
enddo
! Reste de la pro edure
!
end subroutine statuni

7.1. INTERFACE DE PROCEDURE 71

Remarque :
Un ertain nombre d'erreurs possibles sont ontr^olees par l'instru tion "impli it none",
on verra que le blo interfa e est un moyen supplementaire pour dete ter un maximum
d'erreurs a la ompilation.

7.1.3 Interfa e "expli ite" : pro edure interne


Dans le as de l'appel du sous-programme statuni ave une interfa e expli ite du fait de
son utilisation omme pro edure interne, les erreurs de oheren e seraient toutes dete tees
a la ompilation.

La solution de la pro edure interne, si elle est simple, presente des in onvenients :
{ La pro edure interne est non visible a l'exterieur,
{ la programmation est moins modulaire.

7.1.4 Interfa e "expli ite" : blo interfa e


Pour :
{ eviter les in onvenients de la pro edure interne,
{ onserver la abilite de l'interfa e expli ite,

Fortran 90 permet de spe i er l'interfa e d'une pro edure dans la pro edure appelante par
l'intermediaire d'un "blo d'interfa e".

Forme generale d'un blo interfa e :

INTERFACE
orps-interfa e
END INTERFACE
ou orps-interfa e est une dupli ation de la partie de larative de la pro edure a laquelle on
ajoute l'instru tion END INTERFACE.

Exemple :

program stat
impli it none
72 CHAPITRE 7. INTERFACE

integer ::i
real,dimension(:),allo atable ::v
real :: x, tl,moy,std
!
interfa e
subroutine statuni(v,x,n,moy,std, tl)
real,dimension(:) :: v
real :: x,moy,std, tl
integer :: n
end subroutine statuni
end interfa e
!
allo ate(v(n))
v=5.
x=10
all statuni(v,x,n,moy,std, tl)
...
end program stat

In onvenient : Ne essite de dupliquer le blo d'interfa e dans toutes les pro edures
appelant la pro edure on ernee.

7.1.5 Interfa e "expli ite" : module

Pour ameliorer la abilite generale, il faut inserer le m^eme blo interfa e dans les unites
de programme faisant referen e a la pro edure on ernee.

Le module et l'instru tion USE permettant l'a es a son ontenu jouera e r^ole.

Rappels :
Le module est une unite de programme introduite par Fortran 90 pour en apsuler :
{ les donnees, les stru tures et les types derives,
{ les blo s d'interfa e,
{ les pro edures.
Deux methodes d'utilisation du module pour realiser une interfa e expli ite.
{ module ave blo d'interfa e,
{ module ave pro edure.

7.1. INTERFACE DE PROCEDURE 73

7.1.6 Interfa e expli ite : module ave pro edure


module mod_stat
!
ontains
!
subroutine statuni(v,x,n,moy,std, tl)
impli it none
real,dimension(:) :: v
real :: x,moy,std, tl
integer :: n,i
moy=0.
std=0.
do i=1,n
moy=moy+v(i)
enddo
...
end subroutine statuni
end module mod_stat
!
program stat
!
use mod_stat
impli it none
integer ::i,n=10
real,dimension(:),allo atable ::v
real :: x, tl,moy,std
allo ate(v(n))
v=5.
x=10
all statuni(v,x,n,moy,std, tl)
...
end program stat
74 CHAPITRE 7. INTERFACE

7.1.7 Interfa e expli ite : module ave blo d'interfa e


! module
! ------
module mod_stat4
!
interfa e
subroutine statuni(v,x,n,moy,std, tl)
impli it none
real,dimension(:) :: v
real :: x,moy,std, tl
integer :: n,i
end subroutine statuni
end interfa e
!
end module mod_stat4
! Programme appelant
! ------------------
program stat
use mod_stat4
impli it none
integer ::i,n=10
real,dimension(:),allo atable ::v
real :: x, tl,moy,std
allo ate(v(n))
v=5.
x=10
all statuni(v,x,n,moy,std, tl)
! .....
end program stat
! Sous-Programme externe
! -----------------------
subroutine statuni(v,x,n,moy,std, tl)
impli it none
real,dimension(:) :: v
real :: x,moy,std, tl
integer :: n,i
moy=0.
std=0.
! reste du sous-programme ...
!
end subroutine statuni

7.2. ARGUMENTS DE PROCEDURE 75

7.1.8 Interfa e "expli ite" : 5 as possibles


On a une interfa e expli ite dans les 5 as suivants :

{ Les pro edures "intrinseques" ont toujours des interfa es expli ites,
{ pro edure interne,
{ presen e d'un blo d'interfa e dans la pro edure appelante,
{ la pro edure appelante a ede au module ontenant la pro edure appelee (USE),
{ la pro edure appelante a ede au module ontenant le blo d'interfa e de la pro edure
appelee (USE).

7.1.9 Cas d'interfa e "expli ite" obligatoire


Il y existe 10 as ou l'interfa e d'appel doit ^etre expli ite :

{ fon tion a valeur tableau,


{ fon tion a valeur pointeur,
{ fon tion a valeur ha^ne de ara teres dont la longueur est determinee dynamiquement,
{ tableau a pro l impli ite,
{ argument formel ave l'attribut pointer ou target,
{ passage d'arguments a mots- le,
{ argument optionnel,
{ pro edure generique,
{ sur harge ou de nition d'un operateur,
{ sur harge de l'operateur d'a e tation.

7.2 Arguments de pro edure


7.2.1 Arguments : attribut INTENT et OPTIONAL
Un ontr^ole supplementaire peut ^etre ajoute ave les attributs INTENT et OP-
TIONAL.

l'attribut INTENT peut ^etre spe i e pour un argument formel qui n'est ni une pro edure,
ni un pointeur. Cela permet un ontr^ole plus n de l'usage des arguments formels.

INTENT(IN) : entree seulement,


INTENT(out) : sortie seulement,
INTENT(INOUT) : entee ou sortie.
76 CHAPITRE 7. INTERFACE

Exemple :
real,dimension(:),intent(in) :: ve t
ou
real,dimension(:) :: ve t
intent(in) :: ve t

L'attribut OPTIONAL permet de de larer ertains arguments omme optionnels.

Exemple :

real,optional,dimension(:),intent(out) :: ve t

La fon tion intrinseque PRESENT permet de tester la presen e de et argument.

7.2.2 Passage d'arguments par mots- les


Lorsque la liste des arguments est longue, les arguments optionnels sont eparpilles dans
ette liste. On peut donner onse utivement une liste (eventuellement vide) d'arguments
positionnels pour les arguments situes en t^ete, suivie d'une liste d'arguments par mot- les.

{ Il est re ommande d'utiliser le passage par mot- le pour les arguments optionnels,
{ les arguments positionnels doivent pre eder eux a mot- le.
{ parmi les arguments positionnels, seul le dernier pourra ^etre optionnel et omis.

Exemple :
si tl est optionnel
all statuni(v=ve t,x=xx,n=nb1,moy=xm,std=xs, tl=err)
all statuni(ve t,xx,nb1,moy=xm,std=xs, tl=err)
all statuni(v,x,n,moy=xm,std=xs)

7.2.3 Pro edure en argument


En Fortran 77, une pro edure passee en argument doit ^etre de laree EXTERNAL.

En Fortran 90, une pro edure passee en argument doit ^etre une pro edure externe ou
une pro edure de module.
 ERIQUE
7.3. INTERFACE GEN  77

{ Les pro edures internes ne peuvent ^etre passees en argument.


{ Pour les pro edures externes, il est re ommande de fournir un blo interfa e a
l'unite appelante. Un module a une intefa e expli ite par defaut.
{ C'est le nom spe i que de la pro edure qui doit ^etre fourni m^eme si elle a un nom
generique.
Exemple :

7.3 Interfa e generique


7.3.1 De nition
Un autre usage du blo d'interfa e on erne la notion de sur harge, .a.d la possi-
bilite d'invoquer une famille de pro edures distin tes au moyen d'un m^eme nom generique.

Le hoix de la pro edure a exe uter est fait par le ompilateur en fon tion du nombre
et du type des arguments.

Cette notion existait deja en fortran 77, mais elle etait limitee aux pro edures intrinseques.

7.3.2 Exemple
De nition d'une fon tion generique t s'appliquant a un tableau f qui pourra ^etre un
tableau 1D ou 2D.

On a deux sous-programmes :
{ t1r lorsque f est un tableau 1D,
{ t2r lorsque f est un tableau 2D.
En general, la sur harge est de nie dans un module.
78 CHAPITRE 7. INTERFACE

7.3.3 t1r et t2r sont deux sous-programmes externes :


subroutine fft1r(f,isign)
real,dimension(:),intent(inout) :: f ! tableau 1D
integer,intent(in) :: isign
! reste de la pro edure ...
end subroutine fft1r

subroutine fft2r(f,isign)
real,dimension(:,:),intent(inout) :: f ! tableau 2D
integer,intent(in) :: isign
! reste de la pro edure ...
end subroutine fft2r
!
module fft_mod
interfa e fft
subroutine fft1r(f,isign)
real,dimension(:),intent(inout) :: f ! tableau 1D
integer,intent(in) :: isign
end subroutine fft1r
!
subroutine fft2r(f,isign)
real,dimension(:,:),intent(inout) :: f ! tableau 2D
integer,intent(in) :: isign
end subroutine fft2r
end interfa e
end module fftr_mod
!
! programme appelant:
! ------------------
program fourier
use fftr_mod
impli it none
real,dimension(10) :: f1
real,dimension(10,10) :: f2 1
integer :: isign1,isign2
isign1=0;isign2=0
all fft(f1,isign1)
! ....
all fft(f2,isign2)
! ....
end program fourier

7.4. SURCHAGE D'OPERATEURS 79

7.3.4 t1r et t2r sont deux sous-programmes de module :


Les deux pro edures t1r et t2r sont deux pro edures du module qui de nit l'inter-
fa e generique. Leur interfa e est expli ite et le blo d'interfa e est reduit a une instru tion
module pro edure.

module fftr_mod
interfa e fft
module pro edure fft1r,fft2r
end interfa e
!
ontains
!
subroutine fft1r(f,isign)
real,dimension(:),intent(inout) :: f ! tableau 1D
integer,intent(in) :: isign
! ... reste de la pro edure
end subroutine fft1r

subroutine fft2r(f,isign)
real,dimension(:,:),intent(inout) :: f ! tableau 2D
integer,intent(in) :: isign
! ... reste de la pro edure
end subroutine fft2r
!
end module fftr_mod

Le programme appelant est identique au pre edent.

7.4 Sur hage d'operateurs


7.4.1 De nition
Fortran90 o re la possibilite de sur harger les operateurs pre-de nis du langage, en
elargissant leur hamp d'appli ation.

La sur harge d'un operateur impose de respe ter sa nature (binaire ou unaire) et les regles
de priorite pre edemment de nie dans le langage.
80 CHAPITRE 7. INTERFACE

On emploie des pro edures de type fon tion pour sur harger un operateur a l'ex eption
de l'operateur d'a e tation qui onstruit une expression ne retournant au une valeur.
Dans e as, 'est une pro edure de type subroutine qui sera utilisee.

Certains operateurs ont deja fait l'objet d'une sur harge au sein du langage.

7.4.2 Interfa e OPERATOR


Pour sur harger un operateur (autre que l'operateur d'a e tation), on utilisera un blo
d'interfa e du type interfa e operator.
A la suite du mot- le operator, on indique entre parentheses, le signe de l'operateur que
l'on desire sur harger.

En general, on de nira la sur harge d'operateur dans un module.

La fon tion est une pro edure de module


module mod_private_ omplex
! Definition du type private_ omplex
type private_ omplex
real :: reel,imaginaire
end type private_ omplex
!
interfa e operator(*)
module pro edure p _mult
end interfa e
!
ontains
!
fun tion p _mult(a,b)
type(private_ omplex),intent(in) :: a,b
type(private_ omplex),intent(out) :: p _mult
!
p _mult%reel=a%reel*b%reel-a%imaginaire*b%imaginaire
p _mult%imaginaire=a%reel*b%imaginaire + a%imaginaire*b%reel
!
end fun tion p _mult
!
end module mod_private_ omplex

7.4. SURCHAGE D'OPERATEURS 81

La fon tion est une pro edure externe


!
module mod_private_ omplex
! definition du type private_ omplex
type private_ omplex
real :: reel,imaginaire
end type private_ omplex
end module mod_private_ omplex
!
module private_ omplex_inter
interfa e operator(*)
fun tion p _mult(a,b)
use mod_private_ omplexe
type(private_ omplex),intent(in) :: a,b
type(private_ omplex),intent(out) :: p _mult
end fun tion p _mult
end interfa e
end module private_ omplex_inter
!
program appelant
use private_ omplex_mod
use private_ omplex_inter
!
impli it none
type(private_ omplex) :: a,b,
!
a%reel=10.; a%imaginaire=-3.
b%reel=9.; b%imaginaire=3.
!
=a*b
end program appelant

=) On preferera, en general la premiere solution.

7.4.3 Interfa e ASSIGNMENT


Pour sur harger l'operateur assignment(=), on utilisera un blo interfa e du type in-
terfa e assignment.
82 CHAPITRE 7. INTERFACE

La de nition de l'operateur "=" se fera dans un module. Le sous-programme qui de nit
l'assignation pourra ^etre un sous-programme externe ou interne au module. On preferera
ette derniere methode.

module mod_private_ omplex


type private_ omplex
real :: reel,imaginaire
end type private_ omplex
! Sur harge des operateur "*" et "="
! -----------------------------------
interfa e operator(*)
module pro edure p _mult
end interfa e
!
interfa e assignment(=)
module pro edure p _assign
end interfa e

ontains
!
fun tion p _mult(a,b)
type(private_ omplex),intent(in) :: a,b
type(private_ omplex),intent(out) :: p _mult
! reste de la pro edure ....
end fun tion p _mult
!
subroutine p _assign(a,b)
impli it none
type(private_ omplex),intent(out) :: a
type(private_ omplex),intent(in) :: b
! reste de la pro edure
end subroutine p _assign

end module mod_private_ omplex

Programme appelant
------------------
program appel
use mod_private_ omplex
impli it none
real :: ra,ima,rb,imb
type(private_ omplex) :: a,b, ,d

7.4. SURCHAGE D'OPERATEURS 83

!
all init(a,ra,ima)
all init(b,rb,imb)
!
=a*b
=2*
d=
!
end program appel

7.4.4 Remarques
 Lors de la sur harge d'un operateur autre que l'operateur d'a e tation, le ou les arguments
de la fon tion asso iee doivent avoir l'attribut intent(in).
 Lors de la sur harge de l'operateur d'a e tation, le 1er argument doit avoir l'attribut
intent(out) ou intent(inout) et le 2eme l'attribut intent(in).
84 CHAPITRE 7. INTERFACE
Chapitre 8

Contr^
ole de visibilite

8.1 Introdu tion


Les modules permettent d'empaqueter les spe i ations sous une forme qui les rend
a essibles n'importe ou dans le programme.

Il peut ^etre souhaitable de limiter l'a essibilite de es ressour es.


Ce i peut se justi er lorsqu'elles ne sont ne essaires qu'a l'interieur du module dans lequel
elles sont de nies.

Les ressour es non exportables sont dites privees, les autres sont dites publiques.

Les avantages des ressour es privees sont :


{ Au une orruption a identelle sur des donnees privees par une pro edure externe au
module qui les ontient,
{ des modi ations de on eptions peuvent ^etre faites a l'interieur d'un module sans
a e ter le reste du programme,
{ permet d'eviter tout type de on its ave les ressour es d'autres modules...

8.2 Attributs PRIVATE et PUBLIC


Lorsque des entites ne doivent pas ^etre a essibles en dehors de leur propre module, on
leur donne l'attribut PRIVATE et dans le as ontraire, l'attribut PUBLIC.

A l'entree d'un module, le mode par defaut est le mode PUBLIC.

85
86 ^
CHAPITRE 8. CONTROLE 
DE VISIBILITE

Ces deux attributs peuvent ^etre spe i es par :

 La presen e des attributs PUBLIC ou PRIVATE dans les instru tions de de laration
de type dans le module.
REAL,PUBLIC : : X,Y
INTEGER, PRIVATE : : U,V
 des instru tions PUBLIC ou PRIVATE qui ont la forme :
PUBLIC [[ : : liste de ressour es
PRIVATE [[ : : liste de ressour es
ou liste de ressour es : liste de variables nommees, de noms de pro edures non in-
trinseques, de pro edures non generiques, de types derives, de onstantes nommees ou
de listes nommees (namelist).

L'instru tion PRIVATE ou PUBLIC sans argument on rme ou retablit le mode


d'a essiblite par defaut.
Cette m^eme instru tion a laquelle on ajoute une liste de ressour es a e te a es ressour es
l'attribut indique.

Exemple :

module stat
private
integer,publi :: n ! publi
real,publi ,dimension(:),allo atable :: x,y !publi
real :: adx,ady !prives
publi :: moyenne,std,s
ontains
subroutine somme(s,x,n) ! privee
...
end subroutine somme
subroutine moyenne(s,n) ! publique
...
end subroutine moyenne
end module stat

Remarques :
^
8.3. CONTROLE  : TYPE DERIV
DE VISIBILITE  
E 87

{ Les attributs PUBLIC et PRIVATE ne peuvent apparaitre qu'a l'interieur d'un mo-
dule,
{ une instru tion PUBLIC ou PRIVATE sans argument ne peut apparaitre qu'une seule
fois dans un module,
{ si une pro edure a un identi ateur generique, l'a essibilite a son nom spe i que est
independante de l'a essibilite a son nom generique,
{ une entite dont le type a ete de ni ave l'attribut PRIVATE ne peut pas posseder
l'attribut PUBLIC,
{ si une pro edure a un argument formel ou un resultat ave un attribut PRIVATE, la
pro edure doit ^etre munie de l'attribut PRIVATE.

8.3 Contr^ole de visibilite : type derive


Les attributs PUBLIC et PRIVATE peuvent s'appliquer aux types derives.

Un type derive peut ^etre :


{ publi ainsi que ses omposantes : type derive transparent,
{ prive,
{ publi mais ave toutes ses omposantes privees : type derive semi-prive.
Par defaut les omposantes d'un type derive publi sont publiques.

8.4 Type derive semi-prive


L'utilisation d'un type derive semi-prive presente l'avantage de permettre des hange-
ments sur le type sans a e ter de quelque maniere que e soit les unites utilisatri es.
Reprenons l'exemple du type "private omplex" dans le module "mod private omplex".
On transforme le type publi en type semi-prive.
type private_ omplex
private
real :: reel,imaginaire
end type private_ omplex

Les omposantes de e type etant privees, il est ne essaire de fournir dans le module qui
le de nit des fon tions qui permettent d'y a eder ou de les modi er.

Exemple :

module mod_private_ omplex


88 ^
CHAPITRE 8. CONTROLE 
DE VISIBILITE

!
type private_ omplex
private
real :: reel,imaginaire
end type private_ omplex
!
! sur harge de l'operateur *
interfa e operator(*)
module pro edure p _mult
end interfa e
!
ontains
!
subroutine p _init(a,rl,imag)
impli it none
type(private_ omplex),intent(out) :: a
real,intent(in) :: rl,imag
!
a%reel=rl ; a%imaginaire=imag
end subroutine p _init
!
subroutine p _display(a, )
impli it none
type(private_ omplex),intent(in) :: a
hara ter*(*) ::
!
print*, ,a%reel,a%imaginaire
end subroutine p _display
!
fun tion p _mult(a,b)
impli it none
type(private_ omplex),intent(in) :: a,b
type(private_ omplex) ::p _mult
!
p _mult%reel=a%reel*b%reel - a%imaginaire*b%imaginaire
p _mult%imaginaire=a%reel*b%imaginaire + a%imaginaire*b%reel
end fun tion p _mult
!
end module mod_private_ omplex

Programme appelant
--------------------

8.5. PARAMETRE ONLY DE L'INSTRUCTION USE 89

program appel_p
use mod_private_ omplex
!
impli it none
type(private_ omplex) :: a,b,
!
all p _init(a,3.,-6.)
all p _init(b,1.,7.)
!
=a*b
!
all p _display(a,"private_ omplex a")
all p _display(b,"private_ omplex b")
all p _display( ,"private_ omplex a*b")
!
stop
end

8.5 Parametre ONLY de l'instru tion USE


 Lors de l'utilisation d'un module, il se peut que dans l'unite utilisatri e, il existe des
ressour es ayant le m^eme nom. Dans e as,il est possible de renommer les ressour es
du module dans l'unite qui y a ede via l'operateur ")" au niveau de l'instru tion
USE.
USE M , NBLIG ) NL , NBCOL ) NC
 Lorsque seulement un sous-ensemble des noms de nis dans un module est requis, l'option
ONLY est disponible, ave la syntaxe suivante :
USE nom-module,ONLY :[liste-nom-only
ou haque nom-only a la forme :
nom-only ) nom utilise dans USE
Exemple :

USE M, ONLY : nblig ) NL , NBCOL ) NC


90 ^
CHAPITRE 8. CONTROLE 
DE VISIBILITE
Chapitre 9

Pro edure re ursive

9.1 De nition


Un sous-programme ne peut pas s'invoquer lui-m^eme dire tement ou indire tement a
travers une suite d'appels a d'autres sous-programmes sauf si l'instru tion de t^ete du sous-
programme ommen e par le mot- le RECURSIVE

Exemple : Integration d'une fon tion f(x,y)

sur un re tangle Nous integrons en x pour une valeur donnee de y. Pour ela, on e rit
une fon tion en Fortran dans un module de telle sorte que la valeur de x soit obtenue par
passage d'argument et y etant une omposante des donnees du module, par asso iation
d'h^ote de e module.
{ E riture du module

module fun
real :: yval
real,dimension(2) :: xbornes,ybornes
ontains
fun tion f(xval)
real :: f,xval
f=... ! expression en fon tion de xval et yval
end fun tion
end module fun

91
92 
CHAPITRE 9. PROCEDURE 
RECURSIVE

{ Integration de f en x pour une valeur de y donnee

re ursive fun tion integre(f,bornes)


! integre f entre bornes(1) et bornes(2)
real :: integre
real,dimension(2),intent(in) :: bornes
interfa e
fun tion f(x)
real :: f,x
end fun tion f
end interfa e
! al ul
...
end fun tion integre
{ Cal ule de l'integrale de f(x,y) sur le re tangle

fun tion fy(y)


use fun
real :: fy,y
yval=y
fy=integre(f,xbornes)
end fun tion

! al ule de l'integrale

surfa e=integre(fy,ybornes)

9.2 Clause RESULT


Quand la fon tion s'appelle dire tement, il faut un autre nom pour designer le resultat.
Ce qui se fait par l'ajout d'une lause RESULT a l'instru tion FUNCTION.

Exemple :
re ursive fun tion fa torielle(n) result(res)
integer res,n
!
if (n .eq. 1) then
res=1
9.2. CLAUSE RESULT 93

else
res=n*fa torielle(n-1)
end if
end

En l'absen e le la lause RESULT, le nom de la fon tion est utilise pour nommer le resultat,
et par onsequent e nom n'est plus disponible pour un appel re ursif de la fon tion.
94 
CHAPITRE 9. PROCEDURE 
RECURSIVE
Chapitre 10

Nouveautes sur les E/S

10.1 Introdu tion


Le langage Fortran dispose d'un ensemble de possibilites en matiere d'entrees/sorties
(E/S) parti ulierement ri hes.
La norme Fortran 77 avait apporte d'importantes nouveautes, dont les hiers a a es
dire t, les hiers internes, la spe i ation des formats de nis au moment de l'exe ution, les
E/S dirigees par liste, les renseignements sur les hiers( le inquire) et quelques nouveaux
des ripteurs d'edition.
Les seules nouvelles ara teristiques signi atives apportees par la norme Fortran 90
sont :
{ les E/S sans depla ement (nom-advan ing I/O),
{ les listes nommees (namelist),
{ quelques nouveaux spe i ateurs des instru tions OPEN et INQUIRE.
{ quelques nouveaux des ripteurs d'edition et une generalisation du des ripteur d'edition
G,

10.2 E/S sans depla ement


Jusqu'a present, haque instru tion READ ou WRITE transferait, en entree ou en sortie,
des enregistrements omplets.
Ave la norme Fortran 90, il est possible de lire et/ou d'e rire sans depla ement
systematique de la position de le ture au debut de l'enregistrement suivant. Il sura d'indi-

95
96  SUR LES E/S
CHAPITRE 10. NOUVEAUTES

quer le spe i ateur optionnel "ADVANCE = express-advan e " dans l'instru tion
READ ou WRITE ou :

express-advan e = NO pour une le ture/e riture sans depla ement.


YES (par defaut) pour un depla ement a haque enregistrement.

Exemple : Possibilite tres utile pour la gestion d'e ran.

write(*,'(a)',ADVANCE='NO') ' Entrez le nombre premier suivant:'


read(*,'(I10)') nombre_premier

Si une instru tion d'E/S sans depla ement essaie de transferer des donnees au
dela de la n de l'enregistrement en ours :
{ Le parametre IOSTAT prend une valeur stri tement negative.
{ Si le spe i ateur "EOR=etiq- n-enregistr" est present, le ontr^ole de l'exe ution du
programme sera transfere a l'instru tion spe i ee par "etiq- n-enregistr".
{ Pour le ontr^ole de e pro essus, on dispose egalement du spe i ateur SIZE=taille.
La valeur de la variable taille est egale au nombre de ara teres e e tivement lus.
Exemple : (Cours Fortran 90 IDRIS)

program entree_sortie
integer,parameter :: dim_a=5, dim_b=3
hara ter(4) :: a(dim_a)=(/"aaaa","bbbb"," ", &
"dddd","eeee"/)
hara ter(3) :: b(dim_b)=(/"fff", &
"ggg","hhh"/)
hara ter(len=1) ::
do
do
read(*,'(a)',advan e="no",eor=1,end=2)
write(*,'(a)',advan e="no")
enddo
1 write(*,'(a)',advan e="yes")
enddo
!
2 do i=1,dim_a
write(*,'(a)',advan e="no")a(i)
enddo
write(*,'(" ")',advan e="no")
10.3. INSTRUCTION NAMELIST 97

do i=1,dim_b
write(*,'(a)',advan e="no")b(i)
enddo
write(*,'(a)',advan e="yes")
end program entree_sortie

Remarques :
{ Lorsque ni le spe i ateur IOSTAT, ni le spe i ateur EOR ne sont utilises, le
programme se termine lorsqu'une ondition de " n d'enregistrement" se produit.
{ Les E/S sans depla ement ne peuvent ^etre utilisees pour les listes nommees (name-
list) ou des E/S dirigees par des listes.

10.3 Instru tion NAMELIST


L'instru tion NAMELIST permet de former ave un ensemble de variables un seul
groupe a n de fa iliter les operations d'E/S.

10.3.1 De laration

La de laration d'un tel groupe se fait par une instru tion de spe i ation
NAMELIST avant toute instru tion exe utable.

NAMELIST spe if-namelist

ou spe if-namelist est de la forme :

/nom-namelist/ liste-nom-de-variable

nom-namelist est le nom qui sera donne au groupe pour son usage ulterieur.
Remarques :
{ Il est possible de ompleter l'enumeration de la liste dans la m^eme unite de portee.
{ Si une variable a l'attribut PUBLIC, au une variable dans la liste nommee ne peut
avoir l'attribut PRIVATE.
98  SUR LES E/S
CHAPITRE 10. NOUVEAUTES

10.3.2 Usage
Dans une instru tion READ ou WRITE, la liste nommee sera designee par le spe i ateur
NML.
Exemple :

integer :: taille=2
hara ter(len=4) :: ouleur(3)=(/' red','pink','blue'/)
namelist / vetement/taille, ouleur
...
write(*,nml=vetement)

La sortie sera:

taille=2, ouleur= redpinkblue

10.4 Instru tion INQUIRE par liste de sortie


Une variante de l'instru tion INQUIRE permet de se renseigner sur la longueur d'une
liste de sortie lorsque l'e riture d'enregistrements non formates est souhaitee. Cette variante
est onnue sous le nom "INQUIRE par liste de sortie", elle a la syntaxe suivante :

INQUIRE(IOLENGTH=longueur) olist
ou longueur est une variable s alaire de type entier par defaut, utilisee pour determiner
la longueur de la liste de sortie non formattee "olist".
Cette longueur pourra ^etre utilisee pour determiner la "bonne" valeur a fournir au
spe i ateur RECL=r l d'une instru tion OPEN a venir.
Exemple :

integer :: longueur
...
inquire(IOLENGTH=longueur) nom,titre,age,adresse,tel
...
open(1,FILE='test',RECL=longueur,FORM='UNFORMATTED')
...
write(1) nom,titre,age,adresse,tel

10.5. NOUVEAUX SPECIFICATEURS D'INSTRUCTIONS 99

10.5 Nouveaux spe i ateurs d'instru tions

De nouveaux spe i ateurs ont ete ajoutes aux instru tions OPEN et INQUIRE

10.5.1 Instru tion OPEN


 POSITION : ASIS, REWIND, APPEND
{ ASIS : permet de onserver la position du pointeur de hier.
Utile lorsqu'on veut modi er ertaines ara teristiques du hier, tout en restant
positionne.
{ REWIND : indique que le pointeur du hier sera positionne a son debut.
{ APPEND : indique que le pointeur du hier sera positionne a la n.
 STATUS : REPLACE, SCRATCH
{ REPLACE : si le hier n'existe pas, il sera ree, sinon il sera detruit et un hier
de m^eme nom sera ree.
{ SCRATCH : indique qu'un hier anonyme sera ree et onne te a l'unite spe i ee
via le parametre UNIT. La duree de vie de e hier sera soit le temps d'exe ution
du programme, soit le temps s'e oulant jusqu'a la fermeture de ette unite.
 DELIM : APOSTROPHE, QUOTE, NONE
{ APOSTROPHE : indique que l'apostrophe ' sera utilisee pour delimiter les
ha^nes de ara teres lors d'une e riture de type namelist.
{ QUOTE : indique que l'apostrophe " sera utilisee pour delimiter les ha^nes de
ara teres lors d'une e riture de type namelist.
{ NONE : indique qu'au un delimiteur ne sera utilise (valeur par defaut)
 ACTION : READ, WRITE, READWRITE
{ READ : toute tentative d'e riture est interdite.
{ WRITE : toute tentative de le ture est interdite.
{ READWRITE : les operations de le ture et d'e riture sont autorisees.

 PAD : pad
ou pad est une expression de type ara tere qui prend la valeur :
{ YES : un enregistrement d'entree formattee est omplete par des blan s.
{ NO : un enregistrement d'entree formattee doit ^etre susamment long pour la liste
d'entree, sauf si le spe i ateur ADVANCE='NO' est present ou si un mot le du
type EOR= ou IOSTAT= est present.
100  SUR LES E/S
CHAPITRE 10. NOUVEAUTES

10.5.2 Instru tion INQUIRE


Les spe i ateurs POSITION, DELIM, ACTION, PAD ont la m^eme signi ation et les
m^emes valeurs que pour l'instru tion OPEN.
 READ : YES, NO ou UNKNOWN
Indique si les le tures sur un hier sont permises, non permises ou indeterminees.
 WRITE : YES, NO ou UNKNOWN
Indique si les e ritures sur un hier sont permises, non permises ou indeterminees.
 READWRITE : YES, NO ou UNKNOWN
Indique si les le tures et e ritures sur un hier sont permises, non permises ou
indeterminees.

10.6 Nouveaux des ripteurs d'edition


La onversion de la representation interne vers la forme externe ou inversement d'un s a-
laire est exe utee sous le ontr^ole de l'information spe i ee dans un des ripteur d'edition
ontenue dans une spe i ation de format.
Fortran 90 fournit de nouveaux des ripteurs d'edition.
{ EN (engineering) identique au des ripteur d'edition E sauf qu'en sortie l'exposant est
un multiple de trois.
{ ES (s ienti ) identique au des ripteur d'edition E sauf qu'en sortie la valeur absolue
de la mantisse lorsqu'elle est non nulle est egale ou superieure a 1 et stri tement
inferieure a 10.
{ B : binaire
{ O : o tal
{ Z : hexade imal
{ G : les des ripteurs d'edition generaux peuvent ^etre utilises pour un type quel-
onque de donnees de type intrinseque.
Exemple : Le programme suivant illustre les di erents des ripteurs d'edition E,EN,ES,G.

program des ripteur_edition


impli it none
real,dimension(4) :: x=(/1.234,-0.5,0.00678, 98765.4/)
! ...
print '("des ripteur E :",4E14.3/ &
& "des ripteur EN:",4EN14.3/ &
& "des ripteur ES:",4ES14.3/ &

10.6. NOUVEAUX DESCRIPTEURS D'EDITION 101

& "des ripteur G :",4G14.3) ,x,x,x,x


! ...
end program des ripteur_edition

Les sorties seront :

des ripteur E : 0.123E+01 -0.500E+00 0.678E-02 0.988E+05


des ripteur EN: 1.234E+00 -500.000E-03 6.780E-03 98.765E+03
des ripteur ES: 1.234E+00 -5.000E-01 6.780E-03 9.877E+04
des ripteur G : 1.23 -0.500 0.678E-02 0.988E+05

10.6.1 Des ripteurs d'edition relatifs aux valeurs de type derive


Les valeurs de type derive sont editees par la sequen e appropriee de des ripteurs
d'edition orrespondant aux di erents types de omposantes ultimes du type derive.
Exemple :

type haine
integer :: longueur
hara ter(len=20) :: mot
end type haine
type( haine) :: texte
...
read(*,'(I2,A)') texte
102  SUR LES E/S
CHAPITRE 10. NOUVEAUTES
Chapitre 11

Quelques nouvelles fon tions


intrinseques

11.1 Introdu tion

11.2 Pre ision et odage numerique


digit(x) : admet un argument x entier ou reel et renvoie un entier egal au nombre de
hi res signi atifs de x :
{ le nombre de hi res binaires de la mantisse si x est reel
{ le nombre de hi res binaires de sto kage (hors bit de signe) si x est un entier.
epsilon(x) : renvoie un reel ave m^eme parametre de sous-type que x qui est presque
negligeable ompare a 1.
huge(x) : admet un parametre x entier ou reel et renvoie la plus grande valeur representable
dans le sous-type de x (limite d'over ow)
tiny(x) : admet un parametre x reel et renvoie la plus petite valeur positive non nulle
representable dans le sous-type de x (limite d'under ow)
maxexponent(x) : admet un parametre x reel et renvoie l'entier representant le plus grand
exposant possible dans le sous-type de x.
minexponent(x) : admet un parametre x reel et renvoie l'entier representant le plus petit
exposant possible dans le sous-type de x.
exponent(x) : renvoie un entier egal a l'exposant de la representation numerique de x (0
si x est egal a 0)
fra tion(x) : renvoie un reel qui est egal a la mantisse de la representation numerique de
x.

103
104 
CHAPITRE 11. QUELQUES NOUVELLES FONCTIONS INTRINSEQUES

nearest(x,s) : renvoie un reel ayant le m^eme parametre de sous-type que x, egal au nombre
exa tement representable en ma hine le plus pro he de x dans la dire tion indiquee
par l'argument s.
spa ing(x) : renvoie un reel ayant le m^eme parametre de sous-type que x, egal a l'espa e-
ment absolu des nombres de m^eme parametre de sous-type que x dans le voisinage de
x.
range(x) : .f. hap^tre ??
pre ision(x) : .f. hap^tre ??

11.3 Fon tions numeriques elementaires


11.3.1 Ave onversion
eiling(a) : renvoie le plus petit entier du type par defaut qui est superieur ou egal a a.
oor(a) : renvoie le plus grand entier du type par defaut qui est inferieur ou egal a a.

11.3.2 Sans onversion


modulo(a,p) : renvoie a modulo p pour a et p soit tous les deux reels soit tous les deux
entiers.

11.4 Fon tions elementaires de type ara tere


11.4.1 Conversion entier- ara tere
a har(i) : renvoie le ara tere dont le ode ASCII est spe i e par l'argument i.
ia har( ) : renvoie le ode ASCII orrespondant au ara tere .
i har( ) : renvoie un entier qui represent le numero du ara tere dans la table a laquelle
appartient (ASCCI/EBCDIC)

11.4.2 Manipulation de ha^ne de ara teres


adjustl(string) : ale a gau he la ha^ne de ara tere STRING.
adjustr(string) : ale a droite la ha^ne de ara tere STRING.
len trim : renvoie un entier qui represente la longueur de ha^ne de ara tere STRING
(sans ompter les ara teres blan s a la n).

11.5. HORLOGE EN TEMPS REEL 105

s an( hain,set[,ba k) : renvoie un entier qui represente le numero du premier ara tere
de hain ou apparait l'un des ara teres de set ou 0 sinon. ba k est optionnel et permet
de trouver la derniere o uren e.
verify( hain,set[,ba k) : renvoie un entier qui represente le numero du premier ara tere
de hain ne gurant pas dans set ou 0 sinon. ba k est optionnel, s'il est egal a .true.,
la re her he se fait depuis la n de hain.

11.4.3 Fon tions de omparaison lexi ale


lge(stringa,stringb) : renvoie la valeur .true si strina est apres(ou =) stringb dans la
table ASCCI .false. sinon.
lgt(stringa,stringb) : renvoie la valeur .true si strina est apres stringb dans la table
ASCCI .false. sinon.
lle(stringa,stringb) : renvoie la valeur .true si strina est avant(ou =) stringb dans la
table ASCCI .false. sinon.
llt(stringa,stringb) : renvoie la valeur .true si strina est avant (ou =) stringb dans la
table ASCCI .false. sinon.

Remarque En as d'inegalite de longueur, la ha^ne la plus ourte sera ompletee a blan


sur sa droite.

11.4.4 Transformation pour les manipulations de ha^nes de ara teres


repeat(string,n opies) : permet la formation d'une ha^ne de ara teres par on atenation
de n opies de la ha^ne string.
trim(string) : renvoie la ha^ne de ara teres string sans les blan s eventuels situes a sa
n.

11.5 Horloge en temps reel


date and time(date,timr,zone,values) : sous-programme retournant dans les variables
ara teres date et time la date et l'heure en temps d'horloge murale. L'e art par rap-
port au temps universel est fourni optionnellement par zone.
value est un ve teur d'entiers re uperant les informations pre edentes sous forme d'en-
tiers.
system lo k( ount, ount rate, ount max) : sous-programme retournant dans des va-
riables de type entier la valeur du ompteur de periode d'horloge( ount), le nombre
de periodes par se onde ( ount rate) et la valeur maximale du ompteur de periode
106 
CHAPITRE 11. QUELQUES NOUVELLES FONCTIONS INTRINSEQUES

( ount max). De es informations il est fa ile d'evaluer le temps CPU onsomme par
une portion de programme.

11.6 Fon tions de generation de nombres aleatoires


random number(harvest) : renvoie un nombre pseudo-aleatoire, selon une distribution
uniforme sur l'intervalle [0,1[ ou un tableau de tels nombres. harvest peut ^etre de type
s alaire ou a valeur de tableau et doit ^etre de type reel.
random seed([size[ ,put[,get) : e sous-programme admet soit un argument unique,
soit au un.
{ size : a pour mode d'asso iation OUT et est entier. Le resultat renvoye est la taille
N du tableau de germes.
{ put : a pour mode d'asso iation IN et est un tableau d'entier, de rang 1 et de taille
N. Il est utilise par l'ordinateur pour hangerde germe.
{ get : a pour mode d'asso iation OUT et est un tableau d'entiers de rang 1 et de
taille N. Ce tableau iontient la valeur a tulle du germe.
ANNEXE A : Fortran 90 sur IBM - RISC/6000

Compilation
{ Les ompilateurs xlf et f77 assurent une ompatibilite maximum ave le langage
Fortran 77.
{ Le ompilateur xlf90 assure une onforman e a la norme Fortran 90.
Il est possible de s'adapter a une de nition du langage Fortran en spe i ant les options de
ompilation appropriees.

-qlanglvl = 90std : Ameri an National Standard Fortran90


77std : Ameri an National Standard Fortran77
90pure : Fortran90 sans les aspe ts obsoletes.
90ext : Fortran90 ave les extensions IBM.
Quelques options de ompilation

-qsour e : produit un listing du sour e.


-qnosour e : (par defaut) ne produit pas de listing du sour e.
-q xed : format libre du sour e (f77)
-qfree : format libre du sour e
-g ou qdbg : fournit les informations ne essaires aux debogueurs (xldb, dbx).
-p ou -pg : genere un ode support du pro ling.
-Wl,opt-loader : envoie les options spe i ees a ld.

XL Fortran : Optimisation
Le ompilateur XL Fortran pour AIX Version 4 fournit 5 types d'options pouvant ^etre
utiliser pour augmenter les performan es de la plupart des programmes.

107
108 
CHAPITRE 11. QUELQUES NOUVELLES FONCTIONS INTRINSEQUES

 Utiliser les options d'optimisation -O : -O, -O2, -O3

-O2 : niveau intermediaire d'optimisation, sans alteration de la semantique du programme.


-O : Identique a -O2.
-O3 : Niveau superieur d'optimisation, peut dans ertains as alterer la semantique
du programme sauf si elle est utilisee onjointement ave l'option -qstri t.
-qhot : Niveau le plus eleve d'optimisation. Les e orts sont on entres sur le
reordonnan ement des iterations.
Elle peut reduire les performan es si le ompilateur n'a pas assez d'informations
sur les bornes des indi es de bou les ou sur la on guration du a he.
 Utiliser les options -qar h= et/ou -qtune

Le RISC system/6000 in lut trois types d'ar hite tures de pro esseurs : Power (pwr),
Powerp (pp ), Power2 (pwr2).
On utilise les options -qar h et -qtune pour spe i er le type d'ar hite ture uti-
lisee.

-qar h=pwr2 : le programme s'exe ute uniquement sur ar hite ture POWER2
-qar h=pwr2 -qtune : le programme s'exe ute essentiellement sur ar hite ture POWER2
Par defaut, le programme est adapte au sous-ensemble d'instru tions ommunes aux
trois ar hite tures.
 Sele tionner les sous-options appropriees de -q oat et les options asso iees.

-q oat=
{ hssngl : a elere l'arithmetique simple pre ision. Continue a gerer les debordements.
{ hs t : a elere l'arithmetique simple pre ision. Cette option genere des erreurs
lorsqu'un resultat simple pre ision e e tue un debordement.
{ int : a elere la onversion " oating-point-to-integer" en eliminant la re-
her he de debordement.
{ rsqrt : laisse le ompilateur al uler l'inverse de la ra ine aree d'un nombre.
La division par une ra ine arree est rempla ee par la multipli ation par l'in-
verse de la ra ine arree.

-qautodbl= dblpad4 transforme une variable de Real(4) ou Complex(4) respe -


tivement en Real(8) ou Complex(8). Cette option est parti ulierement utile sur
des stations RISC 6000 d'ar hite ture Power ou Power2 pour des programmes
utilisant des variables sto kees sur 32 bits. Par ontre, elle pourra endommager
les performan es d'un programme s'exe utant sur une ar hite ture PowerPC.
 ERATION
11.6. FONCTIONS DE GEN  
DE NOMBRES ALEATOIRES 109

Re ommandations :
Suivant le ontexte, utilisez les options de ompilation suivantes pour augmenter les
performan es de votre programme.
Sur des ar hite tures Power et Power2
{ Variables en simple pre ision, on preserve la pre ision.

-q oat= int :rsqrt :hssngl


{ Variables en simple pre ision en ameliorant la pre ision des resultats. Dans le
as ou le programme n'est pas un gros onsommateur de memoire (< a la taille
du a he utilisable par exemple).

-q oat= int :rsqrt -qautodbl=dblpad4


{ Le programme ne ontient au une variables en simple pre ision.

-q oat= int :rsqrt


Sur une ar hite ture PowerPC
Les programmes en simple pre ision sont en general plus performant qu'un pro-
gramme en double pre ision sur une ar hite ture PowerPC. La transformation
Real(4) en Real(8) peut deteriorer les performan es.
 Utiliser l'option -q a he.

Cette option ne peut ^etre utilisee que lorsque que le programme s'exe ute sur un
seul RISC 6000. Les informations (taille du a he, taille de la ligne du a he, type de
a he,...) fournies par ette option aide le ompilateur a s'adapter a l'ar hite ture de
la memoire de la ma hine.

L'option -qhot utilise es informations dans ses pro edures d'optimisation.

 Utiliser les prepro esseurs Fortran sur RISC6000 : Vast et KAP

On observe une amelioration de 8 a 18 % d'amelioration en moyenne apres utilisation


des prepro esseurs KAP et VAST.
Ils e e tuent :
{ une optimisation de la gestion de la memoire.
{ une optimisation des transformations algebriques (BLAS,ESSL).
{ inlining
{ une analyse inter-pro edurale
{ autres
110 
CHAPITRE 11. QUELQUES NOUVELLES FONCTIONS INTRINSEQUES

Remarques : Si les deux prepro esseurs e e tuent tous es types d'optimisation, on


preferera VAST pour une meilleure adaptation des transformations algebriques aux
bibliotheques performantes et KAP pour l'optimisation de la gestion memoire.

Dire tives par PROCESS


A tion prioritaire sur les options de la ligne de ommande.

S-ar putea să vă placă și