Fortran 2003 (Cour 1)
W
Description
Cours Fortran
Document Sample


Fortran 2003 1
Les apports de Fortran 2003
e
Patrick Corde et Herv´ Delouis
17 mars 2006
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
Fortran 2003 2
Avertissement : vous trouverez ici un certain nombre de notions introduites par la norme
Fortran. Le choix des sujets est arbitraire et non exhaustif. C’est une exploration des
e e e e
principales nouveaut´s. Les exemples propos´s n’ont pu ˆtre pass´s au crible d’un compilateur ;
e
il est donc fort possible que des erreurs ou des interpr´tations approximatives de la norme s’y
e
soient gliss´es...
e
Voici les principaux documents dont nous nous sommes inspir´s :
e e
– Working Draft J3/04-007 - 10 mai 2004 (www.j3-fortran.org). Publi´ par le comit´
e e
international J3 charg´ du d´veloppement de la norme Fortran (585 pages)
– Fortran 95/2003 explained - Michael METCALF, John REID, Malcolm COHEN - 2004 -
OXFORD University Press - ISBN 0-19-852693-8 (416 pages).
u
– The Future of Fortran - John Reid - juillet/aoˆt 2003 - Scientific Programming
(www.computer.org/cise/cs2003/c4059.pdf).
u
– The New Features of Fortran 2000 - John Reid - Fortran Forum V.21 N.2 aoˆt 2002.
– Object Orientation and Fortran 2002 : Part II - Malcolm Cohen : Fortran Forum -
SIGPLAN - V.18 N.1 avril 1999.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
Table des mati`res 3
e a e
1 – Meilleure int´gration ` l’environnement syst`me . . . . . . . . . . . . . . . 11
e e
2 – Interop´rabilit´ avec C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 13
e e
2.1 – Entit´s de type intrins`ques . . . . . . . . . . . . . . . . . . . . . . . . . 14
2.2 – Tableaux C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16
2.3 – Variables globales C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 17
2.4 – Les pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
e
2.5 – Fonctions C et proc´dures Fortran . . . . . . . . . . . . . . . . . . . . . 22
e
2.5.1 – Exemple de fonction C appel´e depuis Fortran . . . . . . . . . . . . . 24
e e
2.5.2 – Exemple de proc´dure Fortran appel´e depuis C . . . . . . . . . . . . 27
2.5.3 – Interop´rabilit´ entre pointeurs : le type C PTR . . . . . . . . . . . . . 31
e e
e
2.6 – Structures de donn´es C . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
e
3 – Arithm´tique IEEE et traitement des exceptions . . . . . . . . . . . . . . . 55
3.1 – Standard IEEE-754 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
e
3.1.1 – Valeurs sp´ciales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
Table des mati`res 4
3.1.2 – Exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
3.1.3 – Mode d’arrondi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
e e
3.2 – Int´gration standard IEEE : modules intrins`ques . . . . . . . . . . . . . 59
3.3 – Fonctions d’interrogation . . . . . . . . . . . . . . . . . . . . . . . . . . . 60
e
3.4 – Proc´dures de gestion du mode d’arrondi . . . . . . . . . . . . . . . . . . 65
3.5 – Gestion des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
e
3.6 – Proc´dures de gestion des interruptions . . . . . . . . . . . . . . . . . . 70
e e
3.7 – Proc´dures de gestion du contexte arithm´tique . . . . . . . . . . . . . . 71
e
3.8 – Exemple compl´mentaire sur les exceptions . . . . . . . . . . . . . . . . 73
e
3.9 – Modules intrins`ques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 74
3.9.1 – Module IEEE EXCEPTIONS . . . . . . . . . . . . . . . . . . . . . . . . 75
3.9.2 – Module IEEE ARITHMETIC . . . . . . . . . . . . . . . . . . . . . . . . 77
3.9.3 – Module IEEE FEATURES . . . . . . . . . . . . . . . . . . . . . . . . . . 81
3.10 – Documentations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
Table des mati`res 5
e
4 – Nouveaut´s concernant les tableaux dynamiques . . . . . . . . . . . . . . . 85
e
4.1 – Passage en argument de proc´dure . . . . . . . . . . . . . . . . . . . . . 86
e e
4.2 – Composante allouable d’un type d´riv´ . . . . . . . . . . . . . . . . . . . 88
4.3 – Allocation d’un scalaire ALLOCATABLE . . . . . . . . . . . . . . . . . . . . 89
e
4.4 – Allocation/r´allocation via l’affectation . . . . . . . . . . . . . . . . . . . 90
e
4.5 – Sous-programme MOVE ALLOC de r´allocation . . . . . . . . . . . . . . . . 92
e
5 – Nouveaut´s concernant les modules . . . . . . . . . . . . . . . . . . . . . . . 95
5.1 – L’attribut PROTECTED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95
5.2 – L’instruction IMPORT du bloc interface . . . . . . . . . . . . . . . . . . . 96
e
5.3 – USE et renommage d’op´rateurs . . . . . . . . . . . . . . . . . . . . . . . 97
e
6 – Entr´es-sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
e
6.1 – Nouveaux param`tres des instructions OPEN/READ/WRITE . . . . . . . . . 99
e
6.2 – Entr´es-sorties asynchrones . . . . . . . . . . . . . . . . . . . . . . . . . 101
e
6.3 – Entr´es-sorties en mode stream . . . . . . . . . . . . . . . . . . . . . . . 103
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
Table des mati`res 6
e e e
6.4 – Traitement personnalis´ des objets de type d´riv´ . . . . . . . . . . . . . 105
7 – Pointeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 115
7.1 – Vocation (INTENT) des arguments muets pointeurs . . . . . . . . . . . . 115
7.2 – Association et reprofilage . . . . . . . . . . . . . . . . . . . . . . . . . . 116
e
7.3 – Pointeurs de proc´dures . . . . . . . . . . . . . . . . . . . . . . . . . . . 118
e
7.3.1 – Pointeurs de proc´dure : interface implicite . . . . . . . . . . . . . . . 119
e
7.3.2 – Pointeurs de proc´dure : interface explicite . . . . . . . . . . . . . . . 121
e e e
8 – Nouveaut´s concernant les types d´riv´s . . . . . . . . . . . . . . . . . . . . 125
e
8.1 – Composante pointeur de proc´dure . . . . . . . . . . . . . . . . . . . . . 125
e e e
8.2 – Param`tres d’un type d´riv´ . . . . . . . . . . . . . . . . . . . . . . . . . 127
8.3 – Constructeurs de structures . . . . . . . . . . . . . . . . . . . . . . . . . 129
e
8.4 – Visibilit´ des composantes . . . . . . . . . . . . . . . . . . . . . . . . . . 134
e e
8.5 – Extension d’un type d´riv´ . . . . . . . . . . . . . . . . . . . . . . . . . 136
e
9 – Programmation orient´e objet . . . . . . . . . . . . . . . . . . . . . . . . . 139
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
Table des mati`res 7
9.1 – Variable polymorphique . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
9.1.1 – Argument muet polymorphique . . . . . . . . . . . . . . . . . . . . . 141
9.1.2 – Variable polymorphique : attribut POINTER, ALLOCATABLE . . . . . . 142
9.2 – Construction SELECT TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . 143
e e
9.3 – Pointeurs g´n´riques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
9.4 – Type effectif d’une variable polymorphique . . . . . . . . . . . . . . . . . 146
e e a
9.5 – Proc´dures attach´es ` un type (type-bound procedures) . . . . . . . . . 148
e e
9.5.1 – Proc´dure attach´e par nom (name binding) . . . . . . . . . . . . . . 149
e e e e
9.5.2 – Proc´dure attach´e par nom g´n´rique (generic binding) . . . . . . . 150
e e e
9.5.3 – Proc´dure attach´e par op´rateur (operator binding) . . . . . . . . . 151
e e e
9.5.4 – Proc´dure attach´e via le mot-cl´ FINAL (final binding) . . . . . . . . 154
e
9.6 – H´ritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
e e
9.6.1 – H´ritage d’une proc´dure type-bound . . . . . . . . . . . . . . . . . . 156
e
9.6.2 – Surcharge d’une proc´dure type-bound . . . . . . . . . . . . . . . . . 158
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
Table des mati`res 8
e
9.6.3 – Proc´dure type-bound non surchargeable . . . . . . . . . . . . . . . . 160
9.7 – Type abstrait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 161
10 – En conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
Table des mati`res 9
`
Merci d’envoyer toutes remarques concernant ce document a :
Patrick.Corde@idris.fr
a
IDRIS – Bˆt. 506 – BP167 – 91403 ORSAY – FRANCE
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
Table des mati`res 10
Notes personnelles
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
1 – Environnement syst`me 11
e a e
1 – Meilleure int´gration ` l’environnement syst`me
e e e
Voici des proc´dures intrins`ques donnant acc`s aux arguments de la ligne de
a
commande ou ` des variables d’environnement.
GET COMMAND(command, length, status)
e
sous-progr. retournant dans command la commande ayant lanc´ le programme.
COMMAND ARGUMENT COUNT()
fonction retournant le nombre d’arguments de la commande.
GET COMMAND ARGUMENT(number, value, length, status)
sous-progr. retournant dans value le numbere argument de la commande
e e a e
(num´rot´s ` partir de z´ro).
GET ENVIRONMENT VARIABLE(name, value, length, status, [trim name])
e e
sous-progr. retournant dans value la valeur de la variable d’environnement sp´cifi´e
e
en entr´e via name.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
1 – Environnement syst`me 12
e e a e
Un nouveau module intrins`que ISO FORTRAN ENV donne acc`s ` des entit´s publiques
concernant l’environnement :
INPUT UNIT, OUTPUT UNIT et ERROR UNIT sont des constantes symboliques de type
e e a e
entier correspondant aux num´ros des unit´s logiques relatifs ` l’entr´e standard,
a
la sortie standard et ` la sortie d’erreur. Ils remplacent avantageusement
e e e
l’ast´risque employ´ traditionnellement au niveau du param`tre UNIT des
instructions READ/WRITE .
IOSTAT END et IOSTAT EOR sont des constantes symboliques de type entier
e e
correspondant aux valeurs n´gatives prises par le param`tre IOSTAT des instructions
e
d’entr´e/sortie en cas de fin de fichier ou fin d’enregistrement. Cela permet
e e e
d’enrichir la portabilit´ d’un code Fortran. Cependant, les cas d’erreurs g´n`rent
e
une valeur positive restant d´pendante du constructeur.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 13
e e
2 – Interop´rabilit´ avec C
e e e e
L’interop´rabilit´ Fortran–C suppose ´videmment que l’on ne manipule que des entit´s
(variables, fonctions, concepts, ...) communes aux deux langages, ce qui impose un
certain nombre de restrictions et de contraintes.
e e
Pour faciliter le travail du programmeur et am´liorer la portabilit´ de son code, la
ee
norme Fortran 2003 fournit un certain nombre de nouveaux ´l´ments syntaxiques
e e e e
n´cessaires pour faciliter la d´finition d’entit´s interop´rables qui seront ainsi connues et
oe a e
contrˆl´es comme telles ` l’´tape de compilation Fortran.
L’acc`s (USE) au module ISO C BINDING permet l’interop´rabilit´ avec C pour
e e e
e
un certain nombre d’entit´s que nous allons passer en revue...
e e
Note : l’interop´rabilit´ Fortran–C est disponible avec le compilateur Fortran
IBM depuis la version 9.1.0.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 14
e e
2.1 – Entit´s de type intrins`ques
e
Via des constantes symboliques d´finissant :
e e e
1. la valeur enti`re du param`tre KIND des types/sous-types autoris´s. Par exemple :
Type/sous-type en Fortran Type correspondant en C
INTEGER(kind=C INT) int
INTEGER(kind=C SHORT) short int
INTEGER(kind=C LONG) long int
REAL(kind=C FLOAT) float
REAL(kind=C DOUBLE) double
CHARACTER(kind=C CHAR) char
etc. ...
Note : pour le type CHARACTER, C ne supportant que les variables de longueur 1
ee e ıne
(g´r´es sous forme de tableaux), on pourra d´clarer une chaˆ sous la forme :
CHARACTER(kind=C_CHAR), dimension(*) :: chaine
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 15
e e
2. des caract`res sp´ciaux :
Nom Signification en C Valeur ASCII ´
Equivalent C
C NULL CHAR null character achar(0) \0
C ALERT alert achar(7) \a
C BACKSPACE backspace achar(8) \b
C HORIZONTAL TAB horizontal tab achar(9) \t
C NEW LINE line feed/new line achar(10) \n
C VERTICAL TAB vertical tab achar(11) \v
C FORM FEED form feed achar(12) \f
C CARRIAGE RETURN carriage return achar(13) \r
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 16
2.2 – Tableaux C
e e
Un tableau Fortran est interop´rable s’il est d’un type interop´rable et de profil
explicite ou de taille implicite.
e e e
De plus pour les tableaux multidimensionn´s, l’ordre des indices doit ˆtre invers´. Ainsi
les tableaux Fortran :
integer(kind=C_INT), dimension(18,3:7,*) :: t1
integer(kind=C_INT), dimension(18,3:7,100) :: t2
e e e
sont interop´rables avec les tableaux ainsi d´clar´s en C :
int t1[][5][18]
int t2[100][5][18]
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 17
2.3 – Variables globales C
e
Une variable externe C peut interop´rer avec un bloc COMMON ou avec une variable
e e
d´clar´e dans un module Fortran. Par exemple :
module variables_C
use, intrinsic :: ISO_C_BINDING
integer( C_INT ), bind(C) :: c_extern
integer( C_LONG ) :: fort_var
BIND( C, NAME=’C_var’ ) :: fort_var
common/COM/ r, s
common/SINGLE/ t
real(kind= C_FLOAT ) :: r, s, t
bind(C) :: /COM/, /SINGLE/
end module variables_C
e e
Ces variables Fortran sont interop´rables avec celles d´finies en C au niveau externe
par :
int c_extern;
long C_var;
struct {float r, s;} com;
float single;
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 18
Remarques
une variable globale Fortran doit avoir ´t´ d´clar´e avec l’attribut BIND(C) pour
ee e e
e
pouvoir ˆtre mise en correspondance avec une variable externe C,
si cet attribut a ´t´ sp´cifi´ sans le param`tre NAME, une r´f´rence externe est
ee e e e ee
e ee e
g´n´r´e enti`rement en minuscules,
si le param`tre NAME a ´t´ pr´cis´, sa valeur correspond au nom de la r´f´rence
e ee e e ee
e ee e
externe g´n´r´e, en respectant les minuscules et/ou majuscules employ´es.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 19
2.4 – Les pointeurs
e
Les pointeurs C, quels qu’ils soient, sont interop´rables avec des pointeurs Fortran
particuliers du type d´riv´ semi-priv´ C PTR dont une composante priv´e contient
e e e e
e
l’adresse cach´e d’une cible.
a a
On retrouve l` l’analogie avec le descripteur du pointeur Fortran qui est sous-jacent `
l’attribut POINTER. Le pointeur en Fortran est un concept abstrait et puissant
e e
n’autorisant pas (fiabilit´ oblige) la manipulation arithm´tique directe de l’adresse qui
e
reste cach´e.
La n´cessit´ de d´finir les pointeurs de type C PTR, souvent appel´s pointeurs C par
e e e e
a
opposition aux pointeurs Fortran, se justifie en partie par le fait que contrairement ` ces
e e e
derniers ils ne peuvent/doivent pas d´signer une zone m´moire non contigu¨. De plus, le
e e
type C PTR est utilisable dans un contexte d’interop´rabilit´ avec tout type de pointeur
e
C (typ´ ou non – void*).
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 20
e
Toutes les manipulations relatives aux pointeurs C se font via des op´rateurs ou des
e e
proc´dures (m´thodes), ainsi :
C LOC(X) fonction retournant un scalaire de type C PTR contenant l’adresse de la
cible X (au sens de l’op´ration unaire &X selon la norme C) ; par exemple :
e
use ISO_C_BINDING
real( C_FLOAT ), dimension(10), target :: X
type( C_PTR ) :: buf
buf = C_LOC (X)
` e
A noter que la cible X doit avoir l’attribut TARGET ; elle peut d´signer aussi bien un
e e
scalaire, un tableau statique, un tableau dynamique allou´, ou mˆme un pointeur
ea
associ´ ` un scalaire.
e e
Nous verrons plus loin comment la fonction C LOC facilite l’interop´rabilit´ avec des
pointeurs C.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 21
C F POINTER(CPTR, FPTR [,SHAPE]) : convertit CPTR de type C PTR en un
a e
pointeur Fortran FPTR (SHAPE ` sp´cifier si la cible est un tableau) ;
C ASSOCIATED(C PTR 1[, C CPTR 2]) v´rifie que deux pointeurs C (de type C PTR)
e
a e
sont identiques ou que le premier est ` l’´tat nul.
Notes :
e e
1. si l’interop´rabilit´ concerne un pointeur de fonction (C function pointer type),
e e
on utilisera alors les entit´s ´quivalentes :
e e e
– type d´riv´ semi-priv´ C FUNPTR,
– fonction C FUNLOC(X) retournant l’adresse C d’une proc´dure X dans un scalaire
e
de type C FUNPTR,
– sous-programme C F PROCPOINTER(CFPTR, FPTR) : convertit CFPTR, un pointeur
de proc´dure de type C FUNPTR, en un pointeur Fortran FPTR .
e
e e e
2. ces entit´s permettent l’interop´rabilit´ des tableaux dynamiques : un tableau
e e ea e e ea
Fortran allou´ peut ˆtre pass´ ` C et un tableau allou´ en C peut ˆtre associ´ ` un
pointeur Fortran (cf. exemple en fin de chapitre).
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 22
e
2.5 – Fonctions C et proc´dures Fortran
e
Nouveaut´s syntaxiques Fortran :
attribut VALUE pour les arguments muets scalaires. L’argument d’appel
e ee
correspondant n’est plus pass´ par r´f´rence (adresse), mais via une copie
`
temporaire dans le stack. A noter que la copie en retour n’est pas faite, ce qui est
exclusif de intent(OUT/INOUT) !
attribut BIND(C [,NAME=...]) obligatoire ` la d´finition d’une proc´dure Fortran
a e e
e ea e
interop´rable (ou du bloc interface associ´ ` une fonction C dont le nom peut ˆtre
e e e
sp´cifi´ avec le sous-param`tre NAME=).
L’interface de proc´dure Fortran est constitu´e des informations exploitables par
e e
e o e e
Fortran pour d´finir et contrˆler l’interop´rabilit´ avec un prototype de fonction C.
e
Selon les cas, elle est constitu´e de :
e e
Fortran ⇒ C l’appel proc´dural de la fonction C et le bloc interface associ´ ;
e e e
C ⇒ Fortran la partie d´clarative de la proc´dure Fortran appel´e.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 23
e a
Quelques r`gles ` respecter :
interface explicite et attribut BIND(C) obligatoire,
arguments muets tous interop´rables (non optionnels) et en coh´rence avec ceux du
e e
prototype C,
une fonction Fortran doit retourner un scalaire interop´rable et un sous-programme
e
a
doit correspondre ` un prototype C retournant le type void,
un argument du prototype C de type pointeur peut ˆtre associ´ ` un argument
e ea
muet Fortran classique sans l’attribut VALUE (cf. exemple suivant),
un argument du prototype C qui n’est pas de type pointeur doit ˆtre associ´ ` un
e ea
argument muet avec l’attribut VALUE (cf. exemple suivant).
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 24
e
2.5.1 – Exemple de fonction C appel´e depuis Fortran
a
Dans cet exemple, Fortran passe ` C deux arguments :
e ee
– un tableau pass´ classiquement par r´f´rence,
e e
– une variable enti`re pass´e par valeur.
e
Tout d’abord, voici la fonction C appel´e et son prototype :
float C_Func( float *buf, int count )
{
float somme = 0. ;
for( int i=0; i<count; i++ ) somme += buf[i] ;
return somme ;
}
e
Ci-apr`s, voici :
le bloc interface associ´ ` la fonction C (dans un module),
ea
le programme Fortran appelant,
un sch´ma r´capitulatif du passage des arguments.
e e
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 25
module FTN_C
use, intrinsic :: ISO_C_BINDING
interface
function C_FUNC (array, N) BIND(C, NAME="C_Func")
import C_INT , C_FLOAT
implicit none
real(kind= C_FLOAT ) :: C_FUNC
real(kind= C_FLOAT ), dimension(*) :: array
integer(kind= C_INT ), VALUE :: N
end function C_FUNC
end interface
end module FTN_C
program p1
use FTN_C
integer(kind= C_INT ), parameter :: n = 18
real( C_FLOAT ), dimension(n) :: tab
real(kind= C_FLOAT ) :: y
call random_number( tab )
y = C_FUNC ( array=tab, N=n )
e
print *, "Val. retourn´e par la fonction : ", y
end program p1
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 26
Exemple : fonction C appelée depuis Fortran
Appelant Fortran Fonction C
+ B.I. + BIND(C) appelée
Arguments d’appel Arguments muets
1
float* buf
2 int count
real(C_FLOAT) :: tab(18)
18
Prototype
integer(C_INT) :: n 18
Stack
Bloc Interface
&tab[0]
integer(C_INT), VALUE :: N
real(C_FLOAT), dimension(*) :: array 18
Appel : y = C_FUNC(array=tab, N=n)
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 27
e e
2.5.2 – Exemple de proc´dure Fortran appel´e depuis C
c
Dans cet exemple, Fortran re¸oit de C trois arguments :
e e
– une variable enti`re pass´e par valeur,
e e ee
– une variable r´elle pass´e par r´f´rence,
a e ee
– un tableau ` taille implicite pass´ par r´f´rence.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 28
Voici le prototype C de la fonction correspondante et le programme C avec une
e
s´quence d’appel de f1 :
void f1( double *b, double d[], long taille_d );
main()
{
double beta = 378.0 ;
double delta[] = { 17., 12.3, 3.14, 2.718, 0.56,
22.67, 25.8, 89., 76.5, 80. } ;
long taille_delta = sizeof delta / sizeof delta[0] ;
f1( &beta, delta, taille_delta ) ;
return 0;
}
Voici le source du sous-programme Fortran F1 :
subroutine F1 (B, D, TAILLE_D) BIND(C, NAME="f1")
use, intrinsic :: ISO_C_BINDING
implicit none
real( C_DOUBLE ), intent(inout) :: B
real( C_DOUBLE ), dimension(*), intent(in) :: D
integer(kind= C_LONG ), VALUE :: TAILLE_D
print *, "B=", B, "D(",TAILLE_D,")=", D(TAILLE_D)
end subroutine F1
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 29
Exemple : procédure Fortran appelée depuis C
Sous−progr. Fortran
Appelant C
appelé BIND(C)
Arguments d’appel Arguments muets
&beta 378.0
real(C_DOUBLE), intent(inout) :: B
beta
double delta[] 0 17.0 real(C_DOUBLE), intent(in) :: D(*)
1 12.3
3 3.14 integer(C_LONG), VALUE :: TAILLE_D
9 80.0
Stack
long taille_delta 10 &beta
&delta[0]
10
Appel : f1(&beta, delta, taille_delta)
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 30
Le prototype de la fonction C associ´e au sous-programme F1 indique qu’aucune
e
e
valeur n’est retourn´e (void).
Le 1er argument muet A de type INTEGER(C LONG) avec l’attribut VALUE correspond
e c e
au param`tre formel a du prototype ; il re¸oit la valeur de alpha copi´e dans le
stack. Attention : l’attribut INTENT (vocation), n’ayant aucun sens dans ce cas, est
interdit !
Le 2e argument muet B de type REAL(C DOUBLE) correspond au param`tre formel b
e
e c
(pointeur typ´ double) du prototype ; il re¸oit l’adresse de beta (&beta).
Le 3e argument muet D de type REAL(C DOUBLE) est un tableau de taille implicite
e c
correspondant au param`tre formel d du prototype ; il re¸oit l’adresse du
1er ´l´ment du tableau delta.
ee
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 31
e e
2.5.3 – Interop´rabilit´ entre pointeurs : le type C PTR
Argument Fortran de type C PTR
Passage par valeur (VALUE) ee
Passage par r´f´rence
• La fonction C r´cup`re le contenu
e e • La fonction C r´cup`re l’adresse
e e
de la composante adresse encap- e
de la composante adresse encapsul´e
Fortran e
sul´e dans l’argument de type C PTR dans l’argument de type C PTR non
⇓ e ea e
n´cessairement d´j` associ´, e e
n´cessairement associ´,
C • intent(OUT/INOUT) interdit, • Bloc interface obligatoire.
• Bloc interface obligatoire. e
=⇒ cf. exemple 2 ci-apr`s
e
=⇒ cf. exemple 1 ci-apr`s
C • C passe a Fortran un pointeur d´j` va-
` ea • C doit passer l’adresse (&p) d’un poin-
⇓ e
loris´, e e
teur qui pourra donc ˆtre associ´ dans
Fortran • intent(OUT/INOUT) interdit. e
la proc´dure Fortran.
e
=⇒ cf. exemple 4 ci-apr`s e
=⇒ cf. exemples 3 et 4 ci-apr`s
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 32
e
Exemple 1 : Fortran =⇒ C (argument C PTR pass´ par valeur)
a
Dans cet exemple, Fortran alloue et valorise un tableau ` deux dimensions. Son adresse
traduite en un pointeur C ` l’aide de la fonction C LOC est transmise par valeur ` une
a a
fonction C.
e e ee e
De plus la fonction C r´cup`re les dimensions du tableau qui lui ont ´t´ pass´es par
valeur.
Notes :
le tableau Fortran d´clar´ avec l’attribut ALLOCATABLE n’est pas interop´rable. Le
e e e
e e
type C PTR employ´ ici permet de contourner ce probl`me,
on donne deux versions de la fonction C, l’une respectant la norme C89, l’autre la
norme C99.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 33
program EXEMPLE_1
use, intrinsic :: ISO_C_BINDING
real(kind= C_FLOAT ), dimension(:,:), allocatable, target :: mat
integer(kind= C_INT ) :: n, m
interface !------------------------------------------!
subroutine c_func ( n, m, v ) bind(C, name="fct")
import C_INT , C_PTR
integer(kind= C_INT ), VALUE :: n, m
type( C_PTR ), VALUE :: v
end subroutine c_func
end interface !--------------------------------------!
read *, n, m ; allocate( mat(n,m) )
call random_number( mat )
call c_func ( n, m, C_LOC (mat) )
print *, "SOMME = ", sum( array=mat, dim=1 )
deallocate( mat )
end program EXEMPLE_1
----------------------------------------------------------------------------------
void fct( int n, int m, float *vec ) void fct( int n, int m, float mat[m][n] )
{ ! {
float **mat; ! for( int i=0; i<m; i++ )
int i, j; ! mat[i][n-1] *= 2.;
mat = malloc( m*sizeof(float *) ); !
for( i=0, j=0; i<m; i++, j+=n ) ! return;
mat[i] = vec+j, mat[i][n-1] *= 2.; ! }
free( mat ); !
} !
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 34
Exemple 1 : Fortran ==> C (argument C_PTR passé par valeur)
Appelant Fortran Fonction C
+ B.I. + BIND(C) appelée
Arguments d’appel Arguments muets
32 20 float *vec
integer(C_INT) :: n, m
n m int n
mat(n,m) int m
Type
C_PTR Prototype
C_LOC(mat)
Stack
Bloc Interface
32 20
integer(C_INT), VALUE :: n, m
type(C_PTR), VALUE :: v
Appel : call c_func(n, m, C_LOC(mat))
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 35
e ee
Exemple 2 : Fortran =⇒ C (argument C PTR pass´ par r´f´rence)
a
Dans cet exemple, Fortran souhaite sous-traiter ` une fonction C l’allocation d’une
ee
matrice n*m qu’il r´f´rencera ensuite via un pointeur Fortran.
` e e
A l’appel de la fonction C, Fortran passe par valeur les deux dimensions n et m d´sir´es
ee e e
et passe par r´f´rence un pointeur interop´rable non encore associ´.
e e e e
La fonction C appel´e alloue une zone m´moire de n*m r´els. Son adresse est stock´e
dans l’objet Fortran pointeurC de type C PTR.
En retour de la fonction C, Fortran convertit l’objet pointeurC en un pointeur Fortran
classique (via la proc´dure C F POINTER) qui devient ainsi associ´ ` la matrice allou´e
e ea e
en C.
a
Ensuite cet objet pointeurC est transmis par valeur ` une autre fonction C afin de
e e
lib´rer la zone allou´e.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 36
program exemple2
use ISO_C_BINDING
integer(kind= C_INT ) :: n, m
type( C_PTR ) :: pointeurC
real(kind= C_FLOAT ), dimension(:,:), pointer :: p_mat
interface
subroutine c_alloc ( ptrC, n, m ) bind(C, name="C_alloc")
import C_PTR , C_INT
type( C_PTR ), intent(out) :: ptrC
integer(kind= C_INT ), VALUE :: n, m
end subroutine c_alloc
subroutine c_free ( ptrC ) bind(C, name="C_free")
import C_PTR
type( C_PTR ), VALUE :: ptrC
end subroutine c_free
end interface
read *, n, m ; call c_alloc ( pointeurC, n, m )
call C_F_POINTER ( CPTR=pointeurC, FPTR=p_mat, shape=(/ n, m /) )
call random_number( p_mat )
print *, "SOMME = ", sum( array=p_mat, dim=1 )
call c_free ( pointeurC )
end program exemple2
----------------------------------------------------------------------
void C_alloc( float **p, int n, int m )
{ *p = malloc( n*m*sizeof(float) ); return ; }
----------------------------------------------------------------------
void C_free( float *p ) { free( p ); return ; }
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 37
Exemple 2 : Fortran ==> C (argument C_PTR passé par référence)
Appelant Fortran Fonction C
+ B.I. + BIND(C) appelée
Arguments d’appel Arguments muets
type(C_PTR) :: pointeurC float **p
int n
int m
R
C_F_POINTE
Prototype
p_mat pointeurC
integer(C_INT) :: n, m 24 12
n m *p=malloc(n*m*sizeof(float))
Stack
Bloc Interface
type(C_PTR), intent(out) :: ptrC 24 12
integer(C_INT), VALUE :: n, m
Appel : call c_alloc(pointeurC, n, m)
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 38
e ee
Exemple 3 : C =⇒ Fortran (argument C PTR pass´ par r´f´rence)
a
Dans cet exemple, C souhaite sous-traiter ` des sous-programmes Fortran la gestion
e e
(allocation, valorisation, traitement, lib´ration) d’un vecteur de 100 r´els.
`
A l’appel du sous-programme for alloc, C passe en argument l’adresse &vec d’un
e
pointeur de r´els.
Dans le sous-programme for alloc, l’argument pointeurC muet correspondant est un
pointeur de type C PTR de vocation INTENT(OUT) sans l’attribut VALUE.
e a
Fortran alloue un tableau de la taille requise dont l’adresse est retourn´e ` C via
ea
l’argument de sortie pointeurC valoris´ ` l’aide de la fonction C LOC.
e a
En retour du sous-programme Fortran, C peut acc`der ` la zone dynamique par
e
l’interm´diaire du pointeur vec.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 39
Voici successivement :
– le programme C appelant avec le prototype des sous-programmes Fortran,
– les sous-programmes Fortran,
e
– un sch´ma du passage des arguments du sous-programme for alloc.
#include <stdio.h>
void F_alloc ( float **, int );
void F_moyenne( float * , int );
void F_free ( void );
int main()
{
const int n = 100;
float *vec;
F_alloc ( &vec, n );
printf( " vec[50] = %f\n", vec[50] );
F_moyenne ( vec, n );
F_free ();
return 0;
}
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 40
module creer_liberer
use ISO_C_BINDING
real(kind= C_FLOAT ), dimension(:), allocatable, target :: vecteur
contains
subroutine for_alloc ( pointeurC, n ) BIND(C, name="F_alloc")
type( C_PTR ), intent(out) :: pointeurC
integer(kind= C_INT ), VALUE :: n
allocate( vecteur(n) )
call random_number( vecteur )
pointeurC = C_LOC ( vecteur )
end subroutine for_alloc
subroutine for_free () BIND(C, name="F_free")
if ( allocated(vecteur) ) deallocate( vecteur )
end subroutine for_free
end module creer_liberer
module calculs
use ISO_C_BINDING
contains
subroutine moyenne ( pointeurC, n ) BIND(C, name="F_moyenne")
type( C_PTR ), VALUE :: pointeurC
integer( C_INT ), VALUE :: n
real(kind= C_FLOAT ), dimension(:), pointer :: p
call C_F_POINTER ( CPTR=pointeurC, FPTR=p, shape=(/ n /) )
print *, "MOYENNE =", sum( p ) / n
end subroutine moyenne
end module calculs
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 41
Exemple 3 : C ==> Fortran (argument C_PTR passé par référence)
Sous−programme Fortran
Appelant C
appelé
Arguments d’appel Arguments muets
const int n=100; 100
integer(C_INT), VALUE :: n
n
type(C_PTR), intent(out) :: pointeurC
&vec
vec
(float *vec;) C_LOC
1 2 3 100
Cible dynamique
vecteur
Stack
C_PTR pointeurC
100
Appel : F_alloc(&vec, n)
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 42
Notes sur l’exemple 3 ci-dessus :
Le tableau dynamique vecteur (allocatable) est d´clar´ comme entit´ globale
e e e
e
dans le module creer liberer car il n’est pas possible de le lib´rer via un pointeur
e e
associ´ pass´ en argument du sous-programme for free.
L’entit´ vecteur pourrait ˆtre d´clar´e avec l’attribut pointer (au lieu de
e e e e
e
allocatable) ; il ne serait alors plus n´cessaire de le globaliser pour pouvoir
e
d´sallouer la cible dynamique anonyme qui lui serait associ´e.e
e
Par contre, sa conversion en pointeur C interop´rable ne pourrait se faire que sous
la forme C LOC(vecteur(1)) car, selon la norme, l’argument de C LOC ne peut ˆtree
ea
un pointeur Fortran associ´ ` un tableau.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 43
ee
Exemple 4 : C =⇒ Fortran (argument C PTR par r´f´rence et par valeur)
e
Dans cet exemple, C sollicite des m´thodes Fortran pour manipuler des objets de type
e e e e
d´riv´ non interop´rables adress´s via un pointeur de type C PTR.
e
1. C d´clare deux pointeurs,
e e
2. C appelle la m´thode INIT pour cr´er et valoriser deux objets de ce type (passage
ee
par r´f´rence),
e
3. C appelle la m´thode ADD pour effectuer un traitement sur ces deux objets (passage
par valeur).
Notes :
– dans la m´thode INIT on utilise la fonction C LOC pour retourner ` la fonction C
e a
e
l’adresse de l’objet allou´.
– dans la m´thode ADD on utilise la proc´dure C F POINTER afin de convertir l’objet de
e e
type C PTR en pointeur Fortran permettant de manipuler l’objet transmis.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 44
module gestion_cellule
use ISO_C_BINDING
type pass
integer n
real, allocatable, dimension(:) :: a |-----------------------------------
... /* Fonction C appelante */
end type pass main()
type(pass), pointer :: p_cel {
contains void *p, *q ;
subroutine init ( data, n ) BIND(C) ...
type( C_PTR ), intent(out) :: data init( &p, 100 ) ;
integer( C_INT ), VALUE :: n init( &q, 200 ) ;
allocate(p_cel) ...
p_cel%n = n add( p, ... ) ;
allocate(p_cel%a(n)) add( q, ... ) ;
data = C_LOC (p_cel)
end subroutine init return 0 ;
subroutine add ( data, ... ) BIND(C) }
type( C_PTR ), VALUE :: data |-----------------------------------
. . .
call C_F_POINTER ( data, p_cel )
. . .
end subroutine add
end module gestion_cellule
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 45
e
2.6 – Structures de donn´es C
Via l’attribut BIND(C).
e
Exemple : un objet de type C struct ainsi d´fini en C :
typedef struct
{
int m, n;
float r;
} C_struct;
e
est interop´rable avec une structure Fortran du type F struc :
use, intrinsic :: ISO_C_BINDING
type, BIND(C) :: F_struct
integer(kind= C_INT ) :: m, n
real(kind= C_FLOAT ) :: r
end type F_struct
e e
Note : les entit´s ALLOCATABLE et les proc´dures sont exclues pour les composantes qui
doivent bien sˆr toutes ˆtre interop´rables ; par contre, les types C PTR et C FUNPTR
u e e
e e
permettent d’y stocker l’adresse C de telles entit´s (cf. exemple ci-apr`s).
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 46
a
Exemple Fortran =⇒ C : Fortran passe par valeur ` une fonction C une structure de
e e e a
donn´es (type vecteur ) contenant une composante pointeur interop´rable associ´e ` une
ea e e e e
cible dynamique d´j` allou´e et valoris´e. Via un argument muet d’entr´e d´fini comme
e e a
une structure C ´quivalente, la fonction C peut acc´der ` la cible dynamique.
e e e
Voici tout d’abord un module contenant la d´finition du type d´riv´ Fortran vecteur et
e
le bloc interface de la fonction C appel´e :
module inter
use ISO_C_BINDING
type, BIND(C) :: vecteur
integer(kind= C_INT ) :: n
type( C_PTR ) :: pointeur_C ! Composante dynamique type "pointeur C"
end type vecteur
interface ! <---------- Bloc interface de la fonction C
subroutine moyenne (vec) BIND(c, name="C_moyenne")
import vecteur
type(vecteur), VALUE :: vec
end subroutine moyenne
end interface
end module inter
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 47
Voici le programme Fortran appelant la fonction C ; il lui passe le vecteur v encapsulant
le tableau dynamique tab :
program interoper
use inter
implicit none
type(vecteur) :: v
real( C_FLOAT ), allocatable, dimension(:), target :: tab
v%n = 100
allocate (tab(v%n))
call random_number(tab)
v%pointeur_C = C_LOC (tab)
call moyenne (vec=v) ! <---Appel fonction C
deallocate(tab)
end program interoper
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 48
e e e e
Voici la d´finition de la fonction C moyenne qui r´cup´re en argument le vecteur pass´
e e
par Fortran pour acc´der au tableau allou´ dans le but de calculer la moyenne de ses
ee
´l´ments :
#include <stdio.h>
typedef struct
{
int len ;
float *p ;
} vecteur ;
void C_moyenne(vecteur vec)
{
float moy ;
e e
printf( "Le vecteur vec a %d ´l´ments.\n", vec.len ) ;
moy = 0. ;
for( int i=0; i<vec.len; i++ ) moy += vec.p[i] ;
moy /= vec.len ;
printf( "Moyenne = %f\n", moy ) ;
return ;
}
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 49
Exemple 1 : Fortran ==> C (structure de données en argument avec composante pointeur)
Appelant Fortran Fonction C
+ B.I. + BIND(C) appelée
Arguments d’appel Arguments muets
tab
n 100 1 vecteur vec
Structure
)
v ab 2 Tableau
(t
OC dynamique
C_L
ptr_C Prototype
100
Bloc Interface Stack
type(vecteur), VALUE :: vec
len 100
Appel : call moyenne(vec=v) p &tab[0]
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 50
e e e e
Exemple C =⇒ Fortran : interop´rabilit´ d’une structure de donn´es pass´e par
e a
valeur et contenant une composante pointeur associ´e ` une cible dynamique. Dans cet
e e e
exemple la cible est allou´e en C puis valoris´e dans le sous-programme Fortran appel´.
Voici le sous-programme Fortran valorisation :
module m
use ISO_C_BINDING
implicit none
type, BIND(C) :: vecteur
integer(kind= C_INT ) :: n
type( C_PTR ) :: pointeurC ! Composante dynamique type "pointeur C"
end type vecteur
contains
subroutine valorisation (v) BIND(C, NAME="F_val")
type(vecteur), VALUE :: v
real(kind= C_FLOAT ), dimension(:), pointer :: pointeurF
e
print *, "Taille du vecteur allou´ en C :", v%n
!-- Conversion du "pointeur C" en pointeur Fortran
call C_F_POINTER ( CPTR=v%pointeurC, &
FPTR=pointeurF, &
SHAPE=(/ v%n /) )
call random_number(pointeurF)
end subroutine valorisation
end module m
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 51
e
Programme C et prototype de la fonction Fortran F val appel´e :
#include <stdio.h>
#include <stdlib.h>
typedef struct
{
int len ;
float *p ;
} vecteur ;
void F_val(vecteur v) ;
main()
{
float moy ;
vecteur vec ;
moy = 0. ;
vec.p = (float *)calloc(vec.len=1000, sizeof(float)) ;
F_val( vec ) ;
for( int i=0; i<vec.len; i++ ) moy += vec.p[i] ;
moy /= vec.len ; printf( "Moyenne = %f\n", moy ) ;
free(vec.p) ;
return 0 ;
}
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 52
Exemple 2 : C ==> Fortran (structure de données en argument avec composante pointeur)
Appelant C Fonction Fortran appelée
Arguments d’appel Arguments muets
len 1000
vecteur vec type(vecteur), VALUE, intent(in) :: v
p
n 1000
0 1 2 Tableau dynamique 999
Structure
vec.p v pointeurF
pointeurC
C_F_POINTER
Prototype C Stack
1000 len
vecteur vec
Appel : F_val(vec) &vec.p[0] p
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 53
e ee
Reprenons ce mˆme exemple en passant cette fois-ci le vecteur vec par r´f´rence.
a
Voici les modifications ` apporter :
void F_val(vecteur *) ;
main()
{
. . .
F_val( &vec ) ;
. . .
}
module m
. . .
contains
subroutine valorisation(v) BIND(C, NAME="F_val")
type(vecteur), intent(in) :: v
. . .
end module m
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
2 – Interop´rabilit´ 54
Notes personnelles...
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE 55
e
3 – Arithm´tique IEEE et traitement des exceptions
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : standard IEEE-754 56
3.1 – Standard IEEE-754
e e
Le standard IEEE-754 concernant l’arithm´tique r´elle flottante ainsi que le traitement
e e e
des exceptions d´finit un syst`me de repr´sentation des nombres flottants.
e
3.1.1 – Valeurs sp´ciales
e e
Ce syst`me permet la repr´sentation des valeurs sp´ciales suivantes :
e
NaN (Not a Number ) : valeur d’une expression math´matique ind´termin´e comme
e e e
√
0/0, 0 ∗ ∞, ∞/∞, −1,
+INF (+∞), -INF (−∞),
0+ , 0 − ,
d´normalis´es : concernent les tr`s petites valeurs.
e e e
e e e
Dans tout syst`me de repr´sentation, en l’occurrence celui d´fini par le standard IEEE,
e e
l’ensemble des r´els repr´sentables est un ensemble fini.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : standard IEEE-754 57
3.1.2 – Exceptions
e e e e
Dans des cas extrˆmes, une op´ration arithm´tique peut produire comme r´sultat une
e e
des valeurs sp´ciales indiqu´es ci-dessus ou bien une valeur en dehors de l’ensemble des
e e e e e
valeurs repr´sentables. De tels cas g´n`rent des ´v´nements de type exception.
e
Le standard IEEE d´finit 5 classes d’exception :
overflow : valeur calcul´e trop grande,
e
underflow : valeur calcul´e trop petite,
e
division par z´ro,
e
op´ration invalide : valeur calcul´e ´gale ` NaN,
e e e a
op´ration inexacte : valeur calcul´e non repr´sentable exactement (implique un
e e e
arrondi).
e e e
Dans le cas d’un underflow, la valeur calcul´e est soit une valeur d´normalis´e (gradual
underflow ) soit 0 (abrupt underflow ) selon le choix du programmeur.
e e
Lorsqu’une exception se produit, un flag sp´cifique est positionn´.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : standard IEEE-754 58
3.1.3 – Mode d’arrondi
e e e
Lorsque la valeur calcul´e n’est pas repr´sentable, une exception de type op´ration
e ee e
inexacte est g´n´r´e et le calcul se poursuit avec une valeur approch´e (arrondie).
e
Le standard IEEE d´finit 4 modes d’arrondi :
toward nearest (d´faut sur IBM xlf),
e
toward z´ro,
e
toward +INF (+∞),
toward -INF (−∞).
e e
Note : aucune valeur par d´faut n’est pr´vue par la norme !
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 59
e e
3.2 – Int´gration standard IEEE : modules intrins`ques
e e e e
Trois modules intrins`ques permettent l’acc`s aux fonctionnalit´s d´finies par le
standard IEEE :
IEEE ARITHMETIC,
IEEE EXCEPTIONS,
IEEE FEATURES.
e
Ces modules contiennent des d´finitions :
de types,
de constantes symboliques,
de proc´dures.
e
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : fonctions d’interrogation 60
3.3 – Fonctions d’interrogation
e
Ce sont des fonctions d’interrogation sur l’environnement utilis´ afin de savoir s’il est
conforme en tout ou partie au standard IEEE :
IEEE SUPPORT STANDARD(x),
IEEE SUPPORT DATATYPE(x),
IEEE SUPPORT DENORMAL(x),
IEEE SUPPORT INF(x),
IEEE SUPPORT NAN(x),
e
Elles retournent une valeur logique indiquant si l’environnement utilis´ respecte le
e
standard ou un aspect du standard pour le type de l’argument r´el x fourni.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : fonctions d’interrogation 61
ıtre
Il existe des fonctions permettant de connaˆ la classe ou le type de valeur d’un r´el x e
e a
(NaN, ∞, n´gatif, positif, nul, ... ). L’appel ` ces fonctions n’est possible que si la
e a e
fonction IEEE SUPPORT DATATYPE appliqu´e ` ce r´el retourne la valeur vraie.
e e e
Les classes sont d´finies via des constantes symboliques d’un type pr´d´fini
(IEEE CLASS TYPE) dont voici la liste :
IEEE SIGNALING NAN (NaNS),
IEEE QUIET NAN (NaNQ),
IEEE NEGATIVE INF,
IEEE POSITIVE INF,
IEEE NEGATIVE DENORMAL,
IEEE POSITIVE DENORMAL,
IEEE NEGATIVE NORMAL,
IEEE NEGATIVE ZERO,
IEEE POSITIVE NORMAL,
IEEE POSITIVE ZERO,
IEEE OTHER VALUE
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : fonctions d’interrogation 62
Ces fonctions sont les suivantes :
IEEE CLASS(x),
IEEE IS NAN(x),
IEEE IS FINITE(x),
IEEE IS NEGATIVE(x),
IEEE IS NORMAL(x).
e e e
De plus la fonction IEEE_VALUE(x, class) g´n`re un r´el d’un type (celui de x) et
e
d’une classe donn´s.
e e e
L’exemple qui suit permet de r´cup´rer la classe d’un r´el x lu dans le fichier fort.1.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : fonctions d’interrogation 63
program class
use IEEE_ARITHMETIC
implicit none
type( IEEE_CLASS_TYPE ) :: class_type
real :: x, y
read( unit=1 )x
if( IEEE_SUPPORT_DATATYPE ( x ) ) then
class_type = IEEE_CLASS ( x )
if ( IEEE_SUPPORT_NAN ( x ) ) then
if ( class_type == IEEE_SIGNALING_NAN ) &
print *,"X is a IEEE_SIGNALING_NAN "
if ( class_type == IEEE_QUIET_NAN ) &
print *,"X is a IEEE_QUIET_NAN "
end if
if ( IEEE_SUPPORT_INF ( x ) ) then
if ( class_type == IEEE_NEGATIVE_INF ) &
print *,"X is a IEEE_NEGATIVE_INF number"
if ( class_type == IEEE_POSITIVE_INF ) &
print *,"X is a IEEE_POSITIVE_INF number"
end if
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : fonctions d’interrogation 64
if ( IEEE_SUPPORT_DENORMAL ( x ) ) then
if ( class_type == IEEE_NEGATIVE_DENORMAL ) &
print *,"X is a IEEE_NEGATIVE_DENORMAL number"
if ( class_type == IEEE_POSITIVE_DENORMAL ) &
print *,"X is a IEEE_POSITIVE_DENORMAL number"
end if
if ( class_type == IEEE_NEGATIVE_NORMAL ) &
print *,"X is a IEEE_NEGATIVE_NORMAL number"
if ( class_type == IEEE_POSITIVE_NORMAL ) &
print *,"X is a IEEE_POSITIVE_NORMAL number"
if ( class_type == IEEE_NEGATIVE_ZERO ) &
print *,"X is a IEEE_NEGATIVE_ZERO number"
if ( class_type == IEEE_POSITIVE_ZERO ) &
print *,"X is a IEEE_POSITIVE_ZERO number"
end if
y = IEEE_VALUE ( x, class_type ); print *,y
end program class
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : gestion mode d’arrondi 65
e
3.4 – Proc´dures de gestion du mode d’arrondi
e ee
Le mode d’arrondi utilis´ lors de calculs est g´r´ par deux sous-programmes (les
e e a
diff´rents modes sont d´finis ` l’aide des constantes symboliques IEEE NEAREST,
e e
IEEE UP, IEEE DOWN, IEEE TO ZERO du type pr´d´fini IEEE ROUND VALUE) :
IEEE GET ROUNDING MODE(round value),
IEEE SET ROUNDING MODE(round value),
use IEEE_ARITHMETIC
implicit none
type( IEEE_ROUND_TYPE ) :: round_value
! Sauvegarde du mode d’arrondi courant.
call IEEE_GET_ROUNDING_MODE ( round_value )
! Positionnement du mode d’arrondi toward +INF
call IEEE_SET_ROUNDING_MODE ( IEEE_UP )
. . .
. . .
e
! Restauration du mode d’arrondi sauvegard´.
call IEEE_SET_ROUNDING_MODE ( round_value )
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : gestion des exceptions 66
3.5 – Gestion des exceptions
e e e e
Le programmeur, apr`s avoir d´tect´ la survenance d’une exception, a la possibilit´ de
e
lancer un traitement personnalis´.
`
A chacune des 5 classes d’exception correspondent 2 drapeaux :
l’un indiquant si l’´v´nement relatif ` l’exception s’est r´alis´,
e e a e e
l’autre signalant si ce type d’exception provoque une interruption du programme.
e ee e a
Ces diff´rents drapeaux sont r´f´renc´s ` l’aide de constantes symboliques d’un type
pr´d´fini (IEEE FLAG TYPE) :
e e
IEEE UNDERFLOW,
IEEE OVERFLOW,
IEEE DIVIDE BY ZERO,
IEEE INVALID
IEEE INEXACT
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : gestion des exceptions 67
De plus, deux constantes symboliques de type tableau (IEEE USUAL, IEEE ALL)
ee
permettent de r´f´rencer tout ou partie de ces drapeaux :
IEEE_USUAL = (/ IEEE_OVERFLOW , IEEE_DIVIDE_BY_ZERO , IEEE_INVALID /)
IEEE_ALL = (/ IEEE_USUAL , IEEE_UNDERFLOW , IEEE_INEXACT /)
e
Ces constantes symboliques sont principalement utilis´es comme argument de fonctions
telles que :
IEEE GET FLAG(flag, flag value)
IEEE SET FLAG(flag, flag value)
e
Ces proc´dures retournent dans l’argument flag value un logique signalant l’´tat de
e
l’exception indiqu´e en 1er argument sous forme d’une des constantes symboliques
e
e e
pr´c´dentes.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : gestion des exceptions 68
Exemple d’utilisation
program except
use IEEE_EXCEPTIONS
implicit none
real valeur_calculee
logical flag_value
call IEEE_SET_FLAG ( IEEE_ALL , .false. )
valeur_calculee = 2.453*4.532
e
print *,"valeur_calcul´e : ", valeur_calculee
call IEEE_GET_FLAG ( IEEE_INEXACT , flag_value )
e
if( flag_value ) print *,"Valeur calcul´e inexacte."
end program except
e
Note : lors de l’appel et du retour d’une proc´dure, le contexte de gestion de
e e e
l’arithm´tique IEEE est sauvegard´ puis restaur´. Pour des raisons de performance, ce
e e
processus peut ˆtre inhib´ sur certains environnements via une option du compilateur
(cf. option -qnostrictieeemod de xlf sur IBM).
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : gestion des exceptions 69
e
Lorsqu’une exception de type underflow se produit, le r´sultat du calcul est soit 0
e e
(abrupt underflow ) soit un nombre d´normalis´ si le processeur supporte de tels
nombres (gradual underflow ).
e e e
Les deux sous-programmes suivants permettent de g´rer le mode d’underflow d´sir´
(gradual underflow ou abrupt underflow ) :
IEEE GET UNDERFLOW MODE(gradual)
IEEE SET UNDERFLOW MODE(gradual)
use IEEE_ARITHMETIC
implicit none
logical :: save_underflow_mode
! Sauvegarde du mode d’ underflow courant.
call IEEE_GET_UNDERFLOW_MODE ( GRADUAL=save_underflow_mode )
! Positionnement du mode abrupt underflow
CALL IEEE_SET_UNDERFLOW_MODE ( GRADUAL=.false. )
! Calculs dans le mode abrupt underflow ; une valeur
e e
! trop petite est alors remplac´e par z´ro.
! . . .
! Restauration du mode d’ underflow sauvegard´.
e
CALL IEEE_SET_UNDERFLOW_MODE ( GRADUAL=save_underflow_mode )
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : gestion des interruptions 70
e
3.6 – Proc´dures de gestion des interruptions
e ee e
Lorsqu’une exception est g´n´r´e, le programme peut s’arrˆter ou bien continuer.
oe
Ce mode de fonctionnement est contrˆl´ par les sous-programmes suivants :
IEEE GET HALTING MODE(flag, halting)
IEEE SET HALTING MODE(flag, halting)
use IEEE_ARITHMETIC
implicit none
real :: x, zero
logical, dimension(5) :: flags
logical :: arret
read *,zero, arret ! zero = 0.
a e
! Mode d’interruption suite ` une division par z´ro.
call IEEE_SET_HALTING_MODE ( IEEE_DIVIDE_BY_ZERO , arret )
x = 1./zero; print *,x
call IEEE_GET_FLAG ( IEEE_ALL , flags )
print *, flags
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : contexte arithm´tique 71
e e
3.7 – Proc´dures de gestion du contexte arithm´tique
e e a e
Deux autres sous-programmes g`rent l’´tat de l’environnement relatif ` l’arithm´tique
flottante (drapeaux d’exceptions et d’interruptions, mode d’arrondi) :
IEEE GET STATUS(status value)
IEEE SET STATUS(status value)
e
L’argument status_value est du type IEEE STATUS TYPE ; il contient en entr´e (SET)
e a e
ou en sortie (GET) l’´tat de tous les drapeaux relatifs ` l’arithm´tique flottante.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : contexte arithm´tique 72
Voici un exemple montrant comment sauvegarder puis restaurer l’ensemble de ces
drapeaux :
use IEEE_EXCEPTIONS
implicit none
type( IEEE_STATUS_TYPE ) status_value
!
! Sauvegarde de tout le contexte flottant IEEE.
call IEEE_GET_STATUS ( status_value )
!
a
! Mettre tous les "drapeaux" de type exception ` faux.
call IEEE_SET_FLAG ( IEEE_ALL , .false. )
!
! e
Calculs avec traitement des exceptions ´ventuelles.
! . . .
e e
! Restauration de tout le contexte flottant IEEE pr´c´dent.
call IEEE_SET_STATUS ( status_value )
! . . .
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : exemple sur les exceptions 73
e
3.8 – Exemple compl´mentaire sur les exceptions
use IEEE_EXCEPTIONS
implicit none
type( IEEE_FLAG_TYPE ), dimension(2), parameter :: &
out_of_range = (/ IEEE_OVERFLOW , IEEE_UNDERFLOW /)
logical, dimension(2) :: flags_range
logical, dimension(5) :: flags_all
call IEEE_SET_HALTING_MODE ( IEEE_ALL , .false. )
. . .
. . .
e e e
call IEEE_GET_FLAG ( out_of_range, flags_range ) !<== Proc´dure ´l´mentaire
if ( any(flags_range) ) then
! Une exception du type "underflow" ou "overflow" s’est produite.
. . .
end if
. . .
. . .
e e e
call IEEE_GET_FLAG ( IEEE_ALL , flags_all ) !<== Proc´dure ´l´mentaire
if ( any(flags_all) ) then
! Une exception quelconque s’est produite.
. . .
end if
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 74
e
3.9 – Modules intrins`ques
e
La disponibilit´ des modules IEEE ARITHMETIC, IEEE EXCEPTIONS et IEEE FEATURES
e e e e
d´pend de l’environnement utilis´, de mˆme que les constantes symboliques d´finies
u
dans le module IEEE FEATURES, dans le cas o` celui-ci est fourni.
Le module IEEE ARITHMETIC se comporte comme s’il contenait une instruction use
IEEE EXCEPTIONS.
Si, dans une unit´ de programme, le module IEEE ARITHMETIC ou IEEE EXCEPTIONS est
e
accessible, les fonctionnalit´s IEEE OVERFLOW et IEEE DIVIDE BY ZERO sont support´es
e e
e e
dans cette unit´ pour tout type de r´els et de complexes. On utilisera la fonction
e
IEEE SUPPORT FLAG afin de savoir si les autres fonctionnalit´s le sont.
e e e e
Ces modules d´finissent 5 types d´riv´s dont les composantes sont priv´es et un
e
ensemble de proc´dures.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 75
3.9.1 – Module IEEE EXCEPTIONS
e
Il d´finit les types :
IEEE FLAG TYPE permettant d’identifier un type d’exception particulier. Les valeurs
possibles sont les constantes symboliques suivantes :
¸ IEEE INVALID,
¸ IEEE OVERFLOW,
¸ IEEE DIVIDE BY ZERO,
¸ IEEE UNDERFLOW,
¸ IEEE INEXACT
IEEE STATUS TYPE pour la sauvegarde de l’environnement flottant.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 76
e
Il d´finit les fonctions d’interrogations suivantes :
IEEE SUPPORT FLAG,
IEEE SUPPORT HALTING,
e ee
Il d´finit les sous-programmes ´l´mentaires suivants :
IEEE GET FLAG,
IEEE GET HALTING MODE,
e ee
Il d´finit les sous-programmes non ´l´mentaires suivants :
IEEE GET STATUS,
IEEE SET FLAG,
IEEE SET HALTING MODE,
IEEE SET STATUS
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 77
3.9.2 – Module IEEE ARITHMETIC
e
Il d´finit les types :
IEEE CLASS TYPE permettant d’identifier la classe d’un r´el. Les valeurs possibles
e
sont les constantes symboliques suivantes :
¸ IEEE SIGNALING NAN,
¸ IEEE QUIET NAN,
¸ IEEE NEGATIVE INF,
¸ IEEE NEGATIVE NORMAL,
¸ IEEE NEGATIVE DENORMAL,
¸ IEEE NEGATIVE ZERO,
¸ IEEE POSITIVE ZERO,
¸ IEEE POSITIVE DENORMAL,
¸ IEEE POSITIVE NORMAL,
¸ IEEE POSITIVE INF,
¸ IEEE OTHER VALUE
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 78
IEEE ROUND TYPE permettant d’identifier le mode d’arrondi. Les valeurs possibles
sont les constantes symboliques suivantes :
¸ IEEE NEAREST,
¸ IEEE TO ZERO,
¸ IEEE UP,
¸ IEEE DOWN,
¸ IEEE OTHER
e e
De plus, il surd´finit les op´rateurs == et /= pour deux valeurs d’un de ces types.
e
Il d´finit les fonctions d’interrogation suivantes :
IEEE SUPPORT DATATYPE,
IEEE SUPPORT DENORMAL,
IEEE SUPPORT DIVIDE,
IEEE SUPPORT INF
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 79
e ee
Il d´finit les fonctions ´l´mentaires suivants :
IEEE CLASS,
IEEE COPY SIGN,
IEEE IS FINITE,
IEEE IS NAN,
IEEE IS NORMAL,
IEEE IS NEGATIVE,
IEEE LOGB,
IEEE NEXT AFTER,
IEEE REM,
IEEE RINT,
IEEE SCALEB,
IEEE UNORDERED,
IEEE VALUE
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 80
e
Il d´finit la fonction de transformation suivante :
IEEE SELECTED REAL KIND
e ee
Il d´finit les sous-programmes non ´l´mentaires suivants :
IEEE GET ROUNDING MODE,
IEEE GET UNDERFLOW MODE,
IEEE SET ROUNDING MODE,
IEEE SET UNDERFLOW MODE
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 81
3.9.3 – Module IEEE FEATURES
e e a
Il d´finit les constantes symboliques (du type IEEE FEATURES TYPE) associ´es ` des
e
fonctionnalit´s IEEE :
IEEE DATATYPE,
IEEE DENORMAL,
IEEE DIVIDE,
IEEE HALTING,
IEEE INEXACT FLAG,
IEEE INF,
IEEE INVALID FLAG,
IEEE NAN,
IEEE ROUNDING,
IEEE SQRT,
IEEE UNDERFLOW FLAG
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
3 – Arithm´tique IEEE : modules intrins`ques 82
e e e
Pour un processeur donn´, une partie de ces fonctionnalit´s peuvent ˆtre naturelles et
seront donc mises en œuvre en l’absence du module IEEE FEATURES. Pour ce processeur,
e
le fait de coder l’instruction use IEEE_FEATURES dans une unit´ de programme aura
e u
pour effet de solliciter d’autres fonctionnalit´s au prix d’un surcoˆt.
e a
Le programmeur peut demander l’acc`s, ` l’aide de la clause ONLY de l’intruction use
e e a e e e
pr´c´dente, ` une fonctionnalit´ particuli`re laquelle peut ˆtre :
naturelle,
g´n´ratrice d’un surcoˆt,
e e u
non disponible, un message d’erreur sera alors ´mis par le compilateur.
e
Exemple :
USE, INTRINSIC :: IEEE_FEATURES, ONLY: IEEE_DIVIDE
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : documentations 83
3.10 – Documentations
http://www.dkuug.dk/jtc1/sc22/open/n3661.pdf ==>
Exceptions and IEEE arithmetic
http://www-1.ibm.com/support/docview.wss?uid=swg27003923&aid=1 ==>
Chapter 16. Floating-point Control and Inquiry Procedures
http://cch.loria.fr/documentation/IEEE754/ACM/goldberg.pdf
e ea
Note : fonctionnalit´s faisant d´j` partie des extensions du compilateur Fortran d’IBM
depuis la version 9.1.0.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
3 – Arithm´tique IEEE : documentations 84
Notes personnelles...
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 85
e
4 – Nouveaut´s concernant les tableaux dynamiques
En Fortran 95, du fait des insuffisances notoires des tableaux dynamiques (attribut
e
ALLOCATABLE), on leur substituait souvent les pointeurs plus puissants, mais pr´sentant
e
des inconv´nients en terme de performance.
e ee
En Fortran 2003, les tableaux allouables sont d´sormais g´r´s par un descripteur
a e
interne analogue ` celui d’un pointeur. Ce descripteur peut ˆtre vu comme un type
e e e
d´riv´ semi-priv´ contenant, entre autres, l’adresse d’une zone dynamique anonyme.
Il est donc normal qu’un tableau dynamique ait maintenant les avantages du pointeur
a e e
vis-`-vis du passage en param`tre de proc´dure et des composantes dynamiques de
e e e e
structures de donn´es ainsi que de nouvelles possibilit´s abord´es ci-apr`s.
e e
On r´servera alors l’usage des pointeurs aux fonctionnalit´s qui leur sont propres :
e e ın´
notion d’alias dynamique d’entit´s ´ventuellement complexes, gestion de listes chaˆ ees,
e e e
pointeurs de proc´dures dans les types d´riv´s, ...
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 86
e
4.1 – Passage en argument de proc´dure
e e
En Fortran 95, un tableau allouable ne pouvait ˆtre pass´ en argument d’appel que
e ea e e e e ee
s’il ´tait d´j` allou´. Au sein de la proc´dure appel´e, il ´tait consid´r´ comme un
a
simple tableau ` profil implicite (sans l’attribut ALLOCATABLE).
En Fortran 2003 et en contexte d’interface explicite, un argument muet pouvant avoir
l’attribut ALLOCATABLE, l’argument d’appel correspondant devra aussi avoir cet attribut
e e e e ea e
ainsi que le mˆme rang et le mˆme type/sous-type, sans ˆtre n´cessairement d´j` allou´.
Voici un exemple :
program alloca
real,dimension(:), ALLOCATABLE :: tab
call sp(tab)
CONTAINS
subroutine sp(t)
real,dimension(:), ALLOCATABLE , intent(inout) :: t
ALLOCATE (t(256))
call random_number(t)
end subroutine sp
end program alloca
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 87
Remarques :
Si un argument muet a la vocation INTENT(OUT), l’argument d’appel correspondant
e ea e e e
est automatiquement d´sallou´ ` l’appel de la proc´dure (s’il ´tait allou´).
Comme c’´tait d´j` le cas pour les pointeurs de tableaux en Fortran 95, les bornes
e ea
e e e
inf´rieures/sup´rieures des dimensions d’un tableau allouable pass´ en argument
e e e e u ee e
sont r´cup´rables dans l’unit´ appel´e dans le cas o` celui-ci a ´t´ pr´alablement
e e
allou´ dans l’unit´ appelante.
Quand un objet de type d´riv´ est d´sallou´, toute composante ayant l’attribut
e e e e
e e
ALLOCATABLE est automatiquement d´sallou´e. Si un destructeur (final subroutine –
ea e e
cf. §8.5) est attach´ ` l’objet, il est appliqu´ avant la d´sallocation de cette
composante.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 88
e e
4.2 – Composante allouable d’un type d´riv´
e
L’attribut ALLOCATABLE est autoris´ pour une composante. Voici un exemple :
type obj_mat
integer :: N, M
real,dimension(:,:), ALLOCATABLE :: A
end type obj_mat
. . .
type(obj_mat) :: MAT1
. . .
read *, MAT1%N, MAT1%M
allocate(MAT1%A(MAT1%N, MAT1%M))
. . .
e
C’est bien entendu le descripteur du tableau allouable qui sera stock´ dans la
composante A de MAT1.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 89
4.3 – Allocation d’un scalaire ALLOCATABLE
e a
L’attribut ALLOCATABLE peut dor´navant s’appliquer ` un scalaire. Voici un exemple :
character(len=:), allocatable :: ch
integer :: unit, taille
. . .
read( UNIT=unit ) taille
allocate( character(len=taille) :: ch )
read( UNIT=unit ) ch
. . .
ıne e e a e
Dans cet exemple, la taille de la chaˆ de caract`res ch est d´finie ` l’ex´cution et
fournie ensuite au niveau de l’instruction ALLOCATE en explicitant le type.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 90
e
4.4 – Allocation/r´allocation via l’affectation
e e
Une allocation/r´allocation d’une entit´ var alloc (scalaire ou tableau ayant l’attribut
e
ALLOCATABLE) peut se faire implicitement lors d’une op´ration d’affectation du type :
var alloc = expression
ea e e e e
1. Si var alloc est d´j` allou´e, elle est automatiquement d´sallou´e si des diff´rences
concernant le profil ou la valeur des length type parameters – (cf. §8.2) existent
entre var alloc et expression.
e e e e
2. Si var alloc est ou devient d´sallou´e, alors elle est r´allou´e selon le profil et les
e
param`tres de type de expression. Voici un exemple permettant le traitement d’une
ıne e
chaˆ de caract`res de longueur variable :
character(:), ALLOCATABLE :: NAME !<-- Scalaire character(len=:)
. . . .
NAME = ’chaine_de_car’//’acteres’; . . . .; NAME = ’FIN’
e e
La variable scalaire NAME de type CHARACTER sera allou´e lors de la premi`re affectation
avec une longueur LEN=20. Lors de la 2e affectation, elle sera d´sallou´e puis r´allou´e
e e e e
avec une longueur LEN=3.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 91
` e e ınes
A noter que cette possibilit´ de r´allocation dynamique facilite la gestion des chaˆ
dynamiques ainsi que le respect de la contrainte de conformance lors d’une affectation
de tableaux. Ainsi par exemple :
real, ALLOCATABLE, dimension(:) :: x
. . . .
!--allocate(x(count(masque))) <--- Devient inutile !
. . . .
x = pack(tableau, masque)
e e e e
Le tableau x est automatiquement allou´/r´allou´ avec le bon profil sans se pr´occuper
ee
du nombre d’´l´ments vrais de masque.
e e e
Note : ce processus d’allocation/r´allocation automatique peut ˆtre inhib´ en codant
par exemple :
NAME( : ) = ’chaine_de_car’//’acteres’
x(1 : count(masque)) = pack(tableau, masque)
`
A gauche de l’affectation, la pr´sence du : signifie qu’on fait r´f´rence ` un
e ee a
e e ea e
sous-ensemble d’une entit´ (NAME ou x) qui doit exister et donc ˆtre d´j` allou´e.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 92
e
4.5 – Sous-programme MOVE ALLOC de r´allocation
MOVE ALLOC(FROM, TO) e a e e
r´alloue ` TO l’objet allou´ pass´ via FROM.
e
- FROM entit´ allouable de n’importe quel type/rang. Sa vocation est INTENT(INOUT),
e
- TO entit´ allouable compatible (type et rang) avec FROM. Sa vocation est INTENT(OUT).
e
En retour de ce sous-programme, le tableau allouable TO d´signe le tableau allouable
e e e e e e
FROM ; la zone m´moire pr´alablement d´sign´e par TO est d´sallou´e.
e e
En fait, c’est une m´thode permettant de nettoyer le descripteur de FROM apr`s l’avoir
e
recopi´ dans celui de TO.
e e e
– Si FROM n’est pas allou´ en entr´e, TO devient non allou´ en sortie.
ea ea
– Si TO a l’attribut TARGET, tout pointeur initialement associ´ ` FROM devient associ´ `
TO.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 93
real, ALLOCATABLE, dimension(:) :: grid, tempgrid
. . . .
ALLOCATE(grid(-N:N)) !<-- Allocation initiale de grid
. . . .
ALLOCATE(tempgrid(-2*N:2*N)) !<-- Allocation d’une grille plus grande
!
tempgrid(::2) = grid !<-- Redistribution des valeurs de grid
!
call MOVE_ALLOC(TO=grid, FROM=tempgrid)
TO
1
x
−N +N
grid
4
FROM
x 2
−2N +2N
tempgrid 3
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
4 – Tableaux dynamiques 94
e e
Exemple pr´c´dent en Fortran 95
real, ALLOCATABLE, dimension(:) :: grid, tempgrid
. . . .
ALLOCATE(grid(-N:N)) !<-- Allocation initiale de grid
. . . .
ALLOCATE(tempgrid(-2*N:2*N)) !<-- Allocation d’une grille plus grande
!
tempgrid(::2) = grid !<-- Redistribution des valeurs de grid
!
DEALLOCATE( grid(:) )
ALLOCATE( grid(-2*N:2*N) )
grid(:) = tempgrid(:)
DEALLOCATE( tempgrid(:) )
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
5 – Modules 95
e
5 – Nouveaut´s concernant les modules
5.1 – L’attribut PROTECTED
e e e
De mˆme que la vocation INTENT(in) prot`ge les arguments muets d’une proc´dure,
e e e e
l’attribut PROTECTED prot`ge les entit´s d´clar´es avec cet attribut dans un module ;
u
elles sont exportables (use association) mais pas modifiables en dehors du module o`
e
est faite la d´claration.
real(kind=my_prec), PROTECTED , dimension(10,4) :: tab
cet attribut n’est sp´cifiable que dans le module o` est faite la d´claration, pas dans
e u e
ceux qui l’importent (USE) ;
les sous-objets ´ventuels d’un objet prot´g´ re¸oivent l’attribut PROTECTED ;
e e e c
pour un pointeur, c’est l’association et non la cible qui est prot´g´e.
e e
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
5 – Modules 96
5.2 – L’instruction IMPORT du bloc interface
e e e
En Fortran 95, un bloc interface ne pouvait acc´der aux entit´s (d´finition de type
e e e o e
d´riv´ par ex.) de l’unit´ hˆte (module ou unit´ de programme). L’instruction IMPORT
permet l’importation (host association) de ces entit´s dans un bloc interface :
e
module truc
type couleur
character(len=16) :: nom
real, dimension(3) :: compos
end type couleur
interface
function demi_teinte(col_in)
IMPORT :: couleur
type(couleur), intent(in) :: col_in
type(couleur) :: demi_teinte
end function demi_teinte
end interface
contains
e
. . . !---> Partie proc´durale du module
end module truc
e
IMPORT sans liste permet l’importation de toutes les entit´s vues par host association.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
5 – Modules 97
e
5.3 – USE et renommage d’op´rateurs
e e e e
Les op´rateurs non intrins`ques d’un module peuvent ˆtre renomm´s au moment de
leur importation via l’instruction USE. Voici un exemple :
USE my_module OPERATOR(.MY_OPER.) => OPERATOR(.OPER.)
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
5 – Modules 98
Notes personnelles...
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 99
e
6 – Entr´es-sorties
e
6.1 – Nouveaux param`tres des instructions OPEN/READ/WRITE
e ıne e
IOMSG : ce param`tre des instructions READ/WRITE identifie une chaˆ de caract`res
e e
r´cup´rant un message si une erreur, une fin de fichier ou une fin d’enregistrement
a e
intervient ` l’issue de l’entr´e-sortie.
e e e oea
ROUND : lors d’une entr´e-sortie format´e le mode d’arrondi peut ˆtre contrˆl´ ` l’aide
e
du param`tre ROUND de instruction OPEN qui peut prendre comme valeurs : "up",
"down", "zero", "nearest", "compatible" ou "processor defined". Cette valeur
e e a
peut ˆtre chang´e au niveau des instructions READ/WRITE ` l’aide du mˆmee
e e
param`tre ou via les sp´cifications de format ru, rd, rz, rn, rc et rp. La valeur par
e e e
d´faut d´pend du processeur utilis´.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 100
e ee ea
SIGN : ce param`tre a ´t´ ajout´ ` l’instruction OPEN pour la gestion du signe + des
e e
donn´es num´riques en sortie. Il peut prendre les valeurs : "suppress", "plus" ou
e e
"processor defined". Cette valeur peut ˆtre chang´e au moment de l’instruction
a e e a e
WRITE ` l’aide du mˆme param`tre, ou bien ` l’aide des sp´cifications de format ss,
e
sp et s. La valeur par d´faut est "processor defined".
IOSTAT : deux nouvelles fonctions ´l´mentaires is iostat end et is iostat eor
ee
ee e e
permettent de tester la valeur de l’entier r´f´renc´ au niveau du param`tre IOSTAT
de l’instruction READ. Elles retournent la valeur vraie si une fin de fichier ou une fin
ee e e
d’enregistrement a ´t´ d´tect´e.
e e ee
Remarque : les param`tres comme IOSTAT peuvent dor´navant r´f´rencer tout
type d’entier.
INTEGER(kind=2) :: unit, iostat
READ( UNIT=unit, ..., IOSTAT=iostat ) ...
IF( is_iostat_end( iostat ) ) then
. . .
END IF
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 101
e
6.2 – Entr´es-sorties asynchrones
e e
Les entr´es-sorties peuvent ˆtre faites en mode asynchrone, permettant ainsi au
e e
programme de continuer son ex´cution pendant que l’entr´e-sortie est en cours.
Ce mode de fonctionnement n’est possible que pour les fichiers externes ouverts avec le
e e e e
param`tre ASYNCHRONOUS=’yes’. Ce mˆme param`tre sera fourni ´galement au niveau
e e e
de l’instruction READ/WRITE si l’on d´sire lancer une telle entr´e-sortie, sinon, par d´faut
e e
ou en pr´cisant le param`tre ASYNCHRONOUS=’no’, elle sera synchrone quel que soit le
mode d’ouverture effectu´.e
e e a
Une synchronisation peut ˆtre demand´e explicitement ` l’aide de l’instruction
a
WAIT(unit=..., ...). Celle-ci est implicite ` la rencontre d’un INQUIRE ou d’un CLOSE
sur le fichier.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 102
e e e e
Toute entit´ faisant l’objet d’entr´es-sorties asynchrones r´cup`re automatiquement un
nouvel attribut ASYNCHRONOUS dans le but d’avertir le compilateur du risque encouru `a
optimiser des portions de code les manipulant.
e e e
En effet, le r´sultat de cette optimisation pourrait ˆtre un d´placement d’instructions
ee c e
r´f´ren¸ant ces entit´s avant une instruction de synchronisation.
e e
On peut pr´ciser explicitement cet attribut lors de la d´claration :
INTEGER, ASYNCHRONOUS , DIMENSION(10,40) :: TAB
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 103
e
6.3 – Entr´es-sorties en mode stream
e e
Le param`tre ACCESS de l’instruction OPEN admet une troisi`me valeur STREAM
e
permettant d’effectuer des entr´es-sorties en s’affranchissant de la notion
ee e e
d’enregistrement : le fichier est consid´r´ comme ´tant une suite d’octets. L’entr´e-sortie
a a e
est faite soit relativement ` la position courante, soit ` une position donn´e.
e e
Le fichier peut ˆtre format´ ou non.
e e
La position courante est mesur´e en octets en partant de 1. Le param`tre POS de
ıtre.
l’instruction INQUIRE permet de la connaˆ
e e
Le param`tre POS (expression enti`re) des instructions READ/WRITE permet d’indiquer la
a e
position dans le fichier ` partir de laquelle s’effectuera l’entr´e-sortie.
e e e
Cette nouvelle m´thode d’acc`s facilite notamment l’´change de fichiers binaires entre
Fortran et C.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 104
double precision :: d
integer :: rang
. . .
open( UNIT=1, ... , ACCESS="STREAM" , form="unformatted" )
. . .
inquire( UNIT=1, POS=rang ) ! sauvegarde de la position courante.
write( UNIT=1 ) d a
! par rapport ` la position courante.
. . .
a
write( UNIT=1, POS=rang ) d+1 ! par rapport ` la position contenue dans rang.
e
Puisqu’il n’existe pas de notion d’enregistrement logique, il est n´cessaire, pour les
e
fichiers texte, de traiter explicitement le caract`re newline que renvoie la fonction
e
intrins`que new line.
character(len=100) :: chaine
. . .
chaine = "Wolfgang Amadeus Mozart" // &
new_line(’a’) // &
"est un musicien divin."
open( UNIT=1, ... , ACCESS="STREAM" , form="formatted" )
write( UNIT=1, FMT="(a)" ) trim(chaine)
close( UNIT=1 )
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 105
e e e
6.4 – Traitement personnalis´ des objets de type d´riv´
a o e
Au-del` du traitement standard, il devient possible de contrˆler les op´rations
e e e e
d’entr´e-sortie portant sur un objet de type d´riv´ (public ou semi-priv´) via une ou
e
plusieurs proc´dures de type SUBROUTINE.
e e e
Il existe 4 cat´gories de proc´dures (lecture/´criture et avec/sans format) qui peuvent
e e c e e e e
ˆtre attach´es de fa¸on g´n´rique (generic bindings) au type d´riv´ de l’objet via des
instructions du type :
GENERIC :: READ(FORMATTED) => lecture_format1, lecture_format2
GENERIC :: READ(UNFORMATTED) => lecture_nonformat1, lecture_nonformat2
GENERIC :: WRITE(FORMATTED) => ecriture_format1, ecriture_format2
GENERIC :: WRITE(UNFORMATTED) => ecriture_nonformat1, ecriture_nonformat2
ee e
ins´r´es au sein de la d´finition du type comme nous le verrons dans les exemples plus
loin.
` e e e a
A droite des fl`ches, on trouve le nom des proc´dures qui seront discrimin´es ` la
e e e
compilation en fonction du type d´riv´ de l’objet trait´ et de la valeur effective des
e e a e
sous-types (param`tre KIND) de ses composantes (param´trables ` la d´claration).
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 106
a e e e e e
Une alternative ` l’attachement g´n´rique pr´c´dent est d’ins´rer un bloc interface au
e
niveau de la d´finition du type :
INTERFACE READ(FORMATTED)
MODULE PROCEDURE lecture_format1, lecture_format2
END INTERFACE
e
Concernant les entr´es-sorties avec format, un nouveau descripteur de format DT a ´t´ ee
e a e e e
d´fini. Il s’applique ` un objet de type d´riv´ de la liste d’entr´e-sortie et a pour forme :
ı e
DT [’cha^ne de caract`res’] [(liste d’entiers)]
ıne e e
La chaˆ de caract`res et le tableau d’entiers facultativement indiqu´s avec ce
e e
descripteur sont automatiquement transmis en argument d’entr´e de la proc´dure
e a e
appel´e. Ils sont ` la libre disposition du programmeur pour param´trer le traitement.
e
Note : toutes ces notions sont rep´rables dans la documentation anglaise sous les
e
mots-cl´s dtio-generic-spec et dtv-type-spec.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 107
e
Ce type de proc´dures doit respecter le prototype suivant :
SUBROUTINE lecture_format ( dtv , unit , iotype , v_list , iostat , iomsg )
SUBROUTINE ecrit_nonformat ( dtv , unit , iostat , iomsg )
e e a
dtv : objet de type d´riv´ qui est ` l’origine de l’appel (discriminant en cas
e e e
d’attachement g´n´rique de plusieurs proc´dures),
e e ee e
unit : num´ro de l’unit´ logique sur laquelle a ´t´ connect´ le fichier (0 pour un fichier
interne),
ıne e e
iotype : chaˆ de caract`res indiqu´e au niveau du descripteur de format DT,
e
v list : tableau d’entiers indiqu´ au niveau du descripteur de format DT,
e e e
iostat : refl`te en retour l’´tat de l’entr´e-sortie,
iomsg : contient en retour le texte d’un message d’erreur si iostat est non nul.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 108
e
Voici un exemple avec des enregistrements format´s :
PROGRAM exemple
USE couleur_mod
IMPLICIT NONE
TYPE(couleur) :: c1, c2
REAL :: x, y
INTEGER :: i, ios
CHARACTER(len=132) :: message
NAMELIST/liste/ x, y, c1
...
WRITE( UNIT=1, FMT="(I2, DT ’COMPLET’(6) , 2F6.2 )", &
IOSTAT=ios, IOMSG=message ) i, c1, x, y
PRINT *, ios, message
WRITE( UNIT=1, FMT="(F7.3, DT(7) , DT ’COMPLET’(5) )", &
IOSTAT=ios, IOMSG=message ) x, c1, c2
PRINT *, ios, message
WRITE( UNIT=1, FMT=*, IOSTAT=ios, IOMSG=message ) x, c1, i, y
PRINT *, ios, message
WRITE( UNIT=1, NML=liste )
PRINT *, ios, message
END PROGRAM exemple
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 109
MODULE couleur_mod
TYPE couleur
CHARACTER(len=16) :: nom; REAL, DIMENSION(3) :: compos
CONTAINS
GENERIC :: WRITE(FORMATTED) => ecr_format ! <=== Generic binding.
END TYPE couleur
CONTAINS
SUBROUTINE ecr_format( dtv, unit, iotype, v_list, iostat, iomsg )
TYPE(couleur), INTENT(in) :: dtv
INTEGER, INTENT(in) :: unit
CHARACTER(len=*), INTENT(in) :: iotype
INTEGER, DIMENSION(:), INTENT(in) :: v_list
INTEGER, INTENT(out) :: iostat
CHARACTER(len=*), INTENT(inout) :: iomsg
CHARACTER(len=10), DIMENSION(2) :: fmt
NAMELIST/liste/ dtv%nom, dtv%compos
write( fmt(1), ’(a, i2, a)’ ) "(a,3f", v_list(1), ".2)"
write( fmt(2), ’(a, i2, a)’ ) "(3f", v_list(1), ".2)"
SELECT CASE( iotype )
CASE (’ NAMELIST ’) ; WRITE( UNIT=unit, NML=liste, IOSTAT=iostat, IOMSG=iomsg )
CASE (’ LISTDIRECTED ’); WRITE( UNIT=unit, FMT=* ) dtv%nom, dtv%compos
CASE (’ DTCOMPLET ’) ; WRITE( UNIT=unit, FMT=fmt(1) ) dtv%nom, dtv%compos
DEFAULT ; WRITE( UNIT=unit, FMT=fmt(2) ) dtv%compos
END SELECT
END SUBROUTINE ecr_format
END MODULE couleur_mod
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 110
Exemple de traitement d’un fichier binaire
PROGRAM exemple
USE couleur_mod
IMPLICIT NONE
TYPE(couleur) :: c
REAL :: x, y
INTEGER :: i, ios
CHARACTER(len=132) :: message
...
READ( UNIT=1, IOSTAT=ios, IOMSG=message ) i, c, x, y
DO WHILE ( ios == 0 )
...
READ( UNIT=1, IOSTAT=ios, IOMSG=message ) i, c, x, y
END DO
IF ( ios > 0 ) THEN
PRINT *, message
STOP 4
END IF
END PROGRAM exemple
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 111
MODULE couleur_mod
TYPE couleur
CHARACTER(len=16) :: nom
REAL, DIMENSION(3) :: compos
CONTAINS
GENERIC :: READ(UNFORMATTED) => lec_binaire ! <=== Generic binding.
END TYPE couleur
CONTAINS
SUBROUTINE lec_binaire( dtv, unit, iostat, iomsg )
TYPE(couleur), INTENT(in) :: dtv
INTEGER, INTENT(in) :: unit
INTEGER, INTENT(out) :: iostat
CHARACTER(len=*), INTENT(inout) :: iomsg
READ( UNIT=unit, IOSTAT=iostat, IOMSG=iomsg ) dtv%nom, dtv%compos
END SUBROUTINE lec_binaire
END MODULE couleur_mod
e e e
Remarque : cette nouveaut´ permet de b´n´ficier du concept d’abstraction des
e
donn´es.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 112
e
Exemple de traitement r´cursif
MODULE list_module
TYPE node
integer :: value = 0
type(node), pointer :: next_node => null()
CONTAINS
GENERIC :: WRITE(FORMATTED) => pwf ! <=== Generic binding.
END TYPE node
CONTAINS
RECURSIVE SUBROUTINE pwf( dtv, unit, iotype, v_list, iostat, iomsg )
TYPE(node), INTENT(in) :: dtv
INTEGER, INTENT(in) :: unit
CHARACTER(len=*), INTENT(in) :: iotype
INTEGER, DIMENSION(:), INTENT(in) :: v_list
INTEGER, INTENT(out) :: iostat
CHARACTER(len=*), INTENT(inout) :: iomsg
WRITE( UNIT=unit, FMT=’(I9,/)’, IOSTAT=iostat ) dtv%value
if ( iostat /= 0 ) return
if ( ASSOCIATED( dtv%next_node ) ) &
WRITE( UNIT=unit, FMT=’(dt)’, IOSTAT=iostat ) dtv%next_node
END SUBROUTINE pwf
END MODULE list_module
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 113
c
Ce module pourra s’employer de la fa¸on suivante :
PROGRAM liste
USE liste_module
INTEGER :: unit, iostat
TYPE(node) :: racine
. . .
e ı e
! Cr´ation d’une liste cha^n´e avec racine comme noeud primaire.
. . .
! Impression de la liste.
WRITE( UNIT=unit, FMT=’(dt)’, IOSTAT=iostat ) racine
END PROGRAM liste
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
6 – Entr´es-sorties 114
Notes personnelles...
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 115
7 – Pointeurs
7.1 – Vocation (INTENT) des arguments muets pointeurs
a e
Contrairement ` Fortran 95, il est possible de d´finir la vocation (attribut INTENT) des
e
arguments muets pointeurs au sein d’une proc´dure. C’est l’association qui est
e
concern´e et non la cible.
INTENT(IN) : le pointeur ne pourra ni ˆtre associ´, ni mis ` l’´tat nul, ni allou´ ;
e e a e e
INTENT(OUT) : le pointeur est forc´ ` l’´tat ind´fini ` l’entr´e de la proc´dure ;
ea e e a e e
INTENT(INOUT) : le pointeur peut ` la fois transmettre une association pr´´tablie et
a ee
retourner une nouvelle association.
subroutine sp(p1, p2, ...)
real, dimension(:,:), pointer, INTENT(IN) :: p1
real, dimension(:,:), pointer, INTENT(OUT) :: p2
. . . .
e
Note : fonctionnalit´ faisant partie des extensions du compilateur Fortran d’IBM
depuis la version 95.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 116
7.2 – Association et reprofilage
e e e e
Lors de l’association, il est possible de pr´ciser le profil d´sir´ avec ´ventuellement
modification du rang.
Dans l’exemple suivant, on suppose que le tableau de rang 1 champ vecteurs contient
e e a
les coordonn´es d’une s´rie de vecteurs dans un espace ` 3 dimensions :
Exemple
subroutine sp( champ_vecteurs, n )
real, dimension(:), target :: champ_vecteurs
integer :: n, nb_vecteurs
real, dimension(:,:), pointer :: matrice
nb_vecteurs = size(champ_vecteurs)/3
matrice(1:3,1:nb_vecteurs) => champ_vecteurs
. . .
end subroutine sp
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 117
e
Voici un autre exemple permettant l’extraction de la diagonale d’une matrice suppos´e
e
carr´e.
Exemple
subroutine sp( matrice )
integer :: n
real, dimension(:,:), target :: matrice
real, dimension(:), pointer :: vec
real, dimension(:), pointer :: diagonale
n = size(matrice,1)
vec(1:n*n) => matrice
diagonale => vec(1:n*n:n+1)
end subroutine sp
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 118
e
7.3 – Pointeurs de proc´dures
e e a e
Les pointeurs peuvent ˆtre associ´s ` des cibles de type proc´dure. On parlera alors de
e
pointeurs de proc´dures, assimilables aux pointeurs de fonctions en langage C.
Voici quelques aspects concernant ces pointeurs :
l’interface peut ˆtre implicite ou explicite (cf. ci-apr`s),
e e
une fonction peut retourner un pointeur de proc´dure,
e
au moment de l’association p => proc d’un pointeur de proc´dure p ` l’aide de
e a
e e
l’op´rateur classique =>, le compilateur v´rifie (si l’interface est explicite) la
e e
compatibilit´ des interfaces proc´durales comme pour l’appel classique d’une
e e e
proc´dure. L’op´rande de droite peut ˆtre au choix :
e
– une proc´dure,
e
– un pointeur de proc´dure,
e
– une fonction retournant un pointeur de proc´dure.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 119
e
7.3.1 – Pointeurs de proc´dure : interface implicite
e e
Voici trois possibilit´s de les d´clarer en mode d’interface implicite :
Premi`re possibilit´ (pour une fonction seulement) avec l’attribut POINTER :
e e
REAL, EXTERNAL, POINTER :: p
REAL, EXTERNAL :: f, g
. . .
p => f
print *, p(..., ..., ...)
. . .
p => g
print *, p(..., ..., ...)
Deuxi`me possibilit´ avec les attributs PROCEDURE() et POINTER ; dans l’exemple, p
e e
a e e e e
est un pointeur en mode d’interface implicite, ` l’´tat ind´termin´, pouvant ˆtre
ea
associ´ ` une fonction ou un sous-programme :
PROCEDURE() , POINTER :: p
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 120
Troisi`me possibilit´ (pour une fonction seulement) avec l’attribut PROCEDURE
e e
ee c
r´f´ren¸ant un type pour expliciter partiellement un pointeur de fonction en le
e
d´clarant par exemple sous la forme :
PROCEDURE(TYPE(obj_mat(k=8, dim=256, d=128))) , POINTER :: p
e e a
p ne pourra alors ˆtre associ´ qu’` une fonction retournant un objet de type
e e e e e e
obj mat param´tr´ comme indiqu´ (cf. §8.2 - Param`tres d’un type d´riv´).
e o e
Bien entendu, comme pour les appels de proc´dures, il est plutˆt conseill´ d’utiliser le
o e
mode d’interface explicite afin que le compilateur puisse contrˆler la coh´rence des
e e a
associations de pointeurs de proc´dures... La fiabilit´ est ` ce prix !
e e
Voyons quelles sont les possibilit´s de les d´clarer en mode d’interface explicite.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 121
e
7.3.2 – Pointeurs de proc´dure : interface explicite
Attribut POINTER appliqu´ ` une d´claration de proc´dure effectu´e ` l’aide d’un
ea e e e a
bloc interface :
module m
POINTER :: sp
interface
subroutine sp( a, b )
real, intent(inout) :: a
real, intent(in) :: b
end subroutine sp
end interface
contains
subroutine trace( u, v )
real, intent(inout) :: u
real, intent(in) :: v
. . .
end subroutine trace
end module m
program prog
use m
sp => trace
call sp( ... )
end program prog
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 122
Attribut PROCEDURE faisant r´f´rence ` une proc´dure mod`le existante. Voici par
ee a e e
e a e e
exemple la d´claration de p initialement ` l’´tat nul avec la mˆme interface que celle
du sous-programme proc (obligatoirement en mode d’interface explicite) :
module m
contains
subroutine proc( a, b )
real, dimension(:), intent(in) :: a
real, dimension(:), intent(out) :: b
. . .
end subroutine proc
end module m
program prog
use m
PROCEDURE(proc) , POINTER :: p => NULL()
. . .
end program prog
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 123
` e
A d´faut d’une proc´dure pouvant servir de mod`le pour expliciter l’interface, il est
e e
e
aussi possible de d´finir un bloc interface virtuel (abstract interface) comme
celui-ci :
ABSTRACT INTERFACE
SUBROUTINE sub( x, y )
REAL, intent(out) :: x
REAL, intent(in) :: y
END SUBROUTINE sub
END INTERFACE
e e
Ce bloc interface virtuel peut ˆtre utilis´ (via l’attribut PROCEDURE) au moment de
e e e
la d´claration d’un pointeur de proc´dure comme p1 ou mˆme d’une proc´dure e
externe comme proc dans l’exemple ci-dessous :
PROCEDURE(sub) , POINTER :: p1=>NULL()
PROCEDURE(sub) :: proc
REAL :: var
p1 => proc
. . .
CALL p1( x=var, y=3.14 )
PRINT *, ASSOCIATED( p1, proc )
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
7 – Pointeurs 124
Notes personnelles...
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 125
e e e
8 – Nouveaut´s concernant les types d´riv´s
e
8.1 – Composante pointeur de proc´dure
e ıtre e e
Un pointeur de proc´dure peut apparaˆ en tant que composante d’un type d´riv´.
e a
L’association puis l’appel de la proc´dure cible s’effectue ` partir d’un objet du type
e e e
d´riv´ au moyen du symbole % comme pour l’acc`s aux composantes habituelles.
e a
Par d´faut, l’objet qui est ` l’origine de l’appel est transmis implicitement comme
a e
premier argument ` la proc´dure cible (passed-object dummy argument). L’attribut
e e e
NOPASS, indiqu´ lors de la d´claration de la composante, empˆche cette transmission
e
implicite : dans ce cas, si on d´sire transmettre l’objet, on le fera explicitement.
e e e
L’attribut PASS peut ˆtre indiqu´ soit pour confirmer le mode par d´faut soit pour
transmettre implicitement l’objet vers un autre argument que le premier.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 126
module m
TYPE mytype
private
real :: x
integer :: i
PROCEDURE(proc) , public, POINTER, PASS :: p
END TYPE mytype
abstract interface
subroutine proc( this, r, i )
type(mytype), intent(inout) :: this
real, intent(in) :: r
integer, intent(in) :: i
end subroutine proc
end interface
end module m
program prog
use m
TYPE(mytype) :: a
a%p => p1
call a%p( 3.14, e a
100 ) ! ´quivalent ` "call p1( a, 3.14, 100 )"
end program prog
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 127
e e e
8.2 – Param`tres d’un type d´riv´
e e ea e
En Fortran 95, les types intrins`ques ´taient d´j` param´trables ; en particulier le type
e a e e
CHARACTER(LEN= , KIND= ) avait deux param`tres ` valeur enti`re pour sp´cifier le
e
nombre de caract`res et le sous-type.
e e e e
Nuance importante, le premier n’est pas discriminant pour la g´n´ricit´ et pas doit ˆtre
a e e e
connu ` la compilation, tandis que le deuxi`me l’est ; Fortran 2003 g´n´ralise cette
e e e e e e
distinction aux param`tres des types d´riv´s qui pourront ˆtre d´clar´s avec l’attribut
LEN ou KIND.
e e e e
Les param`tres LEN/KIND peuvent ˆtre utilis´s pour d´finir la longueur de chaˆ ınes ou les
e
bornes de tableaux, mais seuls ceux ayant l’attribut KIND (dont la valeur doit ˆtre
a
connue ` la compilation) peuvent intervenir dans une expression d’initialisation ou la
valorisation d’un sous-type (kind-selector ).
e e e
Des valeurs par d´faut peuvent ˆtre d´finies.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 128
e e e
Voici un exemple de type d´riv´ param´trable :
type obj_mat( k , dim , d )
!----------------------------------------
integer, KIND :: k , dim
integer, LEN :: d
!----------------------------------------
integer :: nb_bits= k *8
real(kind= k ),dimension( d , d ) :: tab
real(kind= k ),dimension( dim ) :: vect
end type obj_mat
. . . .
type(obj_mat( k =8, dim =256, d =128)) :: mat
. . . .
e
Les param`tres (ici k, dim et d) sont obligatoirement de type entier avec un attribut
KIND/LEN.
e e e
Seuls ceux ayant l’attribut KIND sont discriminants au niveau de la g´n´ricit´ des
fonctions.
Ceux avec l’attribut LEN font partie des length type parameters par opposition aux kind
type parameters.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 129
8.3 – Constructeurs de structures
e e
Lors de la valorisation d’un type d´riv´ via un constructeur de structure, il est
e e
d´sormais possible d’affecter les composantes par mots cl´s :
type couleur
character*16 :: nom
real,dimension(3) :: compos
end type couleur
. . .
type(couleur) :: c
. . .
c=couleur( nom =’rose_saumon’, compos =[ 0.72, 0.33, 0.05 ] )
. . .
e
Notez aussi la nouvelle notation du constructeur de vecteur encadr´ par des crochets
e
(au lieu des caract`res (/ et /)).
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 130
e e e e
Une proc´dure g´n´rique peut avoir le mˆme nom qu’un constructeur de structure. Les
e e e e
constituants de la famille g´n´rique ont priorit´ sur le constructeur en cas d’ambiguit´.
e e
Cette technique peut ˆtre employ´e afin de surcharger un constructeur, comme le
montre l’exemple suivant :
type mycomplex
real :: rho, theta e
!<=== Coordonn´es polaires
end type mycomplex
interface mycomplex
type(mycomplex) function complex_to_mycomplex(c)
complex, intent(in) :: c e
!<=== Type intrins`que Fortran
end function complex_to_mycomplex
type(mycomplex) function two_reals_to_mycomplex(x, y)
real, intent(in) :: x !
real, intent(in), optional :: y e e
!<=== Coordonn´es cart´siennes
end function two_reals_to_mycomplex
end interface
. . .
type(mycomplex) :: a, b, c
complex :: w
. . .
a = mycomplex( theta=5.6, rho=1.0 ) e
! Appel constructeur intrins`que
b = mycomplex( w ) a
! Appel ` complex_to_mycomplex
c = mycomplex( x=0.0, y=1.0 ) a
! Appel ` two_reals_to_mycomplex
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 131
e ea e
Si une composante d’un type d´riv´ ` une valeur par d´faut, l’argument correspondant
au niveau du constructeur se comporte comme un argument optionnel.
Exemple
type real_liste
real :: valeur
type(real_liste), pointer :: next => null()
end type real_liste
. . .
type(real_liste) :: x = real_liste(3.14)
. . .
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 132
e e
Exemple d’un type param´tr´
type champ_vecteur(n,d,k)
integer, kind :: k = kind(1.0)
integer, len :: d = 2, n
real(kind=k), dimension(d,n) :: champ
end type champ_vecteur
. . .
type(champ_vecteur(k=selected_real_kind(9,99), n=100)) :: c
. . .
c = champ_vecteur(k=selected_real_kind(9,99), n=100)(champ=real(1., kind=c%k))
e e
NOTE : on remarque qu’il est possible d’adresser les composantes d’un type d´riv´ ayant
a e e e
l’attribut LEN ou KIND ` l’aide du symbole %. Ce proc´d´ s’applique ´galement aux
e
types intrins`ques :
subroutine sub( ch, len )
character(len=*), intent(inout) :: ch
integer, intent(in) :: len
real(selected_real_kind(9,99)), dimension(10) :: t
print *, len, ch%len, t%kind ! len(ch) ambigu ici, kind(t) possible.
end subroutine
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 133
a
Par analogie avec les tableaux ` taille implicite (assumed-size-array), lors d’une
e e e
d´claration, il est possible d’introduire le caract`re ∗ pour les param`tres ayant
e e
l’attribut LEN (assumed-type-parameter ). Cette forme peut ˆtre employ´e pour un
e
argument muet d’une proc´dure par exemple :
subroutine impression_champ( c )
type(champ_vecteur(k=selected_real_kind(9,99), d=*, n=*)) :: c
. . .
print *,c%d, c%n
end subroutine impression_champ
e e e e e
De mˆme, toujours pour ces param`tres, le caract`re : peut ˆtre utilis´
ıne e
(deffered-type-parameter ), comme pour la longueur d’une chaˆ de caract`res ou les
dimensions d’un tableau :
type(champ_vecteur(k=selected_real_kind(9,99), d=:, n=:)), pointer :: p
type(champ_vecteur(k=selected_real_kind(9,99), d=3, n=200)), target :: cible
. . .
p => cible
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 134
e
8.4 – Visibilit´ des composantes
e e e e e
En Fortran 95, un type d´riv´ pouvait seulement ˆtre public, priv´ ou semi-priv´ :
type struct_publique
integer :: i, j
real,dimension(160) :: tab
end type struct_publique
type, private :: struct_privee
integer :: i, j
real,dimension(160) :: tab
end type struct_privee
type struct_semi_privee
private
integer :: i, j
real,dimension(160) :: tab
end type struct_semi_privee
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 135
e
En Fortran 2003, la privatisation peut se g´rer plus finement au niveau de chaque
composante.
module m
type t
private
integer :: i
integer, public :: j
real :: k
end type t
. . .
end module m
program p
use m
type(t) obj
obj%i = ... e
! invalide : i est priv´ au module
obj%j = ... ! valide : j est publique
e
print *, obj%k ! invalide : k est priv´ au module
. . .
end program p
Remarque : les identificateurs i et k ne sont accessibles qu’au sein du module m.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 136
e e
8.5 – Extension d’un type d´riv´
e e ee c
Un type existant peut ˆtre enrichi. Pour cela, on d´finit un nouveau type en r´f´ren¸ant
e e
le type que l’on d´sire ´tendre au moyen de l’attribut EXTENDS.
type base_type
integer :: i
integer :: j
end type base_type
type, extends (base_type) :: my_type
real :: r
logical :: l
end type my_type
. . .
type(my_type) :: x
. . .
e
x%base_type%i = ... ! peut s’´crire : x%i = ...
x%r = ...
x%l = .false.
. . .
e ıt´
La notation x%base_type%i = ... pourrait s’av´rer utile pour lever une ambigu¨ e
e e
d’homonymie de nom de composantes apr`s h´ritage...
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 137
e e
Extension d’un type param´tr´
e e e e e
Lorsqu’un type param´tr´ est ´tendu, le nouveau type h´rite des param`tres du type
e e
qu’il compl`te et peut en d´finir de nouveaux.
type champ_vect(n,d,k)
integer, kind :: k = kind(1.0)
integer, len :: d = 2, n
! - - - - - - - - - - - - -
real(kind=k), dimension(d,n) :: champ = 0.
end type champ_vect
type, extends(champ_vect) :: champ_vect_label(ln)
integer, len :: ln
! - - - - - - - -
character(len=ln) :: label=""
end type champ_vect_label
. . .
type(champ_vect_label(k=kind(1.d0), d=3, n=100, ln=30)) :: c1
. . .
c1 = champ_vect_label(k=kind(1.d0), d=3, n=100, ln=30)( label="champ de vitesses" )
. . .
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e e
8 – Types d´riv´s 138
Notes personnelles...
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 139
e
9 – Programmation orient´e objet
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 140
9.1 – Variable polymorphique
e
C’est une variable dont le type peut varier au cours de l’ex´cution. Celle-ci doit avoir
e
l’attribut POINTER ou ALLOCATABLE ou bien ˆtre un argument muet d’une proc´dure. e
e e e a
Pour sa d´claration, on sp´cifie le mot-cl´ CLASS ` la place de TYPE.
type point
real :: x, y
end type point
CLASS (point), pointer :: p
e ea a
Dans cet exemple, le pointeur p pourra ˆtre associ´ ` un objet de type point et ` toutes
e
les extensions ´ventuelles de ce type.
e e e e
Le type indiqu´ au niveau du mot-cl´ CLASS doit forc´ment ˆtre un type d´riv´ e e
e e e
extensible, ce qui exclut les types intrins`ques et les types d´riv´s pour lesquels on a
e e
pr´cis´ l’attribut sequence ou bind.
ea e e
On appelle declared type le type indiqu´ ` la d´claration au moyen du mot-cl´ CLASS et
e a e
dynamic type le type r´el de l’objet ` l’ex´cution.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 141
9.1.1 – Argument muet polymorphique
e a
Son type dynamique est celui de l’argument r´el fourni ` l’appel. Cela permet
a e e e
d’appliquer ` tous les types ´tendus une proc´dure d´finie pour le type de base.
module m
type point2d
real x, y
end type point2d
type, extends( point2d ) :: point2d_coul
real, dimension(3) :: compos_rvb
end type point2d_coul
type, extents( point2d ) :: point3d
real z
end type point3d
type, extends( point3d ) :: point3d_coul
real, dimension(3) :: compos_rvb
end type point3d_coul
contains
function distance( p1, p2 ) ! Calcul de la distance entre les points p1 et p2
CLASS(point2d) p1, p2
real distance
. . .
end function distance
end module m
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 142
9.1.2 – Variable polymorphique : attribut POINTER, ALLOCATABLE
Pointeur polymorphique : variable polymorphique ayant l’attribut POINTER ; son type
e e
dynamique est celui de sa cible qui peut ˆtre d´finie lors d’une association ou d’une
allocation dynamique (ALLOCATE).
e
De mˆme, le type dynamique d’une variable polymorphique ayant l’attribut
ALLOCATABLE est celui fourni lors de son allocation.
TYPE(point2d), target :: p2d
TYPE(point3d), target :: p3d
CLASS(point2d), pointer :: ptr2d_1, ptr2d_2
CLASS(point3d), pointer :: ptr3d
CLASS(point2d), allocatable :: point
ptr2d_1 => p2d ! Le type dynamique de ptr2d_1 est TYPE(point2d)
ptr2d_2 => p3d ! Le type dynamique de ptr2d_2 est TYPE(point3d)
ptr3d => p3d ! Le type dynamique de ptr3d est TYPE(point3d)
ptr2d_2 => ptr2d_1 ! Le type dynamique de ptr2d_2 est celui de ptr2d_1
ptr3d => ptr2d_1 ! Interdit
ALLOCATE( ptr2d_1 ) ! Alloue un objet de type dynamique TYPE(point2d)
! et associe ptr2d_1 avec.
ALLOCATE( TYPE(point3d)::ptr2d_2 ) ! Alloue un objet de type dynamique TYPE(point3d)
! et associe ptr2d_2 avec.
ALLOCATE( TYPE(point3d_coul) :: point )
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 143
9.2 – Construction SELECT TYPE
e
Cette construction permet l’ex´cution de blocs d’instructions en fonction du type
dynamique d’un objet polymorphique.
subroutine sp( a, b )
use m
CLASS(point2d) :: a, b
. . .
select type (a)
type is (point2d_coul)
. . .
class is (point3d)
. . .
class is (point3d_coul)
. . .
class default
. . .
end select
end subroutine sp
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 144
e e
C’est le type dynamique de l’objet a qui est analys´. La s´lection du bloc d’instructions
` ex´cuter se fait d’apr`s les r`gles suivantes :
a e e e
s’il existe une instruction TYPE IS correspondant au type, le bloc qui suit est
e e
ex´cut´,
sinon, s’il existe une seule instruction CLASS IS r´pondant au type, le bloc qui suit
e
e e
est ex´cut´,
sinon, s’il existe plusieurs instructions CLASS IS correspondant au type, c’est le
ee c e e
bloc de l’instruction CLASS IS r´f´ren¸ant le type le plus riche qui est ex´cut´,
sinon, s’il existe une instruction CLASS DEFAULT, c’est son bloc qui est ex´cut´.
e e
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 145
e e
9.3 – Pointeurs g´n´riques
e e e
Il est possible de d´finir un pointeur g´n´rique ou unlimited polymorphic pointer en
e e a e
pr´cisant le caract`re ∗ ` la place du nom du type au niveau du mot-cl´ CLASS. Celui-ci
e ea
peut ensuite ˆtre associ´ ` tout type de cible.
function func( p, ... )
CLASS(*), intent(in), pointer :: p
. . .
select type( p )
type is( selected_int_kind(9) )
. . .
type is( real )
. . .
type is( double precision )
. . .
type is( character(len=*) )
. . .
class default
print *,"Type invalide."
end select
end function func
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 146
9.4 – Type effectif d’une variable polymorphique
e e
Deux nouvelles fonctions intrins`ques permettent de d´terminer le type d’une variable
e
polymorphique au moment de l’ex´cution :
SAME_TYPE_AS ( a, b )
e
Retourne vrai si a et b ont le mˆme type dynamique.
EXTENDS_TYPE_OF ( a, mold )
Retourne vrai si le type dynamique de a est une extension de celui de mold.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 147
Exemple
function distance( p1, p2 )
CLASS(point2d) p1, p2
real distance
! Calcul de la distance entre les points p1 et p2
if ( SAME_TYPE_AS ( p1, p2 ) then
SELECT TYPE ( p1 )
CLASS IS (point2d)
distance = sqrt( (p2%x-p1%x)**2 + (p2%y-p1%y)**2 )
CLASS IS (point3d)
distance = sqrt( (p2%x-p1%x)**2 + (p2%y-p1%y)**2 + (p2%z-p1%z)**2 )
CLASS DEFAULT
print *,"Erreur : type non reconnu"; distance = -1.
END SELECT
else
e e
print *,"Erreur : les objets p1 et p2 doivent ^tre de m^me type"
distance = -2.
endif
end function distance
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 148
e e a
9.5 – Proc´dures attach´es ` un type (type-bound procedures)
e e e
Souvent, en programmation orient´e objet, on d´sire appeler une proc´dure pour
e
effectuer un traitement dont la nature d´pend du type dynamique d’un objet
e e a
polymorphique. Ceci est mis en œuvre au moyen de proc´dures attach´es ` un type
e e e e e a
d´riv´ (type-bound procedures) qui r´cup`rent en entr´e l’objet ` l’origine de l’appel
e
d´fini comme argument muet polymorphique. Celles-ci peuvent faire l’objet d’une
surcharge lors d’extensions du type.
e
Dans d’autres langages comme C++ on les appelle des m´thodes ou services ; leur
a e
invocation est vue comme l’envoi d’un message ` un objet dont la nature peut ˆtre
e a e a
r´solue ` l’ex´cution (polymorphisme dynamique) ou ` la compilation
(polymorphisme statique).
e e e e
Ce type de proc´dure peut ´videmment s’employer pour un type d´riv´ simple non
e
´tendu.
e e
Elles doivent ˆtre d´finies en contexte d’interface explicite.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 149
e e
9.5.1 – Proc´dure attach´e par nom (name binding )
module truc
type T
e
. . . !--> D´claration des composantes
e e
. . . !--> du type d´riv´ T
contains
PROCEDURE :: proc => my_proc
end type T
contains
subroutine my_proc(b, x, y)
type(T), intent(inout) :: b !--> Passed-object dummy argument
real, intent(in) :: x, y
. . .
end subroutine my_proc
end module truc
type(T) :: obj
real :: x1, y1
. . .
call obj%proc(x1, y1) !--> call my_proc(obj, x1, x2)
. . .
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 150
e e e e
9.5.2 – Proc´dure attach´e par nom g´n´rique (generic binding )
module m
type matrix(k, n, m)
integer, kind :: k
integer, len :: n, m
real(kind=k), dimension(n,m) :: A
contains
GENERIC :: max => max_4, max_8
end type matrix
contains
real(kind=4) function max_4( this )
class(matrix(k=4, n=*, m=*), intent(int) :: this
max_4 = MAXVAL( array=this%A )
end function max_4
real(kind=8) function max_8( this )
class(matrix(k=8, n=*, m=*), intent(int) :: this
max_8 = MAXVAL( array=this%A )
end function max_8
end module m
program prog
type(matrix(k=4, n=10, m=20) :: obj1; type(matrix(k=8, n=20, m=50) :: obj2
real(kind=4) max4; real(kind=8) max8
max4 = obj1%max()
max8 = obj2%max()
end program prog
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 151
e e e
9.5.3 – Proc´dure attach´e par op´rateur (operator binding )
module m
type matrix(k, n, m)
integer, kind :: k
integer, len :: n, m
real(kind=k), dimension(n,m) :: A
contains
GENERIC :: OPERATOR(+) => add4, add8
GENERIC :: ASSIGNMENT(=) => affect4, affect8
end type matrix
contains
function add4( a, b )
class(matrix(k=4, n=*, m=*), intent(in) :: a, b
class(matrix(k=4, n=:, m=:), allocatable :: add4
if( shape(a%A) /= shape(b%A) ) stop "Erreur : objets non conformants"
allocate( matrix(k=4, n=a%n, m=a%m) :: add4 )
add4%A(:,:) = a%A(:,:) + b%A(:,:)
end function add4
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 152
function add8( a, b )
class(matrix(k=8, n=*, m=*), intent(in) :: a, b
class(matrix(k=8, n=a%n, m=a%m) :: add8
if( shape(a%A) /= shape(b%A) ) stop "Erreur : objets non conformants"
add8%A(:,:) = a%A(:,:) + b%A(:,:)
end function add8
!---------------------------------
subroutine affect4( a, b )
class(matrix(k=4, n=*, m=*), intent(inout) :: a
class(matrix(k=4, n=*, m=*), intent(in) :: b
if( shape(a%A) /= shape(b%A) ) stop "Erreur : objets non conformants"
a%A(:,:) = b%A(:,:)
end function affect4
!---------------------------------
subroutine affect8( a, b )
class(matrix(k=8, n=*, m=*), intent(inout) :: a
class(matrix(k=8, n=*, m=*), intent(in) :: b
if( shape(a%A) /= shape(b%A) ) stop "Erreur : objets non conformants"
a%A(:,:) = b%A(:,:)
end function affect8
end module m
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 153
program prog
use m
type(matrix(k=kind(0.d0), n=5, m=10)) :: mat1d, mat2d, mat3d
type(matrix(k=kind(0.), n=20, m=60)) :: mat1s, mat2s, mat3s
. . .
mat1s = mat2s + mat3s ! Appel ` add4 puis affect4
a
. . .
a
mat1d = mat2d + mat3d ! Appel ` add8 puis affect8
end program prog
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 154
e e e
9.5.4 – Proc´dure attach´e via le mot-cl´ FINAL (final binding )
e e
C’est une proc´dure de type subroutine qui s’ex´cute lorsqu’un objet cesse d’exister.
e e a e e
Pour cela, au sein du type d´riv´ correspondant ` l’objet, on sp´cifie le mot-cl´ FINAL
e
auquel on associe une liste de sous-programmes (final subroutines) appel´s destructeurs.
e
Ceux-ci admettent un seul argument muet du type de celui d´fini.
e a
Pour un objet allou´ dynamiquement ` l’aide de l’instruction ALLOCATE, le destructeur
e e e
est appel´ au moment de sa d´sallocation effectu´e au moyen de l’instruction
DEALLOCATE.
e e
Pour un objet automatique, le destructeur est appel´ lorsque l’unit´ de programme, au
e e e
sein de laquelle l’objet est d´fini, est d´sactiv´e.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 155
module m
type t(k)
integer, KIND :: k
real(kind=k),pointer,dimension(:) :: v => null()
contains
FINAL :: finalize_scal , finalize_vect
end type t
contains
subroutine finalize_scal(x) !--> Arg. scalaire
type(t(k=4)) :: x
if( associated(x%v) ) deallocate(x%v)
end subroutine finalize_scal
subroutine finalize_vect(x) !--> Arg. vecteur
type(t(k=4)), dimension(:) :: x
do i=1,size(x)
if( associated(x(i)%v) ) deallocate(x(i)%v)
end do
end subroutine finalize_vect
end module m
e e e
Ainsi, lors de la d´sallocation de l’objet obj d´clar´ ainsi :
type(t(k=4)), dimension(:), allocatable :: obj
e e
c’est le destructeur finalize vect qui sera ex´cut´.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 156
e
9.6 – H´ritage
e e
9.6.1 – H´ritage d’une proc´dure type-bound
e e a e
Un type ´tendu d’un type extensible h´rite ` la fois de ses composantes mais ´galement
de ses proc´dures type bound.
e
module point
private
type, public :: point2d
real x, y
contains
PROCEDURE, PASS :: affichage => affichage_2d
end type
contains
subroutine affichage_2d ( this, texte )
CLASS(point2d), intent(in) :: this
CHARACTER(len=*), intent(in) :: texte
print *, texte
print *, "X = ", this%x
print *, "Y = ", this%y
end subroutine affichage_2d
end module point
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 157
e e
Voici un exemple d’h´ritage de proc´dure (ici affichage) :
module pointcoul
use point
private
type, public, extends(point2d) :: point2d_coul
real, dimension(3) :: compos_rvb
end type
end module pointcoul
!----------------------------
program prog
use pointcoul
type(point2d_coul) :: pcoul
e
call pcoul%affichage ( "Voici mes coordonn´es" )
end program prog
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 158
e
9.6.2 – Surcharge d’une proc´dure type-bound
e e e
Lors de la d´finition d’un type ´tendu d’un type extensible il est possible d’´tendre ou
surcharger (override) les proc´dures type bound.
e
module pointext
use point
type, public, extends(point2d) :: point3d
real z
contains
PROCEDURE, PASS :: affichage => affichage_3d
end type
contains
subroutine affichage_3d( this, texte )
CLASS(point3d), intent(in) :: this
CHARACTER(len=*), intent(in) :: texte
call this%point2d%affichage( texte )
print *, "Z = ", this%z
end subroutine affichage_3d
end module pointext
program prog
use pointext
type(point3d) p
e
call p%affichage ( "Voici mes coordonn´es" )
end program prog
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 159
e e a e
Dans les exemples pr´c´dents, les objets ` partir desquels les proc´dures type bound
e e e
sont appel´es sont d’un type fix´ : le compilateur sait alors quelle proc´dure appeler.
e e e e
Si l’on d´sire b´n´ficier du polymorphisme dynamique, on d´clare l’objet p de
e e
l’exemple pr´c´dent comme argument muet polymorphique. Cela permet d’appeler la
e a
proc´dure affichage correspondant au type dynamique de l’objet qui est ` l’origine de
l’appel.
program dynamic
use pointext
type(point2d) p2d
type(point3d) p3d
. . .
call affiche( p2d ); call affiche( p3d )
contains
subroutine affiche( p )
CLASS(point2d) , intent(in) :: p
e
call p%affichage ( "Voici mes coordonn´es" ) !--> Polymorphisme dynamique
end subroutine affiche
end program dynamic
a e e
La fonction affiche s’appliquera alors ` tout nouveau type ´tendu ult´rieurement
e a
d´fini sans avoir ` la recompiler.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet 160
e
9.6.3 – Proc´dure type-bound non surchargeable
a e e
L’attribut NON OVERRIDABLE ` la d´claration d’une proc´dure type-bound permet
e
d’interdire toute surcharge lors d’extensions ´ventuelles de ce type.
module m
type mycomplex
real theta, rho
contains
PROCEDURE, PASS, NON_OVERRIDABLE :: real => real_part
PROCEDURE, PASS, NON_OVERRIDABLE :: imag => imag_part
end type
contains
function real_part( a )
class(mycomplex), intent(in) :: a
real real_part
real_part = a%rho*cos(a%theta)
end function real_part
function imag_part( a )
class(mycomplex), intent(in) :: a
real imag_part
real_part = a%rho*sin(a%theta)
end function imag_part
end module m
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet : type abstrait 161
9.7 – Type abstrait
a e
C’est un type qui sert de base ` de futures extensions. Les proc´dures qui lui sont
e e e e e
attach´es doivent ˆtre d´clar´es avec l’attribut DEFFERED. La d´finition d’un tel type
e e
s’effectue en pr´cisant le mot-cl´ ABSTRACT.
e e
Il n’est pas possible de d´clarer des objets de ce type. Par contre, celui-ci peut ˆtre
e e
utilis´ pour la d´claration de variables polymorphiques.
e
L’extension d’un tel type peut se faire au moyen d’un type ´tendu normal ou d’un
nouveau type abstrait.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet : type abstrait 162
Voici un exemple :
module numerique
type, abstract :: mon_type_numerique
contains
private
procedure(func_oper), DEFFERED :: add
procedure(func_oper), DEFFERED :: mult
procedure(sub_oper), DEFFERED :: affect
generic, public :: operator(+) => add
generic, public :: operator(*) => mult
generic, public :: assignment(=) => affect
end type mon_type_numerique
abstract interface
function func_oper( a, b ) result(r)
class(mon_type_numerique), intent(in) :: a, b
class(mon_type_numerique), allocatable :: r
end function func_oper
subroutine sub_oper( a, b )
class(mon_type_numerique), intent(inout) :: a
class(mon_type_numerique), intent(in) :: b
end subroutine sub_oper
end interface
end module numerique
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
e
9 – Programmation orient´e objet : type abstrait 163
e e
Exemple de d´finition d’un type personnel mon entier h´ritant des ressources du type
e e
abstrait pr´c´dent.
module entier
use numerique
type, extends(mon_type_numerique) :: mon_entier
integer, private :: valeur
contains
procedure :: add => add_mon_entier
procedure :: mult => mult_mon_entier
procedure :: affect => affect_mon_entier
end type mon_entier
contains
e e
! D´finition des proc´dures :
! - add_mon_entier
! - mult_mon_entier
! - affect_mon_entier
end module entier
program prog
use entier
type(mon_entier) :: int1, int2, int3
. . .
e
int1 = int1*(int2 + int3) ! Implique l’appel aux proc´dures :
. . . ! add_mon_entier, mult_mon_entier puis affect_mon_entier
end program prog
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
10 – En conclusion 164
10 – En conclusion
La phase d’´laboration technique de la norme Fortran 2003 est termin´e ainsi que la
e e
phase ISO FCD (Final Committee Draft) dont le document
ISO-IEC/JTC1/SC22/WG5/N1578 (draft 04-007) est consultable en ligne ` a
l’adresse :
http://www.j3-fortran.org
a
` la rubrique Fortran 2003.
La norme Fortran 2003 est d´sormais officielle depuis septembre 2004.
e
En attendant l’arriv´e des premiers compilateurs Fortran 2003, certains fournisseurs
e
e
comme IBM, Nec, Nag, N.A. Software, ... int`grent progressivement certains
aspects de cette future norme.
´
INSTITUT DU DEVELOPPEMENT Fortran 2003 – Version 2.5 – 17 mars 2006
ET DES RESSOURCES
EN INFORMATIQUE SCIENTIFIQUE e
Patrick Corde, Herv´ Delouis
Index
– Symboles –
type-bound procedure : : generic binding . . . . . . . . . . . 150
bound procedure - surcharge . . . . . . . . . . . . . . . . . 158
type-bound procedure : : name binding . . . . . . . . . . . . . 149
type-bound procedure : : operator binding . . . . . . . . . . 151 –C–
type-bound procedure . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 C ALERT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
C ASSOCIATED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
C BACKSPACE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
–A– C CARRIAGE RETURN . . . . . . . . . . . . . . . . . . . . . . 15
C CHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
ABSTRACT INTERFACE . . . . . . . . . . . . . . . 123, 126 C DOUBLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
ACCESS - STREAM . . . . . . . . . . . . . . . . . . . . . . . . . 104 C F POINTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
adresse cible : C LOC(X) . . . . . . . . . . . . . . . . . . . . . . 20 C F PROCPOINTER . . . . . . . . . . . . . . . . . . . . . . . . . . 21
affectation et allocation automatique . . . . . . 90, 91 C FLOAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
ALLOCATABLE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 C FORM FEED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
allocatable . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 C FUNLOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
ALLOCATABLE - argument de proc´dure . . . . . 86 e C FUNPTR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21, 45
ALLOCATABLE - composante type d´riv´ . . . . 88 e e C HORIZONTAL TAB . . . . . . . . . . . . . . . . . . . . . . . . 15
ALLOCATABLE - scalaire . . . . . . . . . . . . . . . . . . . . 89 C INT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
ALLOCATABLE : argument INTENT(OUT) . . 87 C LOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20, 21, 47
ALLOCATABLE : argument SAVE . . . . . . . . . . . . 87 C LONG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
allocation via affectation . . . . . . . . . . . . . . . . . . . . . . 90 C NEW LINE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
e
argument de proc´dure : ALLOCATABLE . . . . . 86 C NULL CHAR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
arguments - ligne de commande . . . . . . . . . . . . . . . 11 C PTR . . . . . . . . . . . . . . . . . . . . . . . . . 19–21, 45, 46, 50
arrondi . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58 C SHORT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
e
association : pointeur de proc´dure . . . . . . . . . . . 118 C VERTICAL TAB . . . . . . . . . . . . . . . . . . . . . . . . . . . 15
asynchrones - E./S. . . . . . . . . . . . . . . . . . . . . . . . . . . 102 calloc . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48, 51
ASYNCHRONOUS . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 e e
CHARACTER : interop´rabilit´ . . . . . . . . . . . . . . . 14
CLASS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
–B– CLASS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158
CLOSE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
BIND(C) . . . . . . . . . . . . . . . . . . . 18, 22, 23, 45, 46, 50 COMMAND ARGUMENT COUNT . . . . . . . . . . . . 11
bloc interface : IMPORT . . . . . . . . . . . . . . . . . . . . . . 96 e e
common : interop´rabilit´ . . . . . . . . . . . . . . . . . . . . . 18
164-1
composante ALLOCATABLE : destructeur . . . . 87 GENERIC : : ASSIGNMENT . . . . . . . . . . . . . . . . . 153
e e
constructeur de type d´riv´ . . . . . . . . . . . . . . . . . . 129 GENERIC : : OPERATOR . . . . . . . . . . . . . . . . . . . 153
generic binding . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 105
e e
generic binding : type d´riv´ . . . . . . . . . . . . . . . . . 150
–D– GET COMMAND . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
GET COMMAND ARGUMENT . . . . . . . . . . . . . . . 11
e e
d´normalis´e . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
declared type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 GET ENVIRONMENT VARIABLE . . . . . . . . . . . . 11
DEFERRED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
descripteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
descripteur de format DT . . . . . . . . . . . . . . . . . . . . 106
h´ritage - proc´dure
e e
–. . .H . .–. . . . . . . . . . . . . . . . . 157
... .
destructeur : composante ALLOCATABLE . . . . 87
e e
destructeur type d´riv´ . . . . . . . . . . . . . . . . . . . . . . 154
e
division par z´ro . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
DT - descripteur format . . . . . . . . . . . . . . . . . . . . . . 106
dtio-generic-pec . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 IEEE
–I–
ALL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67, 70–72
dynamic type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 IEEE ARITHMETIC . . . . . . . . . . . . . . . . . . . . . . . . . . 59
IEEE CLASS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
IEEE CLASS TYPE . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
e
–E–
Entr´es/sorties . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
IEEE
IEEE
DIVIDE BY ZERO . . . . . . . . . . . . . . . . . . 66, 70
EXCEPTIONS . . . . . . . . . . . . . . . . . . . . . . . . . . 59
environnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 IEEE FEATURES . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
environnement - variables d’ . . . . . . . . . . . . . . . . . . . 12 IEEE GET FLAG . . . . . . . . . . . . . . . . . . . . . . . . . 68, 70
ERROR UNIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 IEEE GET HALTING MODE . . . . . . . . . . . . . . . . . 70
EXTENDS() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 IEEE GET ROUNDING MODE . . . . . . . . . . . . . . . 65
EXTENDS TYPE OF . . . . . . . . . . . . . . . . . . . . . . . . 146 IEEE GET STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
IEEE GET UNDERFLOW MODE(gradual) . . . 69
IEEE INEXACT . . . . . . . . . . . . . . . . . . . . . . . . . . . 66, 68
–F– IEEE
IEEE
INVALID . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66
IS FINITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
FINAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 154
final subroutine . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 IEEE IS NAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
fonction C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47, 48, 51 IEEE IS NEGATIVE . . . . . . . . . . . . . . . . . . . . . . . . . . 62
IEEE IS NORMAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62
IEEE NEGATIVE DENORMAL . . . . . . . . . . . 61, 64
–G–
GENERIC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
IEEE
IEEE
NEGATIVE INF . . . . . . . . . . . . . . . . . . . . 61, 64
NEGATIVE NORMAL . . . . . . . . . . . . . . 61, 64
IEEE NEGATIVE ZERO . . . . . . . . . . . . . . . . . . 61, 64
164-2
IEEE OTHER VALUE . . . . . . . . . . . . . . . . . . . . . . . . 61 ISO C BINDING . . . . . . . . . . . . . . . . . . . . . . . 13, 20, 45
IEEE OVERFLOW . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 ISO FORTRAN ENV . . . . . . . . . . . . . . . . . . . . . . . . . . 12
IEEE POSITIVE DENORMAL . . . . . . . . . . . . 61, 64
IEEE POSITIVE INF . . . . . . . . . . . . . . . . . . . . . . 61, 64
IEEE POSITIVE NORMAL . . . . . . . . . . . . . . . 61, 64
IEEE POSITIVE ZERO . . . . . . . . . . . . . . . . . . . 61, 64
–K–
e e e
KIND : param`tre type d´riv´ . . . . . . . . . . . 127, 128
IEEE QUIET NAN . . . . . . . . . . . . . . . . . . . . . . . . . . . . 61 kind type parameters . . . . . . . . . . . . . . . . . . . . . . . . . 128
IEEE ROUND VALUE . . . . . . . . . . . . . . . . . . . . . . . . 65
IEEE SET FLAG . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 68
IEEE SET HALTING MODE . . . . . . . . . . . . . . . . . . 70
IEEE SET ROUNDING MODE . . . . . . . . . . . . . . . . 65
e e e
–L–
LEN : param`tre type d´riv´ . . . . . . . . . . . . 127, 128
IEEE SET STATUS . . . . . . . . . . . . . . . . . . . . . . . . . . . 72
length type parameters . . . . . . . . . . . . . . . . . . . . . . . 128
IEEE SET UNDERFLOW MODE(gradual) . . . . 69
ligne de commande : arguments . . . . . . . . . . . . . . . 11
IEEE SIGNALING NAN . . . . . . . . . . . . . . . . . . . . . . 61
IEEE STATUS TYPE . . . . . . . . . . . . . . . . . . . . . . . . . 72
IEEE SUPPORT DATATYPE . . . . . . . . . . . . . 60, 64
IEEE SUPPORT DENORMAL . . . . . . . . . . . . . . . . 60 –M–
IEEE SUPPORT INF . . . . . . . . . . . . . . . . . . . . . . . . . 60 e
module : importation d’entit´s . . . . . . . . . . . . . . . . 96
IEEE SUPPORT NAN . . . . . . . . . . . . . . . . . . . . . . . . 60 e
module : protection d’entit´s . . . . . . . . . . . . . . . . . . 95
IEEE SUPPORT STANDARD . . . . . . . . . . . . . . . . . 60 e
module : renommage d’op´rateurs . . . . . . . . . . . . . 97
IEEE UNDERFLOW . . . . . . . . . . . . . . . . . . . . . . . . . . 66 module : USE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
IEEE UP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 MOVE ALLOC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93
IEEE USUAL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 67
IEEE VALUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 62, 64
IMPORT : bloc interface . . . . . . . . . . . . . . . . . . . . . . 96
INPUT UNIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
–N–
NAME= . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 22, 23
INQUIRE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104 NaN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56, 57
INTENT - pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . 115 NON OVERRIDABLE . . . . . . . . . . . . . . . . . . . . . . . 160
INTENT(OUT) : argument ALLOCATABLE . . 87
interface implicite . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Interface proc´dure Fortran . . . . . . . . . . . . . . . . . . . 22
e
e
interop´rabilit´ Fortran-C . . . . . . . . . . . . . . . . . 13, 18
e e
–O–
op´rateur : renommage via USE . . . . . . . . . . . . . . . 97
IOSTAT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 e e
operator binding : type d´riv´ . . . . . . . . . . . . . . . . 153
IOSTAT END . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 OPERATOR() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 97
IOSTAT EOR . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12 OUTPUT UNIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
iso-IEC-1539 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2 overflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
164-3
override - type bound procedure . . . . . . . . . . . . . . 158 reprofilage et association . . . . . . . . . . . . . . . . 116, 117
e
–P–
param`tres d’un type d´riv´ . . . . . . . . . . . . . . . . . . 127
e e
–S–
SAME TYPE AS . . . . . . . . . . . . . . . . . . . . . . . . 146, 147
PASS, NOPASS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125 SAVE : argument ALLOCATABLE . . . . . . . . . . . . 87
POINTER . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 scalaire : ALLOCATABLE . . . . . . . . . . . . . . . . . . . . . 89
e e
pointer : interop´rabilit´ . . . . . . . . . . . . . . . . . . . . . . 19 SELECT TYPE . . . . . . . . . . . . . . . . . . . . . . . . . 143, 147
pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85 select type . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
e
pointeur - proc´dure . . . . . . . . . . . . . . . . . . . . . . . . . 125 standard IEEE . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56, 57
pointeur - reprofilage . . . . . . . . . . . . . . . . . . . . 116, 117 STREAM - ACCESS . . . . . . . . . . . . . . . . . . . . . . . . . 104
pointeur : vocation . . . . . . . . . . . . . . . . . . . . . . . . . . . 115 struct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
pointeur C : valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20 e e
structure : interop´rabilit´ . . . . . . . . . . . . . . . . . 46, 50
e
pointeur de proc´dure . . . . . . . . . . . 21, 118–120, 123 structure C . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
e
pointeur de proc´dure : association . . . . . . . . . . . 118 surcharge - type bound procedure . . . . . . . . . . . . 158
e e
pointeur g´n´rique . . . . . . . . . . . . . . . . . . . . . . . . . . . 145
pointeur polymorphique . . . . . . . . . . . . . . . . . . . . . . 142
pointeurs : interop´rabilit´ . . . . . . . . . . . . . . . . . . . . 19
e e
polymorphique - pointeur . . . . . . . . . . . . . . . . . . . . 142
–T–
tableau dynamique . . . . . . . . . . . . . . . . . . . . . . . . . . . . 85
polymorphisme . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 159 e e
tableaux : interop´rabilit´ . . . . . . . . . . . . . . . . . . . . . 18
POS - READ/WRITE . . . . . . . . . . . . . . . . . . . . . . . . 104 tableaux dynamiques . . . . . . . . . . . . . . . . . . . . . . . . . . 90
e e
PRIVATE - type d´riv´ . . . . . . . . . . . . . . . . . . . . . . 134 toward +∞ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
e
proc´dure . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 toward −∞ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
e
proc´dure - pointeur . . . . . . . . . . . . . . . . . . . . . . . . . 125 toward nearest . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
e
proc´dure : pointeur . . . . . . . . . . . . . . . . . . . . . . . . . . . 21 toward zero . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 58
e
proc´dure : pointeur de . . . . . . . . . . . . . 118–120, 123 traitement des interruptions . . . . . . . . . . . . . . . . . . . 70
PROCEDURE : attribut . . . . . . . . . . . . 119, 120, 123 traitement exception . . . . . . . . . . . . . . . . . . . . . . . . . . 68
PROCEDURE() - attribut pointeur . . . . . . . . . . 123 type abstrait . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
PROTECTED . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 95 type bound procedure . . . . . . . . . . . . . . . . . . . . . . . . 157
e e
PUBLIC - type d´riv´ . . . . . . . . . . . . . . . . . . . . . . . . 134 e e
type d´riv´ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
e e
type d´riv´ : composante ALLOCATABLE . 87, 88
e e
type d´riv´ : constructeur . . . . . . . . . . . . . . . . . . . . 129
–R–
e
r´allocation et affectation automatique . . . . 90, 91
e
type d´riv´ : destructeur . . . . . . . . . . . . . . . . . . . . . 154
e
e
e
type d´riv´ : E./S. . . . . . . . . . . . . . . . . . . . . . . 105, 106
e
r´allocation via affectation . . . . . . . . . . . . . . . . . . . . 90 e e
type d´riv´ : GENERIC . . . . . . . . . . . . . . . . . . . . . . 105
READ . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102 e e
type d´riv´ : generic binding . . . . . . . . . . . . . . . . . 150
164-4
e e
type d´riv´ : operator binding . . . . . . . . . . . . . . . . 153
e e e
type d´riv´ : param`tre KIND . . . . . . . . . . . 127, 128
e e e
type d´riv´ : param`tre LEN . . . . . . . . . . . . 127, 128
e e e
type d´riv´ : param`tres . . . . . . . . . . . . . . . . . . . . . 127
e e
type d´riv´ : PRIVATE . . . . . . . . . . . . . . . . . . . . . . 134
e e
type d´riv´ : PUBLIC . . . . . . . . . . . . . . . . . . . . . . . . 134
e e e
type d´riv´ : visibilit´ . . . . . . . . . . . . . . . . . . . . . . . . 134
TYPE IS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
typedef . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
typedef struct . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48, 51
–U–
underflow . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57, 58
e
USE - module, renommage op´rateur . . . . . . . . . . 97
–V–
e
valeurs sp´ciales . . . . . . . . . . . . . . . . . . . . . . . . . . . 56, 57
VALUE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46, 50
VALUE : attribut . . . . . . . . . . . . . . . . . . . . . . . . . . 22, 23
variable d’environnement . . . . . . . . . . . . . . . . . . . . . . 12
variable polymorphique . . . . . . . . . . . . . . . . . . . . . . 140
variable polymorphique : ALLOCATABLE . . . 142
variable polymorphique : argument muet . . . . . 141
variable polymorphique : POINTER . . . . . . . . . . 142
e e e
visibilit´ : type d´riv´ . . . . . . . . . . . . . . . . . . . . . . . . 134
void . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
–W–
WAIT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
Working draft . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2, 164
WRITE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 102
164-5
Get documents about "