Vous êtes sur la page 1sur 81

Le langage FORTRAN (JJH) - page 1

Le Langage

FORTRAN

J.J. HUNSINGER

Le langage FORTRAN (JJH) - page 2

1. INTRODUCTION
1.1 Historique En Novembre 1954, L'informatique commence prendre de l'ampleur. Jusqu'alors, les langages de programmation sont rests proches du langage machine. La compagnie International Business Machines (Les initiales ne vous rappellent-elles rien ?) publie la description d'un langage de programmation volu appel alors systme de FORmula TRANslator (traducteur d'quations. Ce nouveau langage, plus condens, avait pour vocation d'ouvrir l'utilisation des ordinateurs aux scientifiques. C'est en 1956 qu'est apparu le premier manuel de rfrence de chez IBM. Ce manuel dcrivait le FORTRAN I. Evidemment, ce langage tait appel voluer. C'est ainsi que, successivement, sont apparus:

1957: FORTRAN II 1958: FORTRAN III (Rest plus ou moins confidentiel) 1962: FORTRAN IV (Il aura rgn 16 ans) 1978: FORTRAN V (Normalisation ANSI et AFNOR)

Durant toute cette volution FORTRAN a respect toutes les anciennes normes de manire assurer une transplantation rapide des anciens programmes sur les nouveaux compilateurs. Le prsent abrg portera sur le FORTRAN 77, ainsi que le FORTRAN 90. Le premier est proche du FORTRAN V mais comporte en plus des instructions de structuration, le second se rapproche d'avantage des langages modernes et est orient vers la parralllisation des calculs. On trouve le langage FORTRAN sous diffrents systmes d'exploitation comme MS-DOS (ordinateurs compatibles IBM PC), UNIX (mini ordinateurs et gros systmes), WINDOWS 95, ainsi que WINDOWS NT1. Ces deux derniers systmes d'exploitation offrent les possibilits de travail jusqu'alors disponibles uniquement sous des systmes comme UNIX. Sans vouloir faire l'loge de WINDOWS 95 ou WINDOWS NT, Il s'agit l d'un progrs mettant la porte de l'tudiant d'une puissance de calcul considrable, que l'on ne trouvait que sur des stations de travail, et un prix beaucoup plus lev.

1.2 Elaboration d'un programme Un programme Fortran ncessite trois types de fichiers pour son laboration :

2 Les fichiers source (extension .FOR, .F90 sous MS-D ou WINDOWS, .f sous UNIX) OS Les fichiers objet (extension .OBJ sous MS-DOS, .o sous UNIX) Le fichier excutable (extension .EXE sous MS-DOS ou WINDOWS, dfinie par l'utilisateur sous UNIX).

1WINDOWS

95 et WINDOWS NT sont des systmes d'exploitation disponibles pour des micro-ordinateurs base de 386, 486 oupentium et disposant d'au moins 16 Mo de mmoire vive. 2MS-DOS et UNIX sont ce qu'on appelle des systmes d'exploitation. Ils permettent aux diteurs de logiciels d'adapter plus facilement les langages aux diffrents types de machines. Ainsi, par exemple, pour crer, copier, modifier, enregistrer des fichiers, il n'est pas indispensable de connatre le type exact du support sur lequel on effectue les stockages.

Le langage FORTRAN (JJH) - page 3

Le programmeur crit le fichier source l'aide d'un diteur de texte de son choix. Il s'agit d'un texte clair, contenant toutes les instructions du programme. Ce fichier peut tre envoy sur une imprimante ou affich sur l'cran. C'est ce que fait l'diteur de texte. Le fichier source doit ensuite tre compil, c'est dire traduit en langage machine. C'est le rle du compilateur. Chaque langage possde d'ailleurs un compilateur propre. Le fichier obtenu aprs compilation est un fichier objet, pas encore excutable. Le fichier objet possde la particularit de pouvoir tre reli d'autres fichiers du mme genre si l'utilisateur le dsire. Ainsi, comme nous le verrons, les sous-programmes utiles et universels comme par exemple un sous-programme de rsolution de zro de fonction, pourra tre appel partir d'un programme principal sans pour autant figurer dans le mme fichier que ce dernier. L'diteur de liens (LINK ou ld comme "loader") se chargeant de les lier et de les rendre excutables. Toute modification, correction d'un programme passe tout d'abord par la modification du fichier source. Ce fichier doit tre ensuite recompil, ce qui permet d'obtenir un fichier objet mis jour. Attention, tout fichier excutable comportant le module objet modifi n'est plus jour. Il faut dans ce cas procder une nouvelle dition des liens. Dans un cas simple, sur un compatible PC, on crit le programme que nous appellerons par exemple PROG.FOR l'aide d'un diteur de texte au choix. Attention de ne pas prendre un traitement de texte. On sauvegarde le fichier source sur le disque dur en lui donnant un nom respectant les conditions du systme d'exploitation utilis (DOS, UNIX3 en gnral). L'extension utilise est gnralement .FOR sous MS-DOS, et .f sous UNIX. Le compilateur traduit les instructions qui ont t tapes par le programmeur et produit, si aucune erreur n'a t faite, en langage machine. La traduction est place dans un fichier objet dont le nom est identique celui du fichier source, mais dont l'extension est cette fois .OBJ sous DOS, et .o sous UNIX. Attention, dans certains cas, l'diteur de liens est automatiquement appel et rend le programme excutable. Deux cas sont possibles : Votre fichier programme contient tout ce qui est ncessaire, programme et sous-programmes. Dans ce cas, le fichier objet est pratiquement complet. Il ne lui manque que l'entte de dmarrage, la mise en place des zones mmoire pour les variables, les fonctions intrinsques (par ex. sin()), et les adresses relatives des diffrentes sections appeles. L'diteur de liens se charge de rsoudre ces problmes qui sont en fait indpendants (plus ou moins) du type de langage utilis. On peut, en prenant toutefois certaines prcautions dcrites dans les manuels, lier des modules objet crs partir du FORTRAN d'autres crs partir du PASCAL et du C. L'diteur de liens travaille indpendamment du langage utilis; puisque toute notion de langage ( part le langage machine, videmment) disparat aprs l'opration de compilation.

3Se

rfrer au manuel correspondant au systme d'exploitation

Le langage FORTRAN (JJH) - page 4

L'diteur de liens charge partir d'un fichier appel librairie 4 ces modules ncessaires, met bout bout tous ces modules, y compris les modules objet produits par le programmeur, calcule les adresses relatives et met jour toutes les instructions provoquant un branchement une autre adresse. Le fortran Microsoft Version 5.1 qui implmente dj certaines spcificits du FORTRAN 90, est livr avec un environnement de dveloppement incorpor. Les oprations d'dition, de 5 compilation et d'dition des liens sont lances depuis l'environnement de dveloppement PWB que l'on lance au dbut d'une session de travail. Les principales avances du FORTRAN 90 concernent les manipulations de tableaux, une 6, augmentation substantielle des procdures intrinsquesla possibilit de dfinition de nouveaux types de variables (STRUCTURES), les boucles DO WHILE, les constructions Cas o (CASE)... L'instruction GOTO, toujours disponible, est proscrire. Un programme est souvent compos de plusieurs modules (sous-programmes), chacun pouvant se trouver dans des fichiers spars. L'application complte comportera tous les modules lis. Tout d'abord, il conviendra de compiler sparment sans dition des liens chaque module. A l'issue de cette opration, on obtiendra des modules objets, c'est dire en langage machine, mais sans adresse d'implantation en mmoire. On les reliera tout en fixant les adresses l'aide de l'diteur de liens LINK.EXE. Le fichier obtenu sera le programme excutable. Ces oprations mettant en jeu de multiples fichiers sont grandement facilites par l'emploi de fichier projet. Les environnements de dveloppement permettent la gestion de projets. Un fichier projet est un fichier comportant toutes les informations ncessaires pour reconstituer un programme excutable, ou une librairie. La constitution d'un fichier projet est extrmement simple. Cette action est dcrite dans le manuel d'utilisation de l'environnement de dveloppement.

4Une

librairie est un assemblage de modules objet indpendants, ce qui vite l'obligation de manipuler une quantit impressionnante de fichiers.
5Voir

le manuel PWB.
math ou autres disponibles avec la librairie standard du FORTRAN

6Fonctions

Le langage FORTRAN (JJH) - page 5

Fichiers
Source 1 Objet 1 Fichier Source 2 Objet 2 Programme Excutable Source 3 Objet 3

Source 4 Compilation

Objet 4 Edition des liens (Linker)

Le langage FORTRAN (JJH) - page 6

2. Structure des instructions


2.1 Structure d'un programme Un programme comporte gnralement plusieurs modules. Ces modules peuvent figurer dans un mme fichier ou dans des fichiers diffrents. Lorsque les modules figurent dans des fichiers individuels, il est possible, et c'est mme fortement conseill, de les rutiliser dans d'autres programmes. L'inconvnient (mineur) est la ncessit d'emploi d'un fichier projet, charg de communiquer l'diteur de liens les noms des diffrents modules lier. Un ensemble de modules doit, pour pouvoir tre excut, comporter un programme principal. Le programme principal peut faire appel des procdures et des fonctions qui peuvent faire de mme. Un module comporte diffrentes parties :

L'entte ou le nom du module. En FORTRAN on peut trouver: PROGRAM nom du programmepour le programme principal SUBROUTINE(Liste de paramtres pour un sous-programme ) FUNCTION(Liste de paramtres pour une fonction ) Les dclarations des paramtres, s'il y a lieu Les dclarations des variables Les initialisations et dclarations particulires. Cette section est un peu particulire et sera traite en fin de manuel. Les instructions excutables. C'est la traduction en langage (FORTRAN) de l'algorithme. l'instruction FIN de module. En FORTRAN, il s'agit de END.

Attention, dans un fichier comportant plusieurs modules, il y aura autant d'instructions FIN que de modules. Pratiquement chaque module possde ses variables. Vous pouvez choisir leur nom sans tenir compte de ceux que vous avez dj utiliss dans d'autres modules. En effet, la seule possibilit de communication de variables entre diffrents modules se fait par les paramtres d'appel et par les blocsCOMMON. 2.2 Elments de base du langage Lorsque l'on crit un programme, on utilise les lettres de l'alphabet, les chiffres et quelques signes. Les caractres reconnus par le compilateur sont :

Les 36 caractres alphanumriques: les 10 chiffres dcimaux les 26 lettres de l'alphabet Les caractres spciaux:

Le langage FORTRAN (JJH) - page 7

= + * / ( ) , . ' :

espace typographique signe egal plus moins etoile barre de fraction parenthses virgule point apostrophe double point

Chaque instruction, sauf l'instruction d'affectation (ex. : VALEUR = 10 ) , commence par un mot-cl du FORTRAN. 2.3 Les mots-cl du langage Leur nombre est limit. Ils constituent le vocabulaire reconnu par le compilateur. Toute autre chane de caractres est considre comme nom de procdure, de constante, de variable ou bien comme commentaire. L'annexe A comporte la liste alphabtique des mots-cl, ainsi qu'une description succincte. Exemple de mots-cl: DATA, READ, PRINT, CONTINUE, COMMON. 2.4 Les sparateurs

Les parenthses ( ) Elles encadrent une liste ou un indice associ un mot-cl ou un nom de variable (dans le cas de tableaux).

Le signe = Il constitue le symbole d'affectation Il prcde la valeur dans la dclaration d'une constante Il introduit les paramtres dans une boucle DO Les barres de fraction / /

1. 2. 3.

Elles encadrent une liste associe certains mots-cl comme par exemple DATA

L'astrisque *

Elle dsigne la transmission hors format de donnes ou l'utilisation d'un priphrique standard d'entre-sortie (cran-clavier)

Les apostrophes ' '

Le langage FORTRAN (JJH) - page 8

Elles encadrent les constantes de type alphanumrique

Le point-virgule ;

Le point-virgule spare plusieurs instructions situes sur la mme ligne (F90). Cas particulier: le caractre espace. Le compilateur l'ignore, sauf s'il se situe dans une constante ou variable alphanumrique. Dans l'exemple ci-dessous, les trois lignes sont rigoureusement identiques, et l'absence ou la prsence d'espace laisse le compilateur totalement indiffrent. Seul le lecteur peut tre gn lors de la lecture de la dernire ligne. TOTAL = PUHT * NBRE * TVA TOTAL=PUHT*NBRE*TVA T O TAL= PU HT*NBRE * T V A Il est donc possible, en FORTRAN 90, de placer plusieurs instructions par ligne, condition de les sparer par des points-virgule, mais rservez cette possibilit uniquement aux affectations d'initialisation. Exemple : A=1; B=-4.0; EPSILON=.0001 2.5 Mise en place des instructions 2.5.1 Structure d'une ligne FORTRAN De nos jours, les programmes sont tous crits sur la console, l'aide d'un diteur de texte. Une ligne se dcompose en quatre groupes de colonnes (total de colonnes: 80): Colonnes 1 a 5 Colonne 6 Colonnes 7 a 72 Colonnes 73 a 80 Rserves aux tiquettes Rserve au caractre de continuation de ligne Instruction du programme Ignores par le compilateur

Attention : Le non respect de l'usage de ces quatre groupes de colonnes est une cause frquente d'erreurs que commet un dbutant. 2.5.2 Description des zones Les tiquettes servent rfrencer les lignes pour par exemple un saut (GOTO) ou un format d'entre/sortie (FORMAT). Il n'est absolument pas ncessaire de respecter un ordre croissant de ces tiquettes. Elles se placent toujours partir de la premire colonne. Les lignes de continuation sont utilises lorsque l'on risque de dpasser la colonne 72 lors de l'criture d'une dclaration de liste de variables ou lors d'une instruction trop longue (cas de formules complexes). Le nombre de lignes de continuation ne peut en aucun cas excder 19. Pour mettre en place une ligne de continuation, il suffit de faire figurer dans la colonne 6 un

Le langage FORTRAN (JJH) - page 9

chiffre quelconque ou tout simplement un point. Une autre possibilit est de placer au bout de l'instruction que l'on dsire continuer sur la ligne suivante un caractre '&'. Exemple : WRITE(*,*) & 'Cette ligne ne rentre pas sur 80 colonnes, on coupe.' Les colonnes 73 80 taient utilises lorsque les programmes taient crits sur cartes perfores pour reprer les cartes les unes par rapport aux autres. Imaginez un lcher inopportun d'un paquet de 500 cartes sur le plancher... Aucun signe particulier marque la fin d'une instruction. Il ne peut y avoir qu'une seule instruction par ligne. On veillera ne pas couper un nom de variable ou un mot rserv en passant une ligne de continuation. Attention : Une erreur frquente est le dpassement de la colonne 72. Le compilateur ne le signale pas directement. Il se contente de remarquer soit une instruction incomprhensible, soit une nouvelle variable (en tronquant automatiquement la fin du mot). Le rflexe du programmeur devra tre de vrifier en premier lieu la position des fins d'instruction ds qu'une erreur signale par le compilateur parat incomprhensible. Les compilateurs FORTRAN 90 (par exemple le compilateur Microsoft) admettent le format libre de ligne. Aucune colonne nest rserve, un commentaire commence par un point dexclamation, la colonne 72 nest plus une limite. Avec le compilateur Microsoft, le fait de prciser .f90 pour lextension dun fichier source au lieu de .for, implique lutilisation du format libre. 2.6 Commentaires Lorsque le caractre C ou * figure dans la premire colonne, la ligne entire est suppose tre un commentaire, et le compilateur l'ignore. Une ligne vide est galement considre comme commentaire par le compilateur. Il est conseill de faire usage autant que possible des commentaires, afin de rendre le programme plus lisible. La notice d'utilisation du module figurera sous forme de commentaire en en-tte, et de ce fait ne quittera pas le programme. Le FORTRAN 90 admet galement des commentaires en fin de ligne d'instruction. Dans ce cas, ils commencent par un point d'exclamation. 2.7 Un exemple...
C C Voici un exemple de programme FORTRAN respectant les regles :

PROGRAM BIDON ! L'instruction PROGRAM n'est pas obligatoire C C Normalement, il faudrait declarer ici variables et parametres, C mais comme il n'y en a pas... C WRITE(*,*) 'Voici un message qui va etre affiche sur l ecran'

Le langage FORTRAN (JJH) - page 10

C C Notez que l'on a volontairement oublie l'apostrophe, car elle C delimite les constantes alphanumeriques, ce qui, dans le cas C present, aurait provoque une erreur signalee par le compilateur C WRITE(*,*) 1 'Ceci est en fait une seule ligne (ligne de continuation)' C END C Faut pas l'oublier...

2.8 Les identificateurs Un identificateur est un nom que le programmeur attribue une variable, un sous-programme ou une fonction. En principe, il ne peut comporter plus de 6 caractres, mais certains compilateurs en admettent d'avantage. Si l'on utilise un identificateur faisant plus de 6 caractres, les derniers sont au pire ignors par le compilateur, et il peut confondre deux variables distinctes. Il ne faut pas choisir pour nom de variable un mot rserv . Les mots rservs sont les instructions de structuration et des noms de fonctions standard. Ils utilisent toutes les lettres de l'alphabet, ainsi que les 10 chiffres, mais ils ne commenceront jamais par un chiffre. On peut utiliser indiffremment majuscules et minuscules. Les variables sont places dans des zones mmoire repres par leur adresse. Pour le programmeur, le fait d'ignorer l'adresse physique en mmoire d'une variable n'es pas du tout un handicap, d'autant plus qu'il n'en dsire connatre que le nom. Le compilateur se charge de faire correspondre un identificateur une adresse mmoire. Un identificateur peut-tre un nom de fonction, de variable, ou de procdure. Un conseil : Pour crer un identificateur, n'utilisez que les 26 lettres de l'alphabet, les chiffres et si vous dsirez inclure un espace, prenez le caractre soulign '_'. Les majuscules et minuscules sont confondus par le langage. On peut donc styliser les noms de variables par un usage combin de majuscules et de minuscules. Les rgles lmentaires suivre pour la constitution de noms de variables seront dcrites en annexe. Exemples : TOTAL RACINE I1 Les noms suivants ne sont pas valables : SOUSTOTAL 3I9 A.B PAUSE (Admissible, mais comporte plus de 6 car.) (Commence par un chiffre) (Comporte un point) (Mot reserve du langage)

Le langage FORTRAN (JJH) - page 11

3. Constantes et Variables
3.1 Constantes 3.1.1 Gnralits Les constantes apparaissent dans un programme sous la forme d'une valeur. On ne peut pas leur attribuer un nom. 3.1.2 Constantes entires Dfinition : C'est une suite de chiffres prcde ou non d'un signe, ne pouvant comporter aucun autre caractre. Exemples : 123 -18 +4 Contre-exemples : 3 14 3.14 2,71828 3.1.3 Constantes relles On peut les trouver sous la forme simple prcision ou double prcision. On peut les prsenter de deux manires :

constante relle de base : mantisse

C'est une chane de chiffres comportant obligatoirement un seul point dcimal, pouvant tre prcde d'un signe. Exemples : 3.14 -6.28 .7 0.

Constante relle de base suivie d'un exposant.

La prsentation reste identique la prcdente, mais on rajoute en fin de chane un exposant comportant pour la simple prcision la lettre E suivie d'une constante entire signe de deux

Le langage FORTRAN (JJH) - page 12

chiffres. La mantisse peut comporter 7 chiffres significatifs. En ce qui concerne la double prcision, la mantisse comportera 15 16 chiffres significatifs, l'exposant commencera par la lettre D et pourra comporter 3 chiffres. Les limites sont indiques dans le chapitre de prsentation des variables. Exemples : 128.34E+02 -.432E-06 1.23267453274D+03 Contre-exemples : 1,5E+01 -.23E

3.1.4 Constantes complexes Une constante complexe se prsente sous la forme d'un doublet de deux rels plac entre parenthses. Les deux rels sont spars par une virgule, le premier reprsentant la partie relle, le second la partie imaginaire. Exemples : (20.0, -3.14) (0.,0.) (1.E01,1.23E-02) Les rels formant le complexe doivent tre de mme nature, soit en simple ou en double prcision. 3.1.5 Constantes logiques Un constante logique n'a que deux valeurs possibles : .TRUE. .FALSE. 3.1.6 Constantes chanes de caractres C'est une suite de caractres quelconques encadre par l'apostrophe '. On utilise ces constantes pour composer des messages ou initialiser des chanes. Attention : Le franais fait un usage courant de l'apostrophe, ceci peut poser un problme lors de l'affichage de certains messages. Exemples : WRITE(*,*)'LUNDI 1 JANVIER 1990'

Le langage FORTRAN (JJH) - page 13

Contre-exemple : WRITE(*,*)'L'affichage d'apostrophes va poser des problemes!' Ce problme peut tre rgl par le double apostrophage : WRITE(*,*)'L''affichage d''apostrophes ne pose plus de probleme!'

3.1.7 Dclaration des constantes En FORTRAN, les constantes n'ont pas de nom. Les dclarations de constantes n'existent donc pas. Cependant, il peut-tre utile de nommer des constantes, ce qui permet de les dcrire en dbut de programme, et de les localiser tout de suite pour une modification. On utilise pour cel la dclarationPARAMETER. Exemple : Parameter PI 3.14159 3.2 Les variables 3.2.1 Variables simples On reprsente les variables simples l'aide de leur identificateur. Le compilateur fait correspondre chaque identificateur une zone mmoire dpendant du type de la variable qu'il reprsente. 3.2.2 Les tableaux (Variables indices) On reprsente une variable indice ou un tableau par un identificateur, suivi d'indices placs entre parenthses et spars par des virgules : Identificateur(I1, I2, ...) Exemples : TABLE(I,J) PNT(2,K,L) A(I)

L'indice peut tre une variable ou une expression mathmatique de type rel ou entier. Il sera converti en entier. On vitera d'utiliser un indice rel, pour des raisons de compatibilit avec d'autres langages ainsi que pour des erreurs dues aux arrondis dans les calculs. Exemples : ALPHA(5)

Le langage FORTRAN (JJH) - page 14

ELEM(3,J+3) MAT(I*2, I+IMAT(J,I)) 3.3 Dclaration des variables 3.3.1 Les types de variables FORTRAN est un langage permettant l'utilisation de 5 types de variables intrinsques: REAL INTEGER LOGICAL COMPLEX CHARACTER reels entiers logiques complexes chaines de caracteres

et dans une certaine mesure : EXTERNAL identificateurs de sous-programmes

Deux types de variables sont privilgis en FORTRAN (dclaration implicite) :


Les variables entires Les variables relles

IMPORTANT : Le compilateur les distingue partir de leur lettre initiale. Toute variable dont le nom commence par la lettre I, J, K, L, M, N est considre comme entire et les autres comme tant relles. Ceci reste galement valable pour les tableaux. Il s'agit l de la dclaration implicite des types. On peut toutefois modifier cette coutume en utilisant la dclaration IMPLICIT : IMPLICIT attribut (lettre), attribut (lettre),... attribut peut tre INTEGER, REAL, CHARACTER, COMPLEX, ... La lettre qui suit l'attribut dsignera alors le type de variable dont elle est initiale. Exemple: IMPLICIT LOGICAL(K) Dans ce cas, les variables KIND, K2, KM sont de type logique, c'est dire qu'elles ne peuvent avoir que deux valeurs: .FALSE. ou .TRUE. (remarquer la prsence de 2 points encadrant ces valeurs). Les dclarations de type se placent en tte de programme, avant toute instruction excutable:

Le langage FORTRAN (JJH) - page 15

INTEGER A,B,C,D REAL MAT,MU DOUBLE PRECISION DMAT,DMU Il est normalement inutile de dclarer par exemple la variable INDEX entire, tant donn qu'elle commence par la lettre I. Par contre toutes les variables double prcision, logiques ou complexes doivent tre dclares. Afin de prendre de bonnes habitudes, des langages comme PASCAL et C ncessitant la dclaration pralable de toute variable, on fera de mme en FORTRAN, mme si cela est parfois inutile. CONSEIL : Imposez la dclaration initiale des variables en mentionnant en dbut de programme la dclaration : IMPLICIT NONE. Toute variable non dclare, donc par exemple susceptible d'tre une variable dclare, mais comportant une faute de frappe, sera signale lors de la compilation. Cette prcaution vous vitera quelques heures de ttonnement pour retrouver des erreurs. 3.3.2 Dclaration des variables simples 3.3.2.1 Variables entires INTEGER, INTEGER*1, INTEGER*2, et INTEGER*4 Leur domaine d'utilisation est :

-128 127 (1 octet) pour INTEGER*1 -32 768 32 767 (2 octets) pour INTEGER*2 -2 147 483 648 2 147 483 647 (4 octets) pour INTEGER*4

Au niveau des entres, ces constantes seront interprtes en base 10. Si l'on veut prciser la base, on peut les crire sous la forme : [signe][[base]#]valeur 3.3.2.2 Variables relles REAL ou REAL*4, DOUBLE PRECISION ou REAL*8 Domaine d'utilisation : -3.4028235E+38 -1.1754944E-38, 0, 1.1754944E-38 3.4028235E+38 pour un rel simple prcision

-1.797693134862316D+308 -2.225073858507201D-308, 0, 2.225073858507201D308 1.797693134862316D+308 pour un rel double prcision.

Le langage FORTRAN (JJH) - page 16

La forme d'une valeur relle est : [signe][entier][.[fraction]][Eexposant] [signe][entier][.[fraction]][Dexposant] pour le type REAL*4 pour le type REAL*8

Les rels double prcision, la place mmoire ncessaire est plus importante, les temps de calcul plus longs, mais cette forme est souvent utilise pour des problmes demandant un grand nombre d'oprations successives, tendant faire perdre de la prcision. La dclaration REAL*4 signifie une demande de codage d'un rel sur 4 octets; REAL*8 appelle au codage d'un rel sur 8 octets (double prcision).

La dclaration est faite de la manire suivante : REAL liste de variables exemple : REAL SIGMAXX, SIGMAYY, SIGMAZZ IMPLICIT REAL*8 (D) Aprs la dclaration IMPLICIT, toutes les variables dont le nom commence par D sont en double prcision.

3.3.2.3 Variables logiques LOGICAL ou LOGICAL*1, LOGICAL*2, LOGICAL*4

3.3.2.4 Variables complexes COMPLEX ou COMPLEX*8, DOUBLE COMPLEX ou COMPLEX*16 Les complexes sont des doublets de rels. On les utilise sous la forme suivante : [signe](partie relle, partie imaginaire) Un nombre complexe est reprsent par sa partie relle et sa partie imaginaire: COMPLEX CX CX=(5.0,1.0)

3.3.2.5 Variables de caractres

Le langage FORTRAN (JJH) - page 17

CHARACTER[*n] o 1 <= n <= 32767 Si l'on ignore la longueur de la chane, on pourra crire la dclaration sous la forme : CHARACTER*(*) chaine On pourra dclarer alphanumriques toutes les variables dont le nom commencera par la lettre C en mentionnant en dbut de programme la dclaration suivante: IMPLICIT CHARACTER (C) Dans cette dclaration les chanes sont dclares de longueur 1. Or dans la plupart des cas, notamment dans les programmes orients gestion, il est intressant de pouvoir manipuler des mots. On peut dclarer des variables alphanumriques de longueur diffrente de 1 en crivant: CHARACTER *20 NOM,PRENOM NOM et PRENOM sont deux chanes de caractres pouvant comporter au plus 20 caractres. On peut galement dclarer plusieurs variables comme tant de longueurs diffrentes: CHARACTER*8 NOM1, NOM2, ORIGIN*15, NOM3 Attention dans l'exemple ci-dessus, NOM1, NOM2 ET NOM3 ont une longueur maximale de 8 caractres, et ORIGIN est dfini comme tant de longueur 15. Gnralement, on place la dclaration CHARACTER aprs la dclaration IMPLICIT.

3.3.3 Cas des variables indices Une variable indice est constitue du nom suivi du ou des indices (de 1 7) placs entre parenthses. Ces indices sont des variables entires ou des constantes entires. Les indices des tableaux commencent tous 1, et doivent tre positifs. Attention : Une erreur frquente est l'indiage involontaire par rapport 0. Le compilateur ne peut pas signaler cette erreur, sauf si l'indice est une constante. Penser vrifier la valeur des indices. Ex : ELEM(I,J)=X(I)*J Une variable apparat toujours avec ses indices sauf:

Dans une liste d'entre-sortie o elle dsigne tout le tableau,

Lorsqu'elle est place dans une liste d'arguments d'un sous-programme, dans quel cas elle indique l'adresse du premier lment,

Le langage FORTRAN (JJH) - page 18

Dans une dclaration de type ou de commun, la dimension tant dclare dans une autre instruction.

La rgle de dfinition du type par dfaut est respecte dans le cas d'une variable indice. Attention: Il faut prvenir le compilateur de la place mmoire rserver une variable indice l'aide de l'instruction DIMENSION. Exemple: DIMENSION ELEM(20,20), X(20) On indique au compilateur la valeur maximale que pourra atteindre l'indice. Il est IMPOSSIBLE dans un programme principal de placer une variable dans une instruction de dimensionnement, comme par exemple: DIMENSION A(N,N), l'allocation mmoire n'tant pas dynamique. Par contre si N a t dfini par paramtrage pralable, cette criture est alors possible. Il est logique de placer la dclaration de type AVANT la dclaration de dimension, le type de la variable dfinissant la quantit mmoire ncessaire un lment: REAL*8 A DIMENSION A(50) On peut galement condenser: REAL*8 TABL(10) La valeur d'un indice ne peut tre ni ngative, ni nulle. En principe, le programmeur n'a pas se proccuper de la distribution en mmoire des variables, aussi cet aspect sera pass sous silence. Les choses voluant, FORTRAN 90 autorise des rfrences d'indiage quelconques : On peut indiquer au moment de la dclaration des tableaux, les bornes d'indiage. Le FORTRAN 90 gre l'allocation dynamique de mmoire. Elle est particulirement utile pour les grands tableaux. Elle permet d'utiliser au maximum la mmoire disponible. On se reportera au paragraphe Gestion mmoire traitant de l'allocation dynamique de mmoire. 3.3.3.1 Cas des chanes de caractres Forme gnrale de la dclaration : CHARACTER *n a(k1), b(k2), ...

Le langage FORTRAN (JJH) - page 19

ou bien : CHARACTER a(k1)*n1, b(k2)*n2, ... o : a, b, ... sont des noms de variables k1, k2, ... sont des listes d'indices maxi lorsqu'on utilise des tableaux de chanes de caractres. *n nombre de caractres de toutes les chanes qui suivent *n1, *n2 nombre de caractres de la chane qui les prcde directement. Exemple : CHARACTER T*1, Y*3, Z(5)*10 T est un seul caractre Y est une chane de 3 caractres Z est un tableau de 5 chanes de 10 caractres chacune. 3.3.3.2 Groupements de Variables Les dclarations STRUCTURE et RECORD : Les dclarations STRUCTURE et RECORD permettent de composer des ensembles de variables faciles manipuler. Il sagit dun regroupement organis de variables de diffrents types sous une seule appellation. On se reportera au chapitre Gestion de la Mmoire pour une tude de ces dclarations.

3.3.4 Dclaration des sous-programmes Lorsqu'un argument d'appel est une fonction, le processus de passage de paramtre entre la routine appelante et la routine appele n'est pas identique celui du passage de variables. Il faut prvenir le compilateur que tel ou tel argument est un nom de sous-programme ou de fonction, ce qui est fait l'aide d'une dclaration EXTERNAL toujours place dans le programme appelant. La forme gnrale d'une telle dclaration est : EXTERNAL a, b, c, ... a, b, c, .. sont les noms des sous-programmes.

Le langage FORTRAN (JJH) - page 20

4. Programmes et sous-programmes
4.1 Principe gnral Le programme principal et chaque sous-programme sont analyss sparment par le compilateur. Ils peuvent donc figurer soit dans un mme fichier, soit dans des fichiers spars. Il est prfrable de faire un fichier par sous-programme. Au moment de la mise au point de petits programmes, il est plus facile de faire figurer le programme principal et les sous programmes ensemble, puis de les sparer lorsque la compilation et les essais d'excution ont russi. L'diteur de liens ralise la construction globale du programme et des sous-programmes. Il fait galement des tests de compatibilit au niveau des passages de paramtres. Dans le cas o l'on fait figurer dans un mme fichier programme et sous-programmes, le programme principal doit figurer en tte, suivi des sous-programmes, chacun se terminant par END, pour bien dlimiter les blocs. On distingue 4 types de modules :

PROGRAM : Programme principal, tout module dont la premire instruction n'est pas SUBROUTINE, FUNCTION ou BLOCK DATA. Ce module peut comporter comme premire instruction PROGRAM, mais ce n'est pas obligatoire. SUBROUTINE : Ce module est un sous-programme toujours appel par un CALL partir d'un autre module de type programme ou sous-programme. FUNCTION : Ce module est simplement appel par son nom partir d'un autre module. BLOCK DATA : Ce module initialise des variables places dans un COMMON nomm. Se rfrer au chapitre des dclarations.

4.2 Programme principal Un programme comporte 2 parties :


Les dclarations concernant les variables, Les instructions excutables.

On peut placer au dbut du programme l'instruction PROGRAM du programme Nom Cette instruction est facultative, le compilateur n'en a nullement besoin, mais en fin de programme, on feratoujours figurer l'instruction END.

Le langage FORTRAN (JJH) - page 21

Structure globale : PROGRAM nom du programme Dclarations des variables utilises Instructions excutables END Attention : On ne peut pas placer de dclaration aprs une instruction excutable . Arrt du programme : InstructionSTOP Cette instruction est facultative pour une fin normale de programme. Elle signifie fin de l'excution. La main est alors retourne au shell (superviseur). On peut placer des instructions STOP n'importe o dans le programme, mais de prfrence on n'en placera qu'une juste avant l'instruction END Fin du programme : instruction END. L'instruction STOP n'est pas obligatoire. En revanche, l'instruction END permet au compilateur de dlimiter diffrents programme et sous-programmes figurant dans un mme fichier. Si l'on omet l'instruction END la fin d'un module, le compilateur indiquera une erreur. L'instruction END est excutable depuis la version 77 du FORTRAN. Elle remplace l'instruction STOP la fin du programme principal, et l'instruction RETURN la fin d'une fonction ou d'un sous-programme. Conseil : N'utilisez plus les instructions STOP et RETURN Le programme principal se voit assigner le nom _main , aussi si l'diteur de liens vous signale pour le FORTRAN Microsoft, l'absence de _main , le programme principal a tout simplement t oubli. 4.3 Sous-Programmes Il existe en FORTRAN quatre sortes de sous-programmes :

Les fonctions internes, qui ne sont pas rellement des sous-programmes, car intrieurs un programme donn,

Les fonctions qui sont appeles par leur rfrence dans une expression mathmatique et fournissent un rsultat numrique. Elles sont perues comme des variables "furtives".

Le langage FORTRAN (JJH) - page 22

Les fonctions implicites qui font partie du langage. Elles se trouvent dans les librairies du FORTRAN. Ce sont par exemple les fonctions mathmatiques du genre SIN(x), SQRT(x), etc.

Les sous-programmes qui sont appels par un CALL et peuvent fournir plusieurs rsultats. Ces rsultats figurent obligatoirement parmi les paramtres.

4.3.1 Structure d'un sous-programme type SUBROUTINE SUBROUTINE nom(liste de paramtres ) Dclarations des paramtres Dclarations des variables Instructions excutables RETURN END

L'instruction RETURN redonne la main au programme appelant. On peut placer plusieurs instructions RETURN dans un mme module, mais pour des raisons de structuration et de lisibilit, on vitera cette pratique. Faire figurer cette instruction de prfrence la fin du module, ou alors l'oublier, car elle n'est plus ncessaire pour les versions actuelles du FORTRAN. Il faut dclarer les paramtres comme s'il s'agissait de variables. Le compilateur ne rserve pas la place mmoire, puisque ceci a t fait dans un module hirarchiquement suprieur. En fait, quand le nom d'une variable figure simultanment dans la liste des paramtres en entre et dans une dclaration, le compilateur utilise uniquement les informations de type fournies par la dclaration. Paramtres et variables peuvent figurer dans une mme dclaration. Il est prfrable, uniquement pour des raisons de clart du module, de sparer les dclarations des paramtres et des variables. La forme gnrale de l'appel d'un sous-programme du type SUBROUTINE sera : CALL nom du sous-programme (liste de paramtres ) Les paramtres peuvent tre :

des constantes de tous types des expressions arithmtiques ou logiques des noms de fonctions ou de sous-programmes des variable simples ou indices (lments de tableaux) s des noms de tableaux

Le langage FORTRAN (JJH) - page 23

En sortie, le sous-programme peut modifier :


les variables simples les variables indices

Attention : Au moment de l'appel, les paramtres doivent tre identiques en nombre, ordre, type, aux paramtres du sous-programme. Le passage d'un tableau entier comme paramtre, se fait en donnant uniquement son nom, non muni de parenthses et d'indices. Dans ce cas, le tableau doit tre redclar dans le sousprogramme. Exemple d'appel de sous-programme : CALL SPROG(A,MAT,10) Cas o un paramtre est un nom de fonction ou de sous-programme : Lors d'un passage d'arguments, il faut prciser au compilateur la nature des arguments passs (s'agit-il de simples variables ou de fonctions ?). On utilise alors la dclaration EXTERNAL en tte du programme appelant. Exemple : EXTERNAL COS, SIN ... ... CALL INTEG(1., 2., COS, SOM1) CALL INTEG(0., 1., SIN, SOM2) ...

Dans l'exemple ci-dessus, on prcise que COS et SIN ne sont pas des variables, mais des fonctions.

4.3.2 Structure d'un sous-programme du type FUNCTION type FUNCTION Dclarations Instructions nom = ... ! Instruction Retourner en algo RETURN ! Facultatif END nom(liste d'arguments )

Le langage FORTRAN (JJH) - page 24

Remarquer 2 choses :

L'entte avec sa dclaration de type, car une fonction retourne une valeur dont il faut dclarer le type

L'instruction de mise en place de la valeur retourne : (nom = ...). Elle correspond l'instructionretourner resultat de l'algorithmique. L'instruction END dlimite les blocs, et l'instruction RETURN n'est plus obligatoire pour les versions actuelles du FORTRAN. 4.4 Variables et paramtres Un sous-programme ou une fonction peut reprendre des tiquettes et des noms dj utiliss par ailleurs, sans pour autant affecter le comportement du programme. En quelques mots, un sous-programme peut tre gliss aprs n'importe quel autre programme sans prcaution particulire comme par exemple une modification des tiquettes. La communication entre le programme appelant et le sous-programme est assure au moyen des paramtres d'appel et de l'instructionCOMMON . Le passage de paramtres dans la liste se fait par rfrence. Le sous-programme peut donc travailler directement dans la mmoire du programme appelant. Deux variables de mme nom situes dans deux procdures diffrentes seront indpendantes, sauf si elles sont lies par un passage de paramtre, une dclaration COMMON , ou une dclaration EQUIVALENCE . Dans un sous-programme, on utilise deux types de variables : 1. Les variables propres au module: Le compilateur rserve en mmoire la place que ncessitent les variables locales. Il convient donc de les dclarer (surtout quand le type de la variable ne correspond pas avec le caractre initial). En fait, pour une plus grande rigueur de programmation, elles devraient toutes tre dclares. Utiliser la dclaration IMPLICIT NONE pour forcer la dclaration des variables. Les tableaux locaux devront donc tre dclars avec une dimension numrique ou dclars dynamiques. 2. Les paramtres : Ils sont fournis par le module appelant. Leur place mmoire n'est donc plus rserver, le type de passage de paramtre tant par rfrence (par adresse). Le sous-programme travaille donc directement dans la mmoire du programme principal lorsqu'il utilise les paramtres. Mais la dclaration reste cependant ncessaire, elle servira fixer le type de chaque variable s'il peut y avoir ambigut. Une dclaration concernant un paramtre ne provoquera dont pas une rservation mmoire. En ce qui concerne les tableaux, il faut obligatoirement les dimensionner.

Le langage FORTRAN (JJH) - page 25

Le dimensionnement d'un tableau un seul indice ne pose pas de problme, car tous ses lments se suivent en mmoire. La redclaration d'un tel tableau peut se faire comme suit : DIMENSION A(1) Le compilateur ne se proccupe pas de la dimension relle dans ce cas. Tout lment A(I) pourra tre retrouv de manire simple, tant donn la disposition linaire en mmoire des lments. On peut donc dclarer un tableau simple en indiquant qu'il ne contient qu'un seul lment. Le problme est tout autre pour un tableau deux dimensions ou plus. L'accs un lment a(i,j) dpend du nombre de lignes et de colonnes. La dclaration peut alors tre faite en utilisant des variables en indice, mais uniquement dans les sous-programmes. Attention, ces variables doivent galement figurer dans la liste des paramtres. Exemple pour le cas d'une matrice carre passe en paramtre : C Programme principal PROGRAM TOTO C ... DIMENSION A(50,50) N = 50 C ... CALL SPROG(A,N) C ... END C Sous-programme SUBROUTINE SPROG(B,M) DIMENSION B(M,M) C ... RETURN END

Attention M devra tre rigoureusement identique la valeur de la dimension dclare dans le programme principal. Dans la liste des paramtres, les bornes des tableaux doivent prcder les tableaux auxquels elles sont associes.

Ex: Calcul d'une intgrale par la mthode des trapzes. L'intgrale s'exprime sous la forme: x 1 ( f ( a ) + f (b)) + f ( a + ix ) 2 Le calcul de l'intgrale est effectu par une fonction que l'on appellera TRAP. Cette fonction pourra tre compile sparment et lie au programme appelant au moment de l'dition des liens.

Le langage FORTRAN (JJH) - page 26

Le programme qui suit sera appel PROG.FOR: FUNCTION GAUS(T) GAUS= EXP(-T*T/2.) RETURN END c EXTERNAL GAUS c WRITE (*,*) 'Donner EPS1 et EPS2...' READ (*,*) EPS1,EPS2 Y=TRAP (-10.,10.,GAUS,EPS1) Z=TRAP (-10.,10.,GAUS,EPS2) WRITE(*,10) Y,Z FORMAT (2F12.4) END

10

On peut dissocier le module fonction, et le compiler sparment sans problme particulier. On pourra essayer de dplacer la dclaration EXTERNAL avant la fonction et surveiller les messages d'erreur qui ne manqueront pas d'apparatre. Si l'on oublie de mentionner GAUS comme tant externe, la fonction TRAP ne recevra pas les donnes ncessaires au calcul de la fonction GAUS et le programme "plantera", mme si aucun message d'erreur n'est apparu durant la compilation ou l'dition des liens. Comme dj dit, on aura mme intrt compiler sparment la fonction d'intgration par la mthode des trapzes judicieusement appele TRAP() et la runir au programme appelant seulement au moment de l'dition des liens (LINK ou ld). Si l'on dispose d'une foule de petits utilitaires, on aura certainement avantage se crer sa propre librairie de fonctions et sousprogrammes l'aide d'un libraire, mais ceci est une autre histoire... La fonction TRAP(), qui sera nomme TRAP.FOR est donne ci-dessous. On la compilera sparment: FUNCTION TRAP(A,B,F,DX) c================================================== c A et B sont les bornes d'integration c F est la fonction a integrer c DX est le pas de l'integration c================================================== c N=(B-A)/DX-.5 c N est le nombre de pas necessaires (entier >= 1) TRAP=(F(A) + F(B))/2. X=A c DO 10 I=1,N X=X+DX TRAP=TRAP+f(X) 10 CONTINUE TRAP=TRAP*DX RETURN

Le langage FORTRAN (JJH) - page 27

END

Le lecteur compilera les diffrentes parties sparment, puis essaiera de les rassembler en un seul bloc pour les compiler en une seule fois. Prendre soin de noter les diffrences au niveau de la programmation. A titre d'exercice, refaire la manipulation en adoptant la mthode de SIMPSON. Le FORTRAN Microsoft est fourni avec un environnement de dveloppement. Il permet notamment la gestion de projet, c'est dire le dveloppement de programmes comportant des modules distincts. On pourra se reporter au fascicule relatif lenvironnement de dveloppement.

Le langage FORTRAN (JJH) - page 28

5.

Algorithmique et FORTRAN

5.1 Noms de blocs En algorithmique, on dcrit les programmes l'aide de diffrents modules. Ces modules sont des programmes, des sous-programmes ou des fonctions. Ils sont dlimits par les dclarations de dbut et de fin. Les dclarations des variables et paramtres suivent obligatoirement la dclaration de dbut de module et prcdent toute instruction excutable. Attention : Une erreur frquente signale par le compilateur est l'apparition d'une dclaration aprs une instruction excutable. 5.2 Dclarations 5.2.1 Les dclarations de modules Elles sont dj connues : PROGRAM, FUNCTION, SUBROUTINE, BLOCK DATA 5.2.2 Les dclarations de type Elles sont utilises aussi bien pour les variables locales que pour les paramtres. Citons pour mmoire les plus frquentes : LOGICAL, CHARACTER, INTEGER, REAL, COMPLEX, RECORD 5.2.3 les dclarations d'agencement mmoire Ce sont les dclarationsEQUIVALENCE, COMMON, DIMENSION, STRUCTURE, ALLOCATABLE.. . Elles influent l'organisation en mmoire des variables. 5.3 Constructions 5.3.1 Constructions squentielles 5.3.2 Constructions alternatives 5.3.2.1 Si... Alors... Sinon... Fin Si} L'action conditionnelle simple: l'instruction IF. Le rsultat d'un test IF est logique. l'action suivant le test est donc soit ignore, soit excute. Le test simple se prsente sous la forme suivante: IF (expression rsultat logique) instruction Si l'expression rsultat logique donne un rsultat vrai, alors l'instruction qui la suit est excute, sinon elle est ignore. Exemple :

Le langage FORTRAN (JJH) - page 29

IF(I.GE.N) STOP 1 Cependant, il arrive qu'une instruction soit insuffisante. Pour viter des blocs d'instructions disparates dans un programme, on dispose de le squence .... THEN / ENDIF IF THEN marque le dbut d'une squence d'instructions dlimite par l'instruction ENDIF Exemple : IF(I.LE.N) THEN I=I+1 MOT='' ENDIF On l'utilise donc sous la forme: IF (Expression rsultat logique) THEN Squence d'instructions ENDIF Un enrichissement complmentaire: ELSE (sinon). L'algorithme d'utilisation est: Si (expression vraie) alors faire: Sequence 1 Sinon faire: Sequence 2 Fin de la boucle conditionnelle.

Il s'agit l d'une squence alternative. On peut donner comme exemple: READ(*,*) N1, N2 IF (N2.EQ.0) THEN WRITE(*,*) 'ATTENTION, LE DIVISEUR EST NUL' ELSE WRITE(*,*) 'LE QUOTIENT DE', N1,'PAR',N2,'VAUT',N1/N2 ENDIF

On peut galement imbriquer les constructions alternatives. 5.3.2.2 Squence Cas o La squence cas o existe en FORTRAN 90 sous la forme suivante :

Le langage FORTRAN (JJH) - page 30

SELECT CASE (selecteur) CASE (Expr.1) squence 1 CASE (Expr.2) squence 2 ... [CASE DEFAULT squence dfaut] END SELECT Dans ce cas, les expressions peuvent couvrir diffrentes formes. On peut combiner des intervalles de valeur dans un cas o : CASE (10:14, 'A':'Z', '_') Si le slecteur possde une valeur comprise entre 10 et 14, ou entre les codes ASCII de A et Z ou est gal au code ASCII de _, la squence suivant l'instruction CASE sera excute. 5.3.3 Constructions itratives 5.3.3.1 Boucle Pour... Fin Pour Une boucle est une suite d'instructions que le programme va parcourir un certain nombre de fois. Le mot-cl d'une boucle est: DO Syntaxe: DO tiquette I = N1,N2,INCR .... tiquette CONTINUE Les lments d'une boucle DO sont : tiquette : Elle dtermine l'tendue de la boucle. Souvent elle pointe l'instruction CONTINUE, mais ceci n'est plus obligatoire. I : C'est le compteur. Cette variable doit obligatoirement tre entire. Il s'incrmentera de 1 chaque bouclage, partant de N1 et s'arrtant la valeur N2. N1 et N2 : Bornes du compteur de boucle. INCR : Un compteur de boucle peut voluer non seulement par incrment de 1, mais aussi se dcrmenter, ou voluer par pas entiers constants, mais quelconques. Cet lment est facultatif. Son absence sous entend un incrment de 1.

Attention, les boucles multiples doivent tre imbriques et les indices diffrents. Exemple d'utilisation d'une boucle

Le langage FORTRAN (JJH) - page 31

boucle elementaire DO 10 I = 1, 10 WRITE(*,*) I CONTINUE

10

c lecture simple d'un tableau dans un fichier sur unite c 7 DO 100 I = 1,L DO 50 J = 1,M READ(7,*)A(I,J) CONTINUE CONTINUE

50 100

On peut galement trouver la boucle Pour sous la forme : DO index = min, max [,pas] instructions ENDDO Dans les boucles do l'index peut tre un rel ou un entier. Mais pour des raisons de purisme, on n'utilisera que des index entiers.

5.3.3.2 Boucle Tant... Fin Tant Que Cette boucle traduit la construction suivante : Tant Que condition vraie faire Instructions rpter Fin Tant Que. On peut la trouver sous deux formes, quand elle existe : DOWHILE (expression conditionnelle) instructions ENDDO ou bien : WHILE etiquette (expression conditionnelle) instructions xx CONTINUE

Le langage FORTRAN (JJH) - page 32

Cette construction n'existe pas sur tous les compilateurs. On peut alors la crer en se basant sur les boucles Itrer :

Tant Que (condition pour rester dans la boucle) Instructions Fin Tant que est quivalent : Iterer Sortir si (condition de sortie de boucle) Instructions Fin Iterer

On la traduira en FORTRAN par une boucle Itrer : C et1 Tant que non condition de sortie IF (condition de sortie) GOTO et2 ... Instructions de boucle ... GOTO et1 CONTINUE Fin Tant que

et2 C

et1 et et2 sont des tiquettes numriques Les commentaires sont utiles pour mettre en vidence la construction.

5.3.3.3 Boucle Faire ... tant que ou jusqu' ce que La construction Faire ... Tant Que n'existe pas en FORTRAN. Dans ce cas, il conviendra galement de la construire l'aide des instructions GOTO et IF: Faire Instructions de boucle Tant que condition vraie En FORTRAN : C Faire

Le langage FORTRAN (JJH) - page 33

et1 ...

CONTINUE instructions ... IF (condition vraie) GOTO et1 Tant Que condition vraie

5.3.3.4 Boucles indtermines ou boucles ITERER Il est possible en, FORTRAN 90, d'crire des boucles iterer gnralises. La condition de sortie se posera alors sous la forme : IF(condition de sortie) EXIT La boucle suivante : DO WHILE(I .LE. 100) sequence END DO devient alors : DO IF(I .GT. 100) EXIT sequence END DO

Le langage FORTRAN (JJH) - page 34

6.

Les Entres-Sorties

6.1 Instructions de lecture et d'criture simples 6.1.1 Gnralits Elles revtent un caractre important, car elles permettent la communication avec l'utilisateur ou avec des units particulires comme les MODEMS (liaisons tlphoniques), fichiers sur disque, ou sur des consoles particulires. Quatre questions essentielles se posent pour cette opration: 1. 2. 3. 4. Dans quel sens (entre ou sortie)? Sur quel priphrique? Faut-il une conversion, un formatage? Echanger quoi?

Une entre de donnes correspond l'instruction READ, une sortie WRITE, comme nous avons dj pu le constater. Le fortran attribue chaque priphrique un numro d'unit logique. Fortran attribue le caractre * la console. Le format d'dition qui peut-tre considr comme tant la mise en forme est conditionn par l'instruction FORMAT qui est rfrence par une tiquette. L'instruction d'entre-sortie est suivie de la liste des donnes transmettre. Exemple: READ( unit logique, tiquette du forma t) liste de variables WRITE( unit logique, tiquette du format ) liste de variables Les assignations standard des units logiques varient selon le type de compilateur. Pour le FORTRAN Microsoft, elles sont:

* ou Astrisque, reprsente la console 0 Reprsente initialement la console, mais peut galement reprsenter un fichier sur le disque 5 Reprsente initialement le clavier 6 Reprsente initialement l'cran

La constitution des formats sera vue plus loin. On peut utiliser le signe * pour dsigner l'unit logique standard qui est la console et le FORMAT libre ou automatique. C'est gnralement ce que fera le dbutant, ou lorsque l'on veut crire rapidement un programme.

Le langage FORTRAN (JJH) - page 35

Exemples de lecture et d'criture standard : READ(*,*)A,B,C WRITE(*,*)A,B,C

En conclusion, l'utilisation des instructions READ et WRITE standard est courante lors de la ralisation premier jet d'un programme.

6.1.2 Instruction de lecture La forme gnrale simple d'un ordre de lecture est : READ( constante entire ,*) { liste des variables destination La constante entire dsigne le fichier source d'o proviennent les donnes. Rappelons que le systme considre galement les priphriques (console) comme tant un fichier dj ouvert. Cette constante est comprise entre 1 et 99. Voir le paragraphe prcdent pour les assignations standard. A chaque ordre READ, une nouvelle ligne du fichier lire est examine. Le signe * signifie que les valeurs lire peuvent avoir t crites sans contrainte de cadrage et de prsentation. Il suffit de faire apparatre les donnes dans l'ordre de lecture, et de les sparer par des blancs, tabulations, ou par des virgules. On peut cependant effectuer des lectures sur des prsentations plus complexes, mais dans ce cas, il faut utiliser une rfrence une ligne FORMAT la place de l'toile. La liste des variables dfinit celles qui seront affectes lors de l'opration de lecture, les valeurs tant attribues dans l'ordre de l'apparition des variables. Les donnes entres devront tre du mme type que les variables destination. Attention : Lorsque l'on utilise une entre formate, les caractres blancs sont lus comme tant des zros, ce qui peut avoir de graves consquences lorsque ces blancs sont situs aprs les chiffres exprims . Exemple : On fait une lecture avec la spcification I4 (voir dans le paragraphe FORMAT) (Nous dsignerons un blanc par le caractre b) 1 2 3 4 b 1 2 b

Le langage FORTRAN (JJH) - page 36

Au lieu de lire 12 comme espr, on lit 120 ! On prfrera le format libre obtenu avec *.

6.1.3 Instruction d'criture La forme gnrale de l'ordre d'criture au format standard est : WRITE( constante entire ,*) liste de donnes Les donnes sont des constantes ou des variables spares par une virgule. A chaque instruction WRITE, une nouvelle ligne est crite sur le fichier destination. Le fichier destination est repr par une constante entire (voir l'instruction READ). Le signe * signifie qu'une prsentation standard automatique est dsire (FORMAT standard). Il est utilis pendant la mise au point des programmes. Lors de la finition et de l'amlioration de la prsentation, l'instruction d'criture sera toujours rfrence une ligne FORMAT. Pour une sortie formate de rsultats, on utilisera la forme suivante : WRITE( numro unit, tiquette ligne FORMAT ) liste variables Exemple : IMP=2 WRITE (IMP,100) I,J,A,B FORMAT (2I4,F12.4,3X,E15.8)

100

On peut galement utiliser une forme plus condense, mais identique : IMP=2 WRITE (IMP,'(2I4,F12.4,3X,E15.8)') I,J,A,B

6.1.4 Formats de lecture-criture Les entres sorties peuvent se faire en format libre, ou rfrences des lignes FORMAT. Ces lignes indiquent en fait un canevas suivre pour la prsentation des rsultats. Les lignes FORMAT contiennent les spcifications de conversion, des messages, des commandes d'imprimante ou de gestion simple du curseur. Elles peuvent se placer n'importe o dans le programme, mais on les placera de prfrence la fin du module, juste avant l'ordre END.

Les spcifications de conversion sont de la forme :

Le langage FORTRAN (JJH) - page 37

nIm : Cette spcification s'applique aux variables entires. m indique le nombre de caractres imprimer, ou le nombre de caractres lire sur le fichier. n reprsente le nombre de rptitions de cette spcification. Dans l'exemple prcdent, 2I4 s'applique aux variables I et J; ces quantits tant imprimes avec un maximum de quatre chiffres. On aurait pu crire la ligne FORMAT de la manire suivante: 100 FORMAT (I4, I4, F12.4, 3X, E15.8)

nFl.d : Cette spcification s'applique aux donnes relles. n garde le mme rle que prcdemment. l reprsente le nombre de caractres maximal, y compris le signe et le point. d reprsente le nombre de chiffres imprimer aprs la virgule. Ex: Soit le caractre -123.4567 imprimer. Nous obtiendrons: F9.4 F11.4 F8.4 F13.6 F6.0 -123.4567 bb-123.4567 ******** erreur bb-123.456700 b-123.

Dans le morceau de programme prcdent, F12.4 s'applique la variable A.

nEl.d : Lorsque l'on ne connat pas l'ordre de grandeur de la valeur, il est prfrable de demander en impression la notation scientifique. A l'affichage apparat un E suivi de l'exposant de la puissance de Dix. Il faut que l soit >= d+7. Exemple : pour obtenir un affichage du type 0.xxxx, on utilise le format passe-partout E15.8. nDl.d : Est l'quivalent du prcdent, mais pour des quantits donnes en double prcision. La formule passe-partout serait: D23.16. nGl.d : Recouvre I, F, E ou D. la sortie se fait dans le format convenant le mieux la valeur. Pour les nombres complexes, on emploie deux spcifications de type F, E, ou G. nAl : Permet la manipulation de chanes de caractres. l reprsente le nombre de caractres afficher. nX : Insre n blancs ou permet de sauter n caractres la lecture. nH<Caractres> n dsigne le nombre de caractres et Caractres est une chane de n caractres directement accole H.

Le langage FORTRAN (JJH) - page 38

Ex : Supposons que les variables A et B valent respectivement 3.14159 et 9.81. Les lignes de programme suivantes: 100 WRITE (IMP,100) A,B FORMAT (8H*** A= ,F5.2,3X,3HB= ,F5.2)

donneraient comme rsultat l'imprimante: *** A= 3.14 B= 9.81 On veillera ce que n reprsente la longueur exacte de la chane de caractres sous peine de modifier compltement les formats d'dition suivants s'ils existent. Une mauvaise valeur provoquera certainement un message d'erreur. Le caractre / figurant dans un format provoquera un changement de ligne. Ex : 10 WRITE(IMP,10) A,B FORMAT (I5 / F12.5)

On peut rpter certains caractres en procdant de la manire suivante: FORMAT (1X,19H*******************/) FORMAT (1X,19(1H*)/) peut tre remplac par:

o 19 est un multiplicateur.

Certains compilateurs autorisent l'usage du signe \$ qui empche le passage la ligne suivante la fin d'une instruction WRITE. Le fait que parfois une instruction format contienne plus de spcifications que ncessaire ne gne pas. Seules seront utilises dans ce cas les premires. Si l'inverse, le nombre de spcifications est trop court, le format est parcouru une seconde fois, voire plus encore. En ce qui concerne l'impression, uniquement pour certains compilateurs, le papier dans l'imprimante peut tre contrl en utilisant les caractres suivants:

+ provoque une surimpression 1 fait aller la page 0 fait sauter une ligne

Tout autre caractre fait aller la ligne. Ainsi si l'on veut imprimer RESULTATS DU CALCUL , en crivant 10 WRITE (IMP,10) FORMAT (19HRESULTATS DU CALCUL)

fait aller la ligne(le premier caractre est diffrent de +,1,0), et ce caractre est mang!:

Le langage FORTRAN (JJH) - page 39

ESULTATS DU CALCUL Il aurait fallu provoquer un saut de page et crire le titre au dbut de la nouvelle page de la manire suivante: 10 FORMAT (20H1RESULTATS DU CALCUL)

6.2 Echanges avec les fichiers 6.2.1 Dfinition de fichier Il sera intressant d'envoyer certains rsultats dans des fichiers, pour une utilisation ultrieure par un programme diffrent. Ces fichiers seront soit des fichiers d'entre, soit des fichiers de sortie. Lorsque les rsultats d'un programme sont nombreux, il est agrable de pouvoir les consulter dans un fichier, l'aide d'un diteur de texte. Le fichier dans ce cas l, sera un fichier texte, accs squentiel. On utilise souvent un fichier rsultat pour passer des donnes un autre programme de posttraitement. Ce cas peut alors tre assimil une forme particulire de passage de paramtres. 6.2.2 Ouverture d'un fichier OPEN ([UNIT=]unite [,ACCESS=acces] [,BLANK=blanks] [,ERR=etiquette] [,FILE=fichier] [,FORM=format] [,IOSTAT=erreur] [,RECL=lg_rec] [,STATUS=status])

Notations : les spcifications entre crochets sont facultatives. Une instruction standard d'ouverture de fichier a gnralement la forme suivante :

OPEN(unite, FILE = 'nom du fichier', STATUS = 'OLD' 'NEW' 'UNKNOWN' ) Chaque paramtre peut apparatre dans un ordre quelconque. Si l'on omet UNIT, la valeur unit doit apparatre en premier. 6.2.2.1 Description de chaque paramtre unit : nombre entier qui sera choisi entre 5 et 20, de prfrence suprieur 10. Ce sera le numro d'accs au fichier. Ce numro est arbitraire, mais il sera rserv ce fichier durant toute la dure de son ouverture.

Le langage FORTRAN (JJH) - page 40

acces : 3 types d'accs seront possibles. 'SEQUENTIAL' par dfaut, 'DIRECT' ou 'APPEND' (pas implment sur tous les compilateurs). blanks : Option qui permet d'valuer les espaces comme tant 'NULL' (par dfaut) ou 'ZERO' etiquette : Etiquette d'une ligne instruction qui sera appele en cas de problme fichier : Expression alphanumrique signifiant le nom du fichier. format : Expression qui sera soit 'FORMATTED', soit 'UNFORMATTED'. Si l'accs est squentiel, le format par dfaut sera 'FORMATTED'. erreur : Variable entire, nulle si pas d'erreur, ngative si fin de fichier rencontr, valeur positive non nulle figurant l'erreur si problme. lg-rec : Expression entire prcisant le nombre de bytes d'un enregistrement pour un fichier accs direct. Ignor pour un squentiel. status : Peut tre 'OLD', 'NEW', 'SCRATCH', 'UNKNOWN', 'APPEND'. OLD : Le fichier doit dj exister NEW : Le fichier est crer . SCRATCH : Le fichier est dtruit la fin du programme. APPEND : Le fichier existe dj, et on se place la fin pour rajouter des donnes. UNKNOWN : NEW ou OLD si le fichier existe ou non. Exemples : c Ouverture d'un fichier existant deja OPEN (11, FILE='DONNEES.DAT') ... c Ouverture d'un nouveau fichier pour y placer des c resultats OPEN (12, FILE='RESULT.DAT',ACCESS = 'SEQUENTIAL', + STATUS='NEW')

6.2.3 Fermeture d'un fichier La fermeture d'un fichier se fait automatiquement lorsque le programme se termine normalement. Ne pas utiliser le signe * dans l'instruction de fermeture de fichier. Syntaxe : CLOSE([UNIT=]unite

Le langage FORTRAN (JJH) - page 41

[,ERR=etiquette] [,IOSTAT=erreur] [,STATUS=status])

