Fonctions et sous-programmes
Déflnitions
Le Fortran fait une distinction (contrairement aux langage C et C++) entre les fonctions qui ont un type (en l’occurrence pour le fortran 77, ce type est un type prédéflni) et les sous-programmes, qui n’ont pas de type. Les fonctions s’appellent function et les sous-programmes subroutine. Nous donnons deux exemples très simples pour illustrer les règles d’utilisation de ces notions. Soit une fonction réalisant le carré d’un nombre réel
program toto
implicit none
real a,b
real sqr
external sqr
a=2.0
b=sqr(a)
write(*,*)a,b
end
function sqr(a)
implicit none
real sqr
real a
sqr=a**2
return
end
Le meme programme avec cette fois-ci l’élévation au carré déflni à partir d’un sous-programme. Le paramètre du sous-programme joue le role à la fois de variable d’entrée et de variable de sortie.
program toto
implicit none
real a
a=2.0
write(*,*)a
call sqr_2(a)
write(*,*)a
end
subroutine sqr_2(a)
implicit none
real a
a=a**2
return
end
Instructions : common et parameter
Un bloc common est une instruction qui permet de stocker des données préalablement déflnies dans une liste : celle-ci peut ^etre utilisée dans difiérents sous-programmes. La syntaxe est la suivante
real *8 b,c
integer n,j
real *8 a(2,3)
common/poubelle/a,b,c,n
Le nom du common est ici poubelle, et en rappelant la dernière instruction dans un sous-programme ou une fonction, on peut utiliser toutes les variables déflnies dans le bloc common.
L’utilisation des blocs common est à proscrire. Une partie des blocs com-mon peut ^etre supprimée en donnant des arguments au sous-programmes et fonctions du programme.
Un des risques d’erreurs en Fortran (non signalé par le compilateur) est de ne pas recopier à l’identique la déclaration du bloc common dans le sous-programme. Par exemple
program toto
implicit none
integer a(20)
integer ini,n
common/initia/ini,n,a
integer i
n=20
ini=10
call init
do i=1,n
write(*,*)’ ’,i,a(i)
enddo
end
subroutine init
implicit none
integer a(20)
common/initia/n,ini,a
do i=1,n
a(i)=ini
enddo
return
end
Ce programme initialise à 20 les dix premiers éléments du tableau a, alors que l’on souhaite initialiser à 10 les 20 éléments du tableau. L’échange de l’ordre des variables ini et n dans la déclaration du bloc common est à l’origine du résultat non désiré. Cette erreur classique est parfois très di–cile à détecter dans un programme comportant un grand nombre de lignes et de sous-programmes.
On peut réécrire ce programme de manière juste et claire en se passant du bloc common.
program toto
implicit none
integer a(20)
integer ini,n
integer i
n=20
ini=10
call init(a,ini,n)
do i=1,n
write(*,*)’ ’,i,a(i)
enddo
end
subroutine init(a,ini,n)
implicit none
integer a(n)
do i=1,n
a(i)=ini
enddo
return
end
L’instruction parameter permet de déclarer des constantes dans un sous-programme, fonction ou programme principal oµu celles-ci ont été préalablement déflniees. On peut déflnir des constantes à partir de constantes déjµa déflnies. Par exemple :
integer n,m
parameter (n=20,m=4*n)
Les instructions itératives
Comme il arrive souvent d’avoir à faire des opérations répétitives, on dispose en programmation d’instructions qui vont entourer un bloc d’instructions pour les faire exécuter un grand nombre de fois. Si le nombre est connu à l’avance, on utilise l’instruction do enddo qui contient un indice de boucle (variable entière).
integer m,n,step
do i=m,n
…
enddo
oµu step correspond au pas d’incrémentation. Si n est strictement inférieur à m, aucune instruction de la boucle ne sera exécutée. Si le nombre d’itérations dépend d’une condition, la syntaxe est
do while(condition)
…
enddo
Attention : Une boucle while n’est interrompue que si la condition devient fausse en un nombre d’itérations flni. Parmi les erreurs classiques de program-mation, il arrive qu’un programme n’arrive pas à se flnir car la condition reste indéflniment vraie
Les instructions conditionnelles
if (condition)
then
instructions1
else
instructions2
endif
Cette instruction signifle que si la condition est vraie les instructions du groupe 1 sont exécutées, tandis que si la condition est fausse les instructions du groupe 2 sont exécutées.
On peut imbriquer des instructions if, par exemple,
if (condition1) then
instructions1
elseif (condition2) then
instructions2
else
instructions3
endif
Ce groupe signifle que si les deux conditions sont vraies, les instructions 2 sont exécutées ; si la condition 1 est vraie (indépendamment du statut de la condition 2), les instructions 1 sont exécutées ; si la condition 1 est fausse et la condition 2 vraie, les instructions 2 sont exécutées ; si les deux conditions sont fausses, rien n’est exécuté..
Opérateur de comparaison, opérateurs d’assignation
Pour formuler une expression logique, il est souvent nécessaire d’avoir un opérateur de comparaison, le langage Fortran 77 fournit plusieurs opérateurs que nous rassemblons ci-dessous
:LT: inférieur(strictement) à
:GT: supérieur (strictement) à
:LE: inférieur ou égal à
:GE: supérieur ou égal à
:N E: difiérent de
:EQ: égal à
Il existe aussi des opérateurs de comparaison logiques
:AN D: et logique
:OR: ou logique
:XOR: ou exclusif
Par exemple, soit deux variables booléennes et une variable entière, on peut placer l’instruction logique dans un if oµu un while.
integer i
boolean a,b
…
if(((a.OR.b)).AND.(if<5)) then
…
endif
Les entrées, les sorties, les formats
Pour lire des données au clavier, on peut utiliser le format par défaut suivant
read (*,*) variable
Pour écrire à l’écran, on utilise
write(*,*) variable
Il exite aussi l’instruction print dans le style obsolète !
On peut aussi écrire en alternant les chaines de caractères et variables
write (*,*) ’ var1= ’variable1,’var2 =’,variable2
Si l’on souhaire écrire avec un format bien spéciflque on peut écrire l’ins-truction suivante pour deux variables une entière et une réelle.
integer i
real a
write(*,’(I5 E15.5)’)i,a
Les instructions pour le format sont les suivantes
A cha^‡ne de caractères
D nombre en double precision et notation exponentielle E nombre réel et notation exponentielle
F nombre réel et notation °ottante I entier
X espace horizontal / retour à la ligne
Le format 2I5 est pour deux entiers écrits avec 5 caractères. Le format E15.5 est pour un nombre réel en notation exponentielle écrit sur quinze caractères dont 5 après la virgule.
Pour lire sur un flchier, il faut préalablement ouvrir ce flchier et donc déflnir un descripteur de flchier qui, en Fortran, est un numéro.
Exemple :
open(60,file=’gr.res’)
signifle que l’on ouvre le flchier gr.res qui se trouve dans le répertoire oµu le programme est exécuté et que ce flchier est un flchier texte (c’est à dire formaté).
Pour lire les données, on utilise un ordre
real *8 variable2,variable3
read(60,’(2E15.5))’) variable2, variable3
signifle que l’on deux réels à lire avec un format de 15 caractères à 5 décimales. Une fois réalisé l’ensemble des opérations d’écriture, on ferme un flchier en
indiquant son numéro de descripteur
close(60)
Les fonctions intrinsèques
Le langage Fortran possède un nombre signiflcatif de fonctions intrinsèques dans la bibliothèque standard. Il en existe principalement de deux types : les fonctions qui permettent de convertir les données d’un type en autre type (par exemple entier en °ottant) et les fonctions mathématiques, à la fois les fonctions transcendantes usuelles et une partie des fonctions spéciales rencontrées assez fréquemment.
Les conversions de type
La deuxième colonne indique le type de la variable attendue comme argu-ment de la fonction et la troisième colonne le type de la fonction.
Pour la deuxième et troisième colonne des tableaux ci-dessous, le I signifle entier, le R signifle réel simple précision, le D réel double précision et X le complexe.
A.1 Avant-propos
A.2 La Structure de Base
A.3 Règles minimales de programmation
A.4 Les déclarations de variables
A.4.1 Types prédéfinis
A.4.2 Les tableaux
A.5 Fonctions et sous-programmes
A.5.1 Définitions
A.5.2 Instructions : common et parameter
A.6 Les instructions itératives
A.7 Les instructions conditionnelles
A.8 Opérateur de comparaison, opérateurs d’assignation
A.9 Les entrées, les sorties, les formats
A.10 Les fonctions intrinsèques
A.10.1 Les conversions de type
A.10.2 Fonctions mathématiques
A.11 Passage des variables, tableaux, et fonctions
A.12 Conclusion et références