Si l'on omet de mentionner UNIT=, le numro de unit doit figurer en premier. L'ordre des paramtres n'a pas d'importance. Description de chaque paramtre : unit : Nombre entier spcifiant l'unit externe. Aucune erreur ne sera signale si cette unit n'a pas t ouverte. etiquette : tiquette d'une instruction excutable dans le mme programme. Cette instruction sera excute si une erreur d'accs au fichier se produit. erreur : Variable entire ou lment de tableau qui se verra affecter le numro d'erreur si celle-ci se produit. status : Peut tre 'KEEP' (conserver) ou 'DELETE' (effacer). Les fichiers ouverts sans nom auront un status par dfaut 'DELETE' qui signifie effacer aprs fermeture. Ces fichiers sont considrs comme fichiers temporaires. Le status par dfaut pour les autres fichiers sera 'KEEP'.

Exemple : c fermeture et effacement du fichier 8 CLOSE(8, STATUS='DELETE) 6.2.4 Enregistrement "fin de fichier" ENDFILE unite ou ENDFILE ([UNIT=]unite [,ERR=etiquette] [,IOSTAT=erreur]) Les paramtres sont identiques ceux dj vus pour OPEN et CLOSE. Aprs avoir crit l'enregistrement fin de fichier, L'instruction ENDFILE empche tout transfert supplmentaire de donnes si l'on n'a pas auparavant utilis l'instruction REWIND ou BACKSPACE. Lorsque l'on opre sur un fichier accs direct, les enregistrements situs aprs l'enregistrement fin de fichier seront effacs. Exemple d'utilisation sur un fichier ouvert sur le numro 7: WRITE (7,*) resultat ENDFILE 7 REWIND 7

Le langage FORTRAN (JJH) - page 42

READ (7,*) donnee

6.2.5 Positionnement d'un enregistrement en arrire sur un fichier BACKSPACE unite ou BACKSPACE ([UNIT=]unite [,ERR=etiquette] [,IOSTAT=erreur]) Les paramtres ne demandent pas d'explication particulire. Exemple d'utilisation pour le fichier 7 : BACKSPACE 7 ou BACKSPACE (7) ou UNITE = 7 BACKSPACE UNITE ou BACKSPACE (UNIT=unite, ERR=100, IOSTAT=code_erreur)

6.2.6 Repositionnement d'un fichier sur le premier enregistrement

REWIND unit ou REWIND ([UNIT=]unit [,ERR=etiquette] [,IOSTAT=erreur])

Cette commande rappelle les inscriptions que l'on peut voir sur un magntophone non francis. Elle provient de l'poque o les mmoires de masse de type disque n'existaient pas encore. Les bandes magntiques servaient alors de moyen de stockage de l'information. Ce moyen est encore utilis pour stocker des donnes lorsque elles sont trop nombreuses pour pouvoir figurer sur un disque dur. La lecture est plus lente.

6.2.7 Lecture des particularits d'une unit ou d'un fichier INQUIRE ([UNIT=]unit ou FILE='nom_de_fichier' [,ACCESS=acces] [,BLANK=blanks] [,DIRECT=direct] [,ERR=tiquette] [,EXIST=exist] [,FORM=forme]

Le langage FORTRAN (JJH) - page 43

[,FORMATTED=formatte] [,IOSTAT=erreur] [,NAME=nom] [,NAMED=nomme] [,NEXTREC=nextr] [,NUMBER=numero] [,OPENED=ouvert] [,RECL=lg] [,SEQUENTIAL=seq] [,UNFORMATTED=unf])

6.2.7.1 Description des paramtres acces : Variable alphanumrique qui contiendra au retour une des chaines de caractres suivantes : 'SEQUENTIAL' 'DIRECT' blanks : Variable alphanumrique qui se verra affecter au retour soit 'NULL', soit 'ZERO'. direct : Variable alpha, qui contiendra selon le type d'accs 'YES' pour direct ou 'NO' ou 'UNKNOWN'. exist : Variable logique qui contiendra .TRUE. si le fichier existe, sinon .FALSE.. forme : Variable alpha. Si l'unit ou le fichier est connect une entre-sortie formate, forme contiendra 'FORMATTED', sinon 'UNFORMATTED' formatte : Variable alpha, rponse la question FORMATTED?. Contiendra 'YES', 'NO', 'UNKNOWN'. nom : Variable alphanumrique qui contiendra le nom du fichier connect unit. nomme : Variable logique. .FALSE. si le fichier est un fichier temporaire (sans nom ou scratch). nextr : variable entire, numro du prochain enregistrement pour un fichier accs direct. numero : Variable entire qui contiendra le numro de l'unit connect au fichier dont le nom devra tre spcifi. ouvert : Variable logique qui sera .TRUE. si un fichier est effectivement connect l'unit prcise. lg : Variable entire qui contiendra le nombre d'octets d'un enregistrement pour un fichier accs direct.

Le langage FORTRAN (JJH) - page 44

seq : Variable alpha. Contient 'YES' si le fichier prcis est accs squentiel. unf : Variable alpha. Contient 'YES' si le fichier est de forme non formate.

Exemple d'utilisation : Vrification de l'existence d'un fichier. CHARACTER*12 nom c verification de l'existence : INQUIRE(FILE=nom, EXIST=existe) LOGICAL existe

c entree du nom de fichier 100 WRITE(*,*)'Donnez le nom du fichier :' READ(*,*) nom IF(.NOT.existe) THEN WRITE(*,*)'Le fichier n existe pas.' GOTO 100 END IF

6.2.8 Lecture et criture des donnes dans un fichier La lecture et l'criture de donnes dans un fichier se fait avec les mmes instructions que pour la console : READ( unit, format) liste de variables WRITE( unit, format) liste de variables L'unit utilise sera le numro affect au fichier lors de l'ouverture de celui-ci. 6.3 Impression de rsultats La plupart des systmes d'exploitation considrent les imprimantes comme un fichier possdant un nom gnrique, comme PRN pour MS-DOS, ou WINDOWS. Aussi, si l'on dsire imprimer des rsultats directement sur une imprimante, il faut l'ouvrir comme un fichier et y crire les donnes comme d'habitude : ... OPEN(9,FILE='PRN') WRITE(9,*)'Ce texte est destine a l imprimante' ... 6.4 Structures des fichiers et des enregistrements

Le langage FORTRAN (JJH) - page 45

L'accs des donnes rassembles dans un fichier dpend de la forme de stockage et du mode d'accs. On accde des donnes d'un fichier par groupe de donnes. Ce groupe est appel "enregistrement". les mthodes de stockage des donnes dans le fichier peuvent tre :

Formates non formates Binaires

On peut accder un enregistrement selon deux modes :


Squentiel Direct

L'accs squentiel un enregistrement N implique la lecture des N-1 enregistrements prcdents, alors que l'accs direct permet d'accder en lecture comme en criture n'importe quel enregistrement. Attention dans ce cas, la longueur d'un enregistrement doit tre connue et constante. On peut combiner les mthodes de stockage et les modes d'accs, ce qui donne 6 faons de procder. 6.4.1 Les enregistrements formats On cre des fichier formats en spcifiant l'ouverture FORM='FORMATTED'. Les enregistrements sont alors stocks sous forme ASCII, c'est dire directement affichables. Les nombres, utiliss en mmoire sous forme binaire, sont convertis en forme ASCII. Chaque enregistrement se termine par les caractres ASCII Retour chariot et Saut de ligne (CR et LF). 6.4.1.1 Les fichiers squentiels formats Les fichiers squentiels formats comportent des enregistrements qui doivent tre lus de faon squentielle, chaque enregistrement est de longueur quelconque. Attention, il faut s'assurer, lors de la lecture de bien pouvoir lire un enregistrement complet. Chaque enregistrement est spar par une suite CR LF code ASCII 0DH, 0AH. 6.4.1.2 Fichiers formats accs direct Tous les enregistrements possdent la mme longueur. Chaque enregistrement peut directement tre lu ou crit, sans passer par les prcdents enregistrements. La longueur d'un enregistrement est spcifie au moment de l'ouverture par RECL=valeur . En ralit, il faut ajouter 2 caractres CR et LF, qui servent de sparateur. Si l'on crit un enregistrement de longueur infrieure celle spcifie, il est automatiquement combl par des espaces typographiques (code ASCII 32). L'criture du 7me enregistrement suivi du 5me se fera par exemple ainsi :
OPEN(13,FILE='FORDIR',FORM='FORMATTED',ACCESS='DIRECT', RECL=15) ... WRITE(13,'(A)',REC=7) 'Coucou' WRITE(13,'(I6)',REC=5) 12756

Nous aurons sur le disque :

Le langage FORTRAN (JJH) - page 46 ... enregistrement 4 (17 octets) 12756 6(17octets)Coucou [CR/LF]... [CR/LF]enregistrement

La lecture se fait directement, de faon identique. Il est inutile de lire tous les enregistrement prcdant l'enregistrement souhait. 6.4.2 Les enregistrements non formats. Les enregistrements non formats contiennent les donnes brutes, sous une forme identique que celle utilise en mmoire. Par exemple, un rel simple prcision occupe 4 octets en mmoire. Ecrit dans un fichier sous la forme non formate, il occupera galement 4 octets, mais il est inutile de chercher le relire au moyen d'un diteur de texte. Dans un fichier enregistrements formats, un rel occupe autant d'octets que de caractres ncessaires pour le reprsenter, tant donn qu'il sera exprim sous la forme ASCII. Donc, premier avantage : un gain de place certain. La transcription binaire/ASCII aussi bien au niveau de la lecture que de l'criture demande galement du temps. Ce temps est conomis dans le cas des enregistrements non formats, puisque la forme de stockage est identique celle du stockage en mmoire. Les changes de donnes sont alors beaucoup plus rapides. 6.4.2.1 Les enregistrements squentiels non formats Les fichiers de ce type sont particuliers au FORTRAN. Les fichiers sont organiss en blocs de 130 octets ou moins. Ces blocs sont appels "blocs physiques". Chaque bloc comporte les donnes ou une partie des donnes que l'on a enregistres, encadres deux octets contenant la longueur utile du bloc. Bien entendu, le compilateur se charge de mettre en place et jour ces 2 octets. La figure suivante indique la structure d'un bloc physique. /L/.....bloc...../L/ Lorsque l'on dsire enregistrer un ensemble de donnes dpassant la capacit maximale d'un bloc physique, le compilateur place les octets dencadrement L 129 pour indiquer que le bloc physique courant n'est pas termin. Structure d'un enregistrement logique de plus de 128 octets : /129/ ... 128 octets de donnes.../129//12/ ...12 octets de donnes.../12/ Cette opration de partitionnement en blocs de 128 octets est transparente pour le programmeur. En effet, il peut crer des enregistrements de longueur quelconque. Les fichiers squentiels non formats commencent par un octet dont la valeur est 75 et se terminent par un octet dont la valeur est 130 Exemple d'utilisation de fichier squentiel non format :
CHARACTER XYZ(3) INTEGER*4 IDATA(35) DATA IDATA /35 * -1/, XYZ / 'x','y','z' / c c -1 est encode par FFFFFFFF en hexadecimal c

Le langage FORTRAN (JJH) - page 47 OPEN(33, FILE='SEQNF',FORM='UNFORMATTED') c c c c Le mode sequentiel est obtenu par defaut. On ecrit un enregistrement de 140 octets, suivi par un enregistrement de 3 octets WRITE(33) IDATA WRITE(33) XYZ CLOSE(33) END

Le fichier aura alors l'allure suivante : /75/129/ FF....128 octets FF/129/12/ FF 12 octets FF/12/3/xyz/3/130/ 6.4.2.2 Les fichiers accs direct et enregistrements non formatts Comme tous les fichiers accs direct, l'utilisateur peut accder en lecture ou en criture chaque enregistrement, dans n'importe quel ordre. Ceci impose que la longueur d'un enregistrement est connue et constante, c'est vident. La longueur d'un enregistrement est spcifie dans l'instruction OPEN par RECL= valeur. Exemple de cration de fichier accs direct non format :
OPEN(33,FILE='DIRNF',RECL=10,FORM='UNFORMATTED', + ACCESS='DIRECT') WRITE(33,REC=3).TRUE.,'abcdef' WRITE(33, REC=1)2049 CLOSE(33) END

L'allure du fichier sera la suivante : /01 08 00 00??????/??????????/01 00 00 00 abcdef/ 6.4.3 Les enregistrements binaires Cette forme est la plus recommande, car elle n'est pas propre au FORTRAN. On peut donc relire et crer des fichiers en provenance ou destination d'autres langages. Les fichiers binaires n'ont pas de structure interne particulire. Le programmeur doit donc tre parfaitement au courant de la disposition des donnes dans le fichier. Aucun sparateur ne permet de dlimiter un quelconque bloc ou groupe de variables, sauf si le programmeur dcide d'en placer de son propre gr. Les donnes tant enregistres sous forme binaire, sans sparateur, le gain de place est encore (lgrement) plus important. On prfrera ce type de fichiers pour le stockage d'un nombre important de donnes. Attention, un change de donnes avec d'autres logiciels est plus problmatique, mais, grce aux normes dencodage des valeurs relles par exemple, ces fichiers sont souvent lisibles par d'autres langages. Cependant, pour un transfert de donnes vers un tableur par exemple, il est prfrable de passer par un fichier squentiel format. Pour travailler en mode binaire, il suffit de prciser au moment de l'ouverture FORM='BINARY'. 6.4.3.1 Les fichiers squentiels binaires

Le langage FORTRAN (JJH) - page 48

L'criture et la lecture de fichiers binaires sont rgents par le type des variables. Inutile de prciser une longueur d'enregistrement. Pour accder des donnes enregistres, on relit simplement celles qui ont t places avant, en respectant leur type. Exemple de cration de fichier binaire accs squentiel :
$STORAGE:4 INTEGER*1 BELLS(4) INTEGER IWYS(3) CHARACTER*4 CVAR DATA BELLS /4*7/ DATA CVAR /' is '/,IWYS/'What',' you',' see'/ c On va ecrire 'What you see is what you get!' suivi de 3 beeps OPEN(33,FILE='SEQBIN',FORM='BINARY') WRITE(33) IWYS,CVAR WRITE(33) 'what ','you get!' WRITE(33) BELLS CLOSE(33) END

6.4.3.2 Les fichiers binaires accs direct Il faut spcifier au moment de l'ouverture le type d'accs, ainsi que la longueur d'un enregistrement. Le nombre d'octets lus ou crits dpendent toujours du type de la variable. Contrairement au cas des fichiers non formats, la tentative d'criture d'un enregistrement de longueur suprieure celle dclare par RECL=longueur, ne provoque pas d'erreur, mais dborde sur l'enregistrement suivant. Si l'on ne mentionne pas de numro d'enregistrement (REC=n dans l'instruction d'criture ou de lecture) les accs se font alors de manire squentielle partir de l'enregistrement courant. Exemple de cration de fichier binaire accs direct
$STORAGE:4 OPEN(33,FILE='DIRBIN', RECL=10, ACCESS='DIRECT', +FORM='BINARY') WRITE(33, REC=1)'abcdefghijklmno' WRITE(33)4, 5 WRITE(33, REC=40) 'pq' CLOSE(33) END

Le fichier ainsi obtenu prend la forme : /abcdefghij/klmno?????/04 00 00 00 05 00 00 00??/.../pq????????/

Le langage FORTRAN (JJH) - page 49

7. Traitement de l'information
7.1 Expressions arithmtiques 7.1.1 Dfinition Une expression arithmtique est un ensemble form de constantes, variables et fonctions spares par des oprateurs et des parenthses ; elle est destine fournir une valeur numrique. 7.1.2 Oprateurs + Addition - Soustraction * Multiplication / Division ** Exponentiation Ces oprateurs sont prsents par ordre de priorit croissante. Exemple: TOTAL=TOTHT+TVA Les oprations arithmtiques simples sont values de la gauche vers la droite. Par contre, deux exponentiations successives sont values de la droite vers la gauche.

7.1.3 Type des rsultats obtenus par +, -, *, / Les types sont classs par ordre croissant du rang: 1. 2. 3. 4. 5. 6. INTEGER*2 rang le plus faible INTEGER*4 REAL*4 (REAL) REAL*8 (DOUBLE PRECISION) COMPLEX*8 (COMPLEX) COMPLEX*16 rang le plus lev

C'est l'oprande de rang le plus lev qui fixe le type du rsultat. Une petite exception: Une opration entre un COMPLEX*8 et un REAL*8 gnre un COMPLEX*16 (Il s'agit de la double prcision). Rappelons qu'un complexe est compos d'une partie relle et d'une partie imaginaire et que ces deux parties sont toujours du mme type.

Le langage FORTRAN (JJH) - page 50

7.1.4 Type des rsultats obtenus par l'oprateur puissance On peut rsumer sous la forme d'un tableau le type du rsultat de l'lvation de X la puissance Y :

Exposant Y ! ! ! V

1er oprande X ------------> I R D C I R D C I R D C R R D D D D

7.1.5 Rgle d'homognit Au cours d'un calcul, si les oprandes sont de types diffrents, l'oprande du type le plus faible (occupant le moins de place mmoire) sera converti dans le type de l'oprande le plus fort.

7.2 Traitement des chanes de caractres 7.2.1 Accs une partie d'une chane On peut, si on le dsire, accder une partie d'une chane de caractres en jouant sur les indices suivant le nom de la variable: nom(d:f) "nom" reprsente le nom de la variable d : indique le rang du premier caractre concern (le premier de la chane par dfaut). f : indique le rang du dernier caractre concern. Exemple: CHARACTER*10 MOT MOT='CONTORSION' MOT(5:6) vaut 'OR' MOT(4:) vaut 'TORSION' MOT(:3) vaut 'CON' (excusez...)

Le langage FORTRAN (JJH) - page 51

On peut modifier MOT: MOT(4:5)='VE' Aprs excution de cette instruction, MOT contiendra 'CONVERSION'. L'expression MOT(:4)=MOT(3:6) est interdite, car de part et d'autre du symbole d'affectation figurent en commun MOT(3:4) . Dans cet exemple, il aurait fallu crire: CHARACTER*4 TMOT ... TMOT=MOT(3:6) MOT(:4)=TMOT

Pour mettre une variable alphanumrique blanc, il suffit de lui attribuer la chane de caractres nulle. Si une suite de caractres attribuer est trop longue pour la variable de destination, seuls les premiers sont attribus, dans la limite des places disponibles. 7.2.2 Oprateur de concatnation de chane Il est constitu de deux barres de fraction successives (//). 7.3 Fonctions numriques standard On peut citer les plus usuelles: SIN COS ALOG EXP SQRT ATAN TANH ABS IABS FLOAT IFIX SIGN CHAR ICHAR NINT MOD sinus cosinus logarithme nprien exponentielle racine carre arc tangente tangente hyperbolique valeur absolue d'un rel valeur absolue d'un entier convertit d'entier rel convertit de rel entier transfert de signe conversion du code ASCII en caractre conversion inverse de la prcdente fonction arrondi fonction modulo

Les fonctions incorpores au langage font appel des mots-cl. Exemples :

Le langage FORTRAN (JJH) - page 52

Racine carre : Mot-cl: SQRT X1 = -B + SQRT( B**2 - 4*A*C) Code ASCII d'un caractre : ICHAR('0') donne 48. Rciproquement,CHAR(I) , I tant un entier, renvoie le caractre dont le code ASCII est I (CHAR(48) donnera le caractre 0). Exemple d'utilisation de la fonction CHAR: Emission d'un Bip sonore. On dclare IBELL comme paramtre, et, plus loin dans le programme, on l'envoie la console: PARAMETER (IBELL=7) .... WRITE (*,*) CHAR(IBELL) 7.4 Expressions logiques 7.4.1 Oprateurs de relation arithmtique Une opration de comparaison port sur deux oprandes et donne un rsultat logique. Naturellement, les deux oprandes doivent tre du mme type. On ne peut comparer une variable alphanumrique une variable numrique. Les oprateurs de comparaison sont:

FORTRAN 77 .GT. .GE. .EQ. .NE. .LE. .LT. Remarque: Plus grand que Plus grand ou gal que Egal Diffrent de Infrieur ou gal Infrieur

FORTRAN 90 > >= == != <= <

Le langage FORTRAN (JJH) - page 53

Deux complexes ne peuvent tre que gaux ou diffrents, donc seuls les oprateurs .NE. et .EQ. sont utilisables. On peut galement effectuer des comparaisons sur deux chanes de caractres. Dans ce cas, la comparaison se fait de la gauche vers la droite, caractre aprs caractre. La diffrence est faite ds l'apparition d'un premier caractre diffrent de son homologue en position. C'est alors celui qui possde le code ASCII le plus lev qui sera considr comme suprieur. Signalons que le code ASCII respecte l'ordre alphabtique. Exemple: 'HENRY' est suprieur 'HENRI'

7.4.2 Oprateurs logiques En logique, il n'existe que deux tats: .TRUE. .FALSE. VRAI FAUX

Les oprateurs logiques sont: .NOT. .AND. .OR. .EQV. .NEQV. NON ET OU EQUIVALENCE OU EXCLUSIF

Le lecteur pourra reconstituer la table de vrit. Ordre d'valuation des diverses oprations vues: 1. 2. 3. 4. Oprateurs arithmtiques Concatnation Oprateurs de comparaison Oprateurs logiques

Exemple: I.EQ.0.OR.J.GT.I+3 sera valu comme: (I.EQ.0).OR.(J.GT.(I+3))

7.5 Oprateurs de relations alphanumriques

Le langage FORTRAN (JJH) - page 54

On peut galement comparer deux chanes de caractres entre elles. Les oprateurs seront : .GT., .GE., .EQ., .NE., .LE., .LT. Une chane de caractres est value partir de la valeur en code ASCII des caractres. Dans ce cas, la comparaison se fait de la gauche vers la droite, caractre aprs caractre. la diffrence est faite ds l'apparition d'un premier caractre diffrent de son homologue en position. C'est alors celui qui possde le code ASCII le plus lev qui sera considr comme suprieur. Signalons que le code ASCII respecte l'ordre alphabtique. Exemple: 'HENRY' est suprieur 'HENRI'

Le langage FORTRAN (JJH) - page 55

8. Gestion mmoire
Dclarations COMMON, EQUIVALENCE, ALLOCATE 8.1 Variables globales : La dclaration COMMON La dclaration COMMON tait frquemment utilise pour effectuer un passage de paramtres, avec d'autres effets sur les variables qu'il nest pas forcment judicieux d'exploiter comme par exemple le groupement des variables en mmoire dans l'ordre dfini dans la liste COMMON. Syntaxe de la dclaration COMMON : COMMON /nom1 bloc/liste1 variables/nom2 bloc/liste2...

La dclaration COMMON a donc deux effets principaux :


Elle groupe les variables dans l'ordre de chaque liste,

Elle permet de les rendre visibles (globales) d'un sous-programme pourvu qu'il possde une dclaration COMMON correspondante. Une dclaration COMMON peut donc servir au passage de paramtres.

Le nom de bloc n'est pas obligatoire. Dans ce cas, il s'agit d'un COMMON blanc. Son utilisation est viter. Exemple d'utilisation de COMMON : COMMON /BLK1/A,B,C /BLK2/T,U,I //Z // dfinit un COMMON blanc. Il est impossible de faire figurer dans un COMMON des lments disjoints d'un tableau : COMMON A(1), A(3) n'a pas de sens. On peut grouper les instructions COMMON et DIMENSION : COMMON A(100) quivaut DIMENSION A(100) COMMON A

Le langage FORTRAN (JJH) - page 56

Lorsque le COMMON est utilis pour un passage de paramtres, on le retrouve dans le programme et le sous-programme : C Programme principal ... COMMON /XXX/A,I,T ... CALL SPROG(...) ... END C Sous-programme SUBROUTINE SPROG(...) COMMON /XXX/Z,L,U ... RETURN END On ne peut pas employer dans un COMMON une variable figurant dj dans la liste de paramtres : SUBROUTINE SPROG(A,B,C) COMMON X,Y,C est incorrect ! 8.2 Le partage mmoire : La dclaration EQUIVALENCE La dclaration EQUIVALENCE permet d'affecter plusieurs variables la mme adresse. Sa syntaxe se prsente sous la forme : EQUIVALENCE variables),... Exemple : EQUIVALENCE (A,B,C),(Y,TAB(3)) A, B, C auront la mme adresse mmoire, c'est dire que ces variables ne formeront qu'une. Y aura la mme implantation que le troisime lment de TAB. Si l'on place dans une liste d'quivalence des lments de tableaux distincts : EQUIVALENCE (A(5), B(7)) non seulement A(5) serait gal B(7), mais aussi A(4) B(6), etc. En consquence, la dclaration suivante EQUIVALENCE (A(5),B(7)),(A(1),B(1)) est illicite. (liste de variables),(liste de

Le langage FORTRAN (JJH) - page 57

En couplant les dclarations EQUIVALENCE et COMMON, on peut tendre les quivalences : DIMENSION A(5) COMMON X,Y,Z EQUIVALENCE (Y,A(2)) Nous aurons dans ce cas en plus l'quivalence entre X et A(1), Z et A(3). En suivant cette logique, les dclarations suivantes sont illicites : COMMON A,B EQUIVALENCE (A,B) L'usage de l'instruction EQUIVALENCE permet d'conomiser de la place mmoire. Elle permet galement de "bidouiller" les variables, car on peut dclarer quivalentes des variables de types diffrents. Cette dernire faon de faire est cependant viter si l'on ne sait pas trop ce que l'on fait... 8.3 Variables situes dans la pile : la dclaration AUTOMATIC Le FORTRAN fait appel uniquement des variables statiques, c'est dire que ces variables occupent de la place mmoire durant toute la dure du programme. D'autres langages comme le C procdent de manire diffrente : une variable n'occupe de la mmoire que lorsque le le module dans lequel elle est dclare est en cours dexcution. La variable est place dans ce que l'on appelle "la pile" ou "le tas". L'avantage est immdiat : gain de place mmoire, surtout pour les tableaux. nous sommes en prsence de variable existence "dynamique". On peut suggrer au FORTRAN 90 l'utilisation de ce type de variables l'aide de la dclaration AUTOMATIC. L'usage est le suivant : AUTOMATIC liste de variables Si la dclaration AUTOMATIC apparat seule dans une ligne, toutes les variables qui suivent sont places dans la pile. La dclaration SAVE permet d'introduire des exceptions pour certaines variables. 8.4 Allocation dynamique de mmoire : ALLOCATE 8.4.1 Gnralits La rservation en mmoire de la place occupe par les variables a lieu lors de la compilation. Il est donc IMPOSSIBLE de rserver des tableaux dont on ne connat pas l'avance les dimensions. Par consquent, REAL*8 TABLEAU(L,M) est illicite.

Le langage FORTRAN (JJH) - page 58

On peut cependant trouver ce genre de dclaration dans un sous-programme condition qu'il s'agisse de la dclaration d'un paramtre. Dans ce cas le tableau a dj t cr dans le programme appelant. La dclaration donne alors au compilateur les indications ncessaires pour tre en mesure de recalculer les adresses de chaque lment, et non pour crer la place mmoire. Le FORTRAN offre maintenant une autre possibilit de gestion de la mmoire: L'allocation dynamique de la mmoire. 8.4.2 Dclaration Dans le cas de l'allocation dynamique de la mmoire, il faut toujours dclarer le tableau, mais cette fois, on ne donne aucune dimension prcise, sauf le nombre d'indices de ce tableau. La dclaration doit toujours indiquer le type du tableau (rel, entier, ...) suivie de la mention ALLOCATABLE ainsi que d'une indication donnant le nombre d'indices. La dclaration d'un tableau dynamique prend la forme suivante : type nom [ALLOCATABLE] (:,:,...) Si le tableau risque de dpasser 65536 octets, il faut le dclarer HUGE : type nom [ALLOCATABLE,HUGE] (:,:,...) Ceci n'est valable que pour un compilateur travaillant sous MS-DOS. exemple pour un tableau de rels 3 indices : REAL*8 TAB [ALLOCATABLE] (:,:,:) 8.4.3 Allocation Un tableau cr par allocation dynamique de mmoire autorise un indiage quelconque, donc ne commenant pas forcment 1. Cette possibilit est rarement utile, aussi on pourra consulter le manuel fourni avec le langage pour une utilisation ventuelle. L'allocation de la mmoire se passe en faisant appel la procdure ALLOCATE. On l'utilise comme suit : ALLOCATE(tab1(dim1, dim2,...),tab2(dim3,...),...,STAT=erreur) erreur est une variable entire qui contiendra un code erreur gal 0 si tout s'est bien pass. Cette possibilit est facultative, mais dans le cas d'une omission, la gestion des erreurs est plus difficile. Attention, les tableaux dynamiques ne peuvent pas apparatre dans des dclarations comme AUTOMATIC, COMMON, DATA, EQUIVALENCE, STRUCTURE . Un tableau de structures peut tre du type dynamique. 8.4.4 Libration de la mmoire

Le langage FORTRAN (JJH) - page 59

Lintrt majeur de l'allocation dynamique de la mmoire est la possibilit de la librer pour la raffecter un autre tableau. la libration mmoire se fait l'aide de la procdure DEALLOCATE . L'usage est le suivant : DEALLOCATE(liste tableaux, STAT=erreur) La variable erreur est un entier, elle indique surtout un essai de libration d'une variable n'ayant jamais exist. Exemple : REAL*4 tableau [ALLOCATABLE](:,:) INTEGER dim_x, dim_y, erreur Ouverture du fichier de donnees OPEN(12, FILE='ENTREE.DAT',STATUS='OLD) Lecture des dimensions READ(12,*) dim_x, dim_y Allocation ALLOCATE(tableau(dim_x, dim_y),STAT=erreur) IF(erreur.NE.0) STOP 'Erreur Allocation memoire' Lecture de tous les termes du tableau DO I=1,dim_x READ(12,*)(tableau(I,J),J=1,dim_y) END DO ..... c Liberation memoire DEALLOCATE(tableau)

c c c

8.4.5 Les Structures de variables Dans le cas de descriptions dobjets complexes, par exemple dindividus ou de vhicules, il est souvent ncessaire dutiliser plusieurs types de variables. Par exemple, si lon veut tablir des fiches techniques pour des voitures particulires, on peut tenir compte des caractristiques suivantes : Paramtre Marque Modle Date dachat Puissance Fiscale Masse vide Charge utile Coef. de prix dusage Type Chane de caractres (Maximum 25) Chane de caractres (Maximum 15) Tableau de 3 entiers (x 2 octets) Nombre entier (2 octets) Nombre entier (2 octets) Nombre entier (2 octets) Rel (4 octets)

Si, par exemple, on veut grer un parc de voitures, il serait intressant de grouper ces donnes sur une seule variable, tout en gardant la possibilit daccder individuellement chaque composante. De plus, si cette variable complexe pouvait tre manipule comme un lment

Le langage FORTRAN (JJH) - page 60

de tableau, dans le cadre de la gestion dun vaste parc de vhicules, la manipulation des donnes serait grandement facilite. 8.4.5.1 Dclarations STRUCTURE et RECORD La dclaration STRUCTURE permet de raliser ce groupement. Utilisation de la dclaration : STRUCTURE /nom_structure/ dclarations des lments . . . END STRUCTURE nom_structure : il sagit dun nom arbitraire que lon donne la structure dont la description suit. Attention au choix du nom. Ne pas utiliser de nom de fonctions intrinsques, de variables dj utilises, de types de variables, etc... Dclarations des lments : On dclare les variables qui sont en gnral des variables classiques utilises, comme INTEGER*2, REAL*4,... On peut aussi utiliser une structure dj dclare, car le nom de la structure est considr comme tant un descripteur de type de variable. Exemple appliqu au tableau ci-dessus : STRUCTURE /VEHICULE/ CHARACTER*25 marque CHARACTER*15 modle INTEGER*2 date_achat(3) INTEGER*2 puissance INTEGER*2 masse INTEGER*2 charge REAL*4 coef END STRUCTURE Il nest pas possible dinclure dans les variables de structure des tableaux dynamiques, ce qui est comprhensible, leur taille tant alors variable. Une dclaration similaire STRUCTURE est galement utilise en FORTRAN 90. Ils sagit de la dclaration TYPE que nous verrons plus loin. Nous venons donc, ci-dessus, de dfinir un nouveau type de variable et non de la dclarer. A partir de cet instant, nous pouvons utiliser le nom de ce type pour dclarer des variables complexes ( ne pas confondre avec COMPLEX !) et travailler avec ce type de variable. Commenons par la dclaration : RECORD /VEHICULE/ parc1(50), parc2(50), voiture parc1 et parc2 sont deux structures dclares de 50 vhicules chacune (tableau de structures) et voiture est une variable simple. La dclaration RECORD se place avec les autres dclarations de variables simples. Evidemment, le bloc de description STRUCTURE doit figurer avant la dclaration RECORD. Comment utiliser une variable de type structure ? Plusieurs possibilits soffrent nous : on peut manipuler une entit entire lors des affectations : ... parc1(I)=voiture

Le langage FORTRAN (JJH) - page 61

tous les lements de la variable voiture sont copis dans la Ieme structure de parc1. Si lon veut accder un lment de voiture, il faut dcrire la structure en insrant des points : write(*,*) indiquez la marque du vehicule read(*,*) voiture.marque parc1(10).marque=voiture.marque :

Si par exemple, on utilise une structure linterieur dune autre : STRUCTURE /moteur/ integer*2 cylindree integer*2 Pdin integer*2 nb_cyl END STRUCTURE si lon inclut cette dclaration dans la structure vhicule dcrite prcdemment : STRUCTURE /VEHICULE/ ... REAL*4 coef RECORD /moteur/ motor END STRUCTURE on peut accder la cylindre par : write(*,*) voiture.motor.cylindree Comme on peut le voir, lusage est facile assimiler. Il est fort probable que lon ait sauver des elements de structure sur le disque. Dans ce cas, on est oblig, lorsque lon travaille sur une structure entire, daccder un fichier binaire ou non format. Il est possible de lire un lment dune structure dans un fichier format. Rappelons quun fichier binaire ou non format est une reprsentation exacte de la forme de la variable en mmoire, alors quun fichier format est la reprsentation ASCII lisible des variables. 8.4.5.2 La dclaration TYPE Il sagit dune dclaration similaire, mais plus puissante. Nous ne verrons pas en dtail les caractristiques de cette dclaration, mais dcrirons les points essentiels. Syntaxe : TYPE nom_type declarations internes END TYPE nom_type nom_type est le nom du nouveau type de variable que nous venons de crer. Utilisons cette dclaration dans lexemple vu dans le paragraphe prcdent : TYPE VEHICULE CHARACTER*25 marque

Le langage FORTRAN (JJH) - page 62

CHARACTER*15 modle INTEGER*2 date_achat(3) INTEGER*2 puissance INTEGER*2 masse INTEGER*2 charge REAL*4 coef END TYPE VEHICULE On peut galement utiliser linstruction RECORD, lie la dclaration STRUCTURE linterieur de cette construction. Pour crer une variable structure, il faut utiliser la syntaxe suivante: TYPE (nom_type)[,attributs]: : variable1, variable2,... lattribut peut avoir plusieurs fonctions. Sil sagit de PARAMETER, la variable cre est alors une constante. Les attributs peuvent aussi tre PUBLIC ou PRIVATE, selon la visibilit dsire pour les modules. Mais ceci est une autre histoire... exemple : TYPE (VEHICULE) : : parc1(50),parc2(50),voiture write(*,*) indiquez la marque du vehicule : read(*,*) voiture%marque voiture=VEHICULE(Peugeot,Clio,30,2,1990,5,1200,1900,0.75 ) parc1(10).marque=voiture%marque write(*,*)voiture

Le langage FORTRAN Annexa A - page 63

ANNEXE A
CLASSEMENT DES INSTRUCTIONS PAR CATEGORIE

DECLARATIONS
AUTOMATIC BLOCK DATA Les variables sont places de prfrence dans la pile Identifie un sous-programme bloc de donnes dans lequel on peut initialiser variables et tableaux dclaration, quivalent INTEGER*1, variable sur 1 octet Dclaration pour variables alphanumriques Variables globales, partage par plusieurs modules Dclaration pour variables complexes Initialisation de variables Dclaration pour tableaux Dclaration double prcision Partage location mmoire identique pour plusieurs variables de nom et de type diffrents Identifie un nom comme tant un sous-programme ou une fonction Attribue un type implicite certaines variables Dclaration pour variables entires Dclaration pour fonctions intrinsques Dclaration pour variables logiques Dbute un groupe de variables dans une STRUCTURE

BYTE CHARACTER COMMON COMPLEX DATA DIMENSION DOUBLE ... EQUIVALENCE

EXTERNAL IMPLICIT INTEGER INTRINSIC LOGICAL MAP

Le langage FORTRAN (JJH) - page 64

NAMELIST PARAMETER REAL RECORD STRUCTURE UNION

dclare un nom de groupe pour un ensemble de variables Donne un nom une co stante n Dclaration de type rel Attribue une structure un nom de variable Dclaration d'une structure de diffrents types de variables Partage de mmes emplacements mmoire pour plusieurs variables

PROGRAMMES ET SOUS-PROGRAMMES
PROGRAM FUNCTION SUBROUTINE CALL RETURN Dbut de programme Sous-programme de type fonction nom de Sous-Programme Appelle et xcute un sous-programme Retour de sous-programme ou fonction

FICHIERS

BACKSPACE CLOSE ENDFILE INQUIRE LOCKING OPEN READ REWIND

Positionne le pointeur de fich sur l'enregistrement prcdent ier Fermeture de fichier Mise en place caractre fin de fichier Examen proprits de fichiers Verrouillage de fichiers Ouverture de fichier Lecture Pointe sur le dbut du fichier

Le langage FORTRAN Annexa A - page 65

WRITE

Ecriture

STRUCTURES ALTERNATIVES

CASE CASE DEFAULT ELSE END IF END SELECT IF SELECT CASE

Cas o (F90) Idem (F90) Sinon de la structure SI... ALORS... SINON Fin construction alterne SI... Fin d'un bloc Cas o (F90) Structure alternative SI Cas OU

BOUCLES

CONTINUE CYCLE DO DO WHILE END DO EXIT

Instruction dsuette, sans effet. Effectue un saut au dbut d'une boucle (F90) Boucle Pour ou Iterer Boucle Tant Que (F90) Fin de bouclepour ou tant que ou iterer (F90) Sortie prmature d'une boucle DO

ALLOCATION MEMOIRE
ALLOCATE DEALLOCATE Allocation dynamique de mmoire (F90) Libre l'espace rserv par ALLOCATE (F90)

ENTREES-SORTIES
READ Lecture

Le langage FORTRAN (JJH) - page 66

WRITE

Ecriture

Le langage FORTRAN Annexa B - page 67

ANNEXE B
CLASSEMENT DES INSTRUCTIONS ORDRE ALPHABETIQUE
Note Voici la liste des instructions du langage FORTRAN. Lorsque l'instruction est particulire au FORTRAN 90, on trouvera la mention F90. Cette liste n'a pour but que de rappeler l'existence d'une instruction, mais pas d'en donner l'usage. L'utilisateur aura avantage consulter l'aide en ligne fournie avec les compilateurs FORTRAN.

ALLOCATE ASSIGN AUTOMATIC BACKSPACE BLOCK DATA

Allocation dynamique de mmoire (F90) Attribue la valeur d'une tiquette un entier Les variables sont places de prfrence dans la pile (F90 ) Positionne le pointeur de fichier sur l'enregistrement prcdent Identifie un sous-programme bloc de donnes dans lequel on peut initialiser variables et tableaux Dclaration, quivalent INTEGER*1, variable sur 1 octet (F90) Appelle et excute un sous-programme Cas o (F90) Idem (F90) Dclaration pour variables alphanumriques Fermeture de fichier Variables globales, partage par plusieurs modules Dclaration pour v ariables complexes Instruction dsute, sans effet. Effectue un saut au dbut d'une boucle (F90)

BYTE CALL CASE CASE DEFAULT CHARACTER CLOSE COMMON COMPLEX CONTINUE CYCLE

Le langage FORTRAN Annexe B - page 68

DATA DEALLOCATE DIMENSION DO DO WHILE DOUBLE ... ELSE END END DO ENDFILE END IF END MAP END SELECT END STRUCTURE END UNION ENTRY

Initialisation de variables Libre l'espace rserv par ALLOCATE (F90) Dclaration pour tableaux Boucle Pour Boucle Tant Que (F90) Dclaration double prcision Sinon de la structure SI... ALORS... SINON Fin de module (programme, sous-programme,..) Fin de boucle pour ou tant que (F90) Mise en place caractre fin e fichier d Fin construction alterne SI...

Fin d'un bloc Cas o (F90) Fin d'une structure (F90) Fin d'une instruction de partage mmoire UNION (F90) Spcifie un point d'entre secondaire dans un sous-programme ( viter) Partage location mmoire identique pour plusieurs variables de nom et de type diffrents Sortie prmature d'une boucle DO Identifie un nom comme tant un sous-programme ou une fonction Format de lecture ou criture Sous-programme de type fonction Saut Structure alternative SI

EQUIVALENCE

EXIT EXTERNAL FORMAT FUNCTION GOTO IF

Le langage FORTRAN Annexa B - page 69

IMPLICIT INCLUDE

Attribue un type implicite certaines variables Lecture et insertion de fichiers dans le programme au moment de la compilation (F90) Examen proprits de fichiers Dclaration pour variables entires Dclaration permettant au compilateur de vrifier les instructions d'appel des sous-programmes (F90) Dclaration pour fonctions intrinsques pa sses en argument Verrouillage de fichiers (F90) Dclaration pour variables logiques Dbute un groupe de variables dans une STRUCTURE (F90) dclare un nom de groupe pour un ensemble de variables (F90) Ouverture de fichier Donne un nom une constante Arrt temporaire du programme Sortie cran Dbut de programme Lecture Dclaration de type rel Attribue une structure un nom de variable (F90) Retour de sous-programme ou fonction Pointe sur le dbut du fichier Maintien des variables dans des sous-programmes Cas OU (F90) Arrt programme Dclaration d'une structure de diffrents types de variables (F90)

INQUIRE INTEGER INTERFACE TO

INTRINSIC LOCKING LOGICAL MAP NAMELIST OPEN PARAMETER PAUSE PRINT PROGRAM READ REAL RECORD RETURN REWIND SAVE SELECT CASE STOP STRUCTURE

Le langage FORTRAN Annexe B - page 70

SUBROUTINE UNION

Nom de Sous-Programme Partage de mmes emplacements mmoire pour plusieurs variables (F90) Ecriture

WRITE

Le langage FORTRAN Annexa C - page 71

ANNEXE C
FONCTIONS INTRINSEQUES CLASSEMENT PAR USAGE DEDIE

Types de donnes et abrviations : gen i i2 i4 r r4 r8 l l1 l2 l4 cx cx8 cx16 cr plusieurs types possibles entier 1, 2, 4 octets entier 2 Octets entier 4 octets rel 4 ou 8 octets (simple ou double prcision) rel 4 octets rel 8 octets logique 1, 2, 4 octets logique 1 octet logique 2 octets logique 4 octets complexe 8 ou 16 octets complexe simple prcision complexe double prcision caractre

Le langage FORTRAN Annexe C - page 72

Conversion de type
Fonction CHAR(i) CMPLX(gen,gen) DBLE(gen) Dfinition conversion de type conversion en complexe conversion de type Types Argument / fonction i / cr i, r, cx / cx i, r, cx / r8 i, r, cx / cx16 i, r, cx / r8 cx16 / r8 i / r4 i, r ou cx / i2 cr / i r8 / i r4 / i i, r ou cx / i i, r ou cx / i1 i, r ou cx / i2 i, r ou cx / i4 i, r, ou cx / i4 i, r, cx / r4 r8 / r4

DCMPLX(genA[,genB])conversion de type DFLOAT(gen) DREAL(cx16) FLOAT(i) HFIX(gen) ICHAR(cr) IDINT(r8) IFIX(r4) INT(gen) INT1(gen) INT2(gen) INT4(gen) JFIX(gen) REAL(gen) SNGL(r8) conversion de type conversion de type conversion de type conversion de type conversion de type conversion de type conversion de type conversion de type conversion de type conversion de type conversion de type conversion de type conversion de type conversion de type

Le langage FORTRAN Annexa C - page 73

Chanes de caractres
Fonction Dfinition Types Argument / fonction

INDEX(crA, crB[,l]) recherche chane B dans A cr / int LEN(cr) LGE(crA, crB) LGT(crA, crB) LLE(crA, crB) LLT(crA, crB) SCAN(crA, crB[,l]) longueur d'une chane cr / i

comparaison chaine A >= B cr / l A>B A <= B A<B recherche caract re cr / l cr / l cr / l cr / i

VERIFY(crA, crB[,l]) non prsence d'une chane cr / i

Oprations binaires
Fonction BTEST(i, i) IAND(iA, iB) IBCHNG(iA, iB) IBCLR(iA, iB) IBSET(iA, iB) IEOR(iA, iB) IOR(iA, iB) ISHA(iA, iB) ISHC(iA, iB) ISHFT(iA, iB) ISHL(iA, iB) Dfinition test sur bit produit logique change valeur bit RZ bit R1 bit ou exclusif ou dcalage arithmtique rotation dcalage logique dcalage logique Types Argument / fonction i/l i / identique i / identique i / identique i / identique i / identique i / identique i / identique i / identique i / identique i / identique

Le langage FORTRAN Annexe C - page 74

Fonctions trigonomtriques
Fonction ACOS(r) ASIN(r) ATAN(r) ATAN2(rA, rB) CCOS(cx8) CDCOS(cx16) CDSIN(cx16) COS(gen) COTAN(r) CSIN(cx8) DACOS(r8) DASIN(r8) DATAN(r8) DATAN2(r8A, r8B) DCOS(r8) DCOTAN(r8) DSIN(r8) DTAN(r8) SIN(gen) TAN(r) Dfinition Arc cosinus arc sinus arc tangente arc tangente(A/B) cosinus cosinus sinus cosinus cotangente sinus arc cos arc sin arc tangente arc tan A/B cos cotangente sinus tangente sinus tangente Types Argument / fonction r / identique r / identique r / identique r,r / identique cx8 / cx8 cx16 / cx16 cx16 / cx16 r ou cx / identique r / identique cx8 / cx8 r8 / r8 r8 / r8 r8 / r8 r8 / r8 r8 / r8 r8 / r8 r8 / r8 r8 / r8 r, cx / identique r / identique

Le langage FORTRAN Annexa C - page 75

Trigonomtrie hyperbolique
Fonction COSH(r) DCOSH(r8) DSINH(r8) DTANH(r8) SINH(r) TANH(r) Dfinition cos hyperbolique cos hyperbolique sinus hyperbolique tangente hyperbolque i sinus hyperbolique tangente hyperbolique Types Argument / fonction r / identique r8 / r8 r8 / r8 r8 / r8 r/r r / identique

Gestion mmoire
Fonction Dfinition Types Argument / fonction

ALLOCATED(tableau)status d'allocation dynamique / l gen LOC(gen) LOCFAR(gen) LOCNEAR(gen) Adresse Adresse segmente Adresse non segmente tout / i2 ou i4 tout / i4 tout / i2

Numriques
Fonction ABS(gen) AIMAG(cx8) AINT(r) ALOG(r4) ALOG10(r4) AMAX0(i, i, ...) AMAX1(r4, r4,...) Dfinition Valeur Absolue partie imaginaire de cx8 Valeur tronque Log naturel Log dcimal Maxi Maxi Types Argument / fonction i, r, cx / identique cx8 / r4 r / identique r4 / r4 r4 / r4 i / r4 r4 / r4

Le langage FORTRAN Annexe C - page 76

AMIN0,AMIN1 AMOD(r4, r4) ANINT(r) CABS(cx) CDABS(cx16) CDEXP(cx16) CDLOG(cx16) CDSQRT(cx16) CEXP(cx8) CLOG(cx8) CONJG(cx8) CSQRT(cx8) DABS(r8) DCONJG(cx16) DDIM(r8A, r8B) DEXP(r8) DIM(genA, genB) DIMAG(cx16) DINT(r8) DLOG(r8) DLOG10(r8)

cf. AMAX reste de division arrondi valeur absolue valeur absolue exponentielle logarithme naturel racine carre exponentielle log naturel complexe conjugu racine carre valeur absolue complexe conjugu diffrence positive exponentielle diffrence positive r4 / r4 r / identique cx / r cx16 / r8 cx16 / cx16 cx16 / cx16 cx16 / cx16 cx8 / cx8 cx8 / cx8 cx8 / cx8 cx8 / cx8 r8 / r8 cx16 / cx16 r8 / r8 r8 / r8 i ou r / identique

partie imaginaire complexe cx16 / r8 troncature log naturel log dcimal r8 / r8 r8 / r8 r8 / r8 r8, r8 r8 / r8 r8 /r8 r8 / r8

DMAX1(r8A, r8B, ...) Maxi DMIN1(r8A, r8B, ...) Mini DMOD(r8A, r8B) DNINT(r8) reste arrondi

Le langage FORTRAN Annexa C - page 77

DPROD(r4A, r4B) DSIGN(r8A, r8B) DSQRT(r8) EOF(i) EPSILON(gen) EXP(gen) HUGE(gen) IABS(i) IDIM(iA, iB) IDNINT(r8) IMAG(cx) ISIGN(iA, iB) LOG(gen) LOG10(gen)

produit double prcision transfert de signe racine carre fin de fichier plus petit incrment exponentielle plus grand nombre positif valeur absolue diffrence positive arrondi partie imaginaire transfert de signe logarithme log dcimal

r4 / r8 r8 / r8 r8 / r8 i/l r/r r ou cx / identique i ou r / identique i/i i/i r8 / i cx / r i/i r / identique r / identique i ou r / identique i/i r4 / i r/r

MAX(genA, genB[,...]) aximum m MAX0(iA, iB[,...]) maximum

MAX1(r4A, r4B[,...]) maximum

MAXEXPONENT(r) plus grand exposant pour type MIN(genA, genB[,...]) minimum MIN0(iA, iB[,...]) minimum

i ou r / identique i/i r4 / i

MIN1(r4A, r4B[,...]) minimum MINEXPONENT(r) MOD(genA, genB)

plus petit exposant pour typer / r reste i ou r / identique

NEAREST(r, directeur)

Le langage FORTRAN Annexe C - page 78

NINT(r) NOT(i) PRECISION(gen) SIGN(genA, genB) SQRT(gen) TINY(r)

arrondi complment logique

r/i i / identique r/i

nombre de chiffres significatifs transfert de signe racine carre plus petite valeur positive

i, r / identique r ou cx / identique r/r

Le langage FORTRAN Annexa C - page 79

1. INTRODUCTION 1.1 HISTORIQUE 1.2 ELABORATION D'UN PROGRAMME 2. STRUCTURE DES INSTRUCTIONS 2.1 STRUCTURE D'UN PROGRAMME 2.2 ELMENTS DE BASE DU LANGAGE 2.3 LES MOTS-CL DU LANGAGE 2.4 LES SPARATEURS 2.5 MISE EN PLACE DES INSTRUCTIONS 2.5.1 STRUCTURE DUNE LIGNEFORTRAN ' 2.5.2 DESCRIPTION DES ZONES 2.6 COMMENTAIRES 2.7 UN EXEMPLE... 2.8 LES IDENTIFICATEURS 3. CONSTANTES ET VARIABLES 3.1 CONSTANTES 3.1.1 GNRALITS 3.1.2 CONSTANTES ENTIRES 3.1.3 CONSTANTES RELLES 3.1.4 CONSTANTES COMPLEXES 3.1.5 CONSTANTES LOGIQUES 3.1.6 CONSTANTES CHANES DE CARACTRES 3.1.7 DCLARATION DES CONSTANTES 3.2 LES VARIABLES 3.2.1 VARIABLES SIMPLES 3.2.2 LES TABLEAUX(VARIABLES INDICES ) 3.3 DCLARATION DES VARIABLES 3.3.1 LES TYPES DE VARIABLES 3.3.2 DCLARATION DES VARIABLES SIMPLES 3.3.2.1 Variables entires 3.3.2.2 Variables relles 3.3.2.3 Variables logiques 3.3.2.4 Variables complexes 3.3.2.5 Variables de caractres 3.3.3 CAS DES VARIABLES INDICES 3.3.3.1 Cas des chanes de caractres 3.3.3.2 Groupements de Variables Les dclarations STRUCTURE et RECORD : 3.3.4 DCLARATION DES SOUS -PROGRAMMES 4. PROGRAMMES ET SOUS-PROGRAMMES 4.1 PRINCIPE GNRAL 4.2 PROGRAMME PRINCIPAL

2 2 2 6 6 6 7 7 8 8 8 9 9 10 11 11 11 11 11 12 12 12 13 13 13 13 14 14 15 15 15 16 16 17 17 18 19 19 20 20 20

Le langage FORTRAN Annexe C - page 80

4.3 SOUS-PROGRAMMES 4.3.1 STRUCTURE DUN SOUS-PROGRAMME TYPESUBROUTINE ' 4.3.2 STRUCTURE DUN SOUS-PROGRAMME DU TYPE ' FUNCTION 4.4 VARIABLES ET PARAMTRES 5. ALGORITHMIQUE ET FORTRAN 5.1 NOMS DE BLOCS 5.2 DCLARATIONS 5.2.1 LES DCLARATIONS DE MODULES 5.2.2 LES DCLARATIONS DE TYPE 5.2.3 LES DCLARATIONS D 'AGENCEMENT MMOIRE 5.3 CONSTRUCTIONS 5.3.1 CONSTRUCTIONS SQUENTIELLES 5.3.2 CONSTRUCTIONS ALTERNATIVES 5.3.2.1 Si... Alors... Sinon... Fin Si} 5.3.2.2 Squence Cas o 5.3.3 CONSTRUCTIONS ITRATIVES 5.3.3.1 Boucle Pour... Fin Pour 5.3.3.2 Boucle Tant... Fin Tant Que 5.3.3.3 Boucle Faire ... tant que ou jusqu' ce que 5.3.3.4 Boucles indtermines ou boucles ITERER 6. LES ENTRES-SORTIES 6.1 INSTRUCTIONS DE LECTURE ET DCRITURE SIMPLES ' 6.1.1 GNRALITS 6.1.2 INSTRUCTION DE LECTURE 6.1.3 INSTRUCTION DCRITURE ' 6.1.4 FORMATS DE LECTURECRITURE 6.2 ECHANGES AVEC LES FICHIERS 6.2.1 DFINITION DE FICHIER 6.2.2 OUVERTURE DUN FICHIER ' 6.2.2.1 Description de chaque paramtre 6.2.3 FERMETURE DUN FICHIER ' 6.2.4 ENREGISTREMENT"FIN DE FICHIER " 6.2.5 POSITIONNEMENT D ENREGISTREMENT EN ARRIRE SUR UN FICHIER 'UN 6.2.6 REPOSITIONNEMENT D FICHIER SUR LE PREMIER ENREGISTREMENT 'UN 6.2.7 LECTURE DES PARTICULARITS 'D UNIT OU DUN FICHIER UNE ' 6.2.7.1 Description des paramtres 6.2.8 LECTURE ET CRITURE DES DONNES DANS UN FICHIER 6.3 IMPRESSION DE RSULTATS 6.4 STRUCTURES DES FICHIERS ET DES ENREGISTREMENTS 6.4.1 LES ENREGISTREMENTS FORMATS 6.4.1.1 Les fichiers squentiels formats 6.4.1.2 Fichiers formats accs direct 6.4.2 LES ENREGISTREMENTS NON FORMATS . 6.4.2.1 Les enregistrements squentiels non formats 6.4.2.2 Les fichiers accs direct et enregistrements non formatts 6.4.3 LES ENREGISTREMENTS BINAIRES 6.4.3.1 Les fichiers squentiels binaires

21 22 23 24 28 28 28 28 28 28 28 28 28 28 29 30 30 31 32 33 34 34 34 35 36 36 39 39 39 39 40 41 42 42 42 43 44 44 45 45 45 45 46 46 47 47 47

Le langage FORTRAN Annexa C - page 81

6.4.3.2 Les fichiers binaires accs direct 7. TRAITEMENT DE L'INFORMATION 7.1 EXPRESSIONS ARITHMTIQUES 7.1.1 DFINITION 7.1.2 OPRATEURS 7.1.3 TYPE DES RSULTATS OBTENUS PAR -, *, / +, 7.1.4 TYPE DES RSULTATS OBTENUS PAR'OPRATEUR PUISSANCE L 7.1.5 RGLE D'HOMOGNIT 7.2 TRAITEMENT DES CHANES DE CARACTRES 7.2.1 ACCS UNE PARTIE D 'UNE CHANE 7.2.2 OPRATEUR DE CONCATNATION DE CHANE 7.3 FONCTIONS NUMRIQUES STANDARD 7.4 EXPRESSIONS LOGIQUES 7.4.1 OPRATEURS DE RELATION ARITHMTIQUE 7.4.2 OPRATEURS LOGIQUES 7.5 OPRATEURS DE RELATIONS ALPHANUMRIQUES 8. GESTION MMOIRE 8.1 VARIABLES GLOBALES : LA DCLARATION COMMON 8.2 LE PARTAGE MMOIRE : LA DCLARATION EQUIVALENCE 8.3 VARIABLES SITUES DANS LA PILE: LA DCLARATION AUTOMATIC 8.4 ALLOCATION DYNAMIQUE DE MMOIRE: ALLOCATE 8.4.1 GNRALITS 8.4.2 DCLARATION 8.4.3 ALLOCATION 8.4.4 LIBRATION DE LA MMOIRE 8.4.5 LES STRUCTURES DE VARIABLES 8.4.5.1 Dclarations STRUCTURE et RECORD 8.4.5.2 La dclaration TYPE

48 49 49 49 49 49 50 50 50 50 51 51 52 52 53 54 55 55 56 57 57 57 58 58 58 59 60 61