10.7 Param` etres formels de type tableau
10.7.1 Exercice
Au vu du m´ecanisme de passage des arguments aux subroutines, expliquez pour- quoi les param`etres formels de type vecteurs et matrices sont d´eclar´es de cette mani`ere.
10.7.2
Exemple
Subroutine qui lit une matrice au clavier. La subroutine devra sortir la matrice, son nombre de lignes r´eelles, son nombre de colonnes r´eelles (figure 10.8). Il faut bien comprendre que la seule matrice ayant une existence r´eelle est la matrice mat du programme principal, et que pour lui r´eserver de la m´emoire, il faut la d´eclarer avec un nombre de lignes et un nombres de colonnes explicites. Le param`etre formel a de la subroutine va recevoir l’adresse de mat au moment de l’appel, et connaissant sa premi`ere taille de d´eclaration (10) via le param`etre formel ma, elle sera `a mˆeme de lire et ´ecrire un ´el´ement quelconque de mat.
10.7.3
Exercice 1
Que se passe-t-il si l’utilisateur tape un nombre de lignes sup´erieur `a 10 et/ou un nombre de colonnes sup´erieur `a 20 ?
10.7.4
Exercice 2
´
Ecrire une subroutine qui affiche une matrice `a l’´ecran, et combinez-la avec litmat pour v´erifier votre r´eponse `a la question pr´ec´edente.
Chapitre 10. Fonctions et subroutines
program test
parameter(mligne=10, mcolon=20) double precision mat (mligne, mcolon) call litmat (mat, mligne, nligne, ncolon) end
subroutine litmat (a, ma, nl, nc) double precision a (ma, *)
write(*,*)
& ’Entrez nombre de lignes-colonnes’ read(*,*) nl, nc do i=1, nl write(*,*) ’Ligne ’, i read(*,*) (a(i,j), j=1,nc) enddo return end
Initiation au langage FORTRAN
10.8
D´eclaration external
10.8.1
Objectif
Utiliser le nom d’une fonction ou d’une subroutine comme argument d’une autre fonction ou subroutine.
Quelle drˆole d’id´ee ?
Examinons le probl`eme suivant : ´Ecrire une subroutine qui calcule l’int´egrale Rb
af (x) dx pour une fonction f quelconque. Que faudra-t-il faire entrer et sortir de la subroutine ?
– la fonction f ;
– les bornes d’int´egration a et b ; – la valeur de l’int´egrale.
Or quel est le moyen en FORTRAN de programmer une fonction f (x) ? C’est d’utiliser une fonction FORTRAN, qui renverra par exemple une valeur real. On peut donc pr´edire la forme de la subroutine d’int´egration :
subroutine integ (a, b, f, valint)
Les param`etres formels a, b et valint seront double precision, mais de quel type est f ?
C’est le nom d’une fonction FORTRAN, et pour d´eclarer un param`etre formel aussi bizarre, on ´ecrira :
external f et aussi
real f
car f renvoie une valeur real. On peut aussi d´eclarer des param`etres formels de type subroutine, en utilisant simplement external. Dans le corps de la su- broutine, on fera bien sˆur appel `a cette fonction f pour calculer l’int´egrale. Pas de difficult´e ! On fait comme si elle existait et on ´ecrira des choses du style :
valint = valint + h/2 *(f(x1+h) + f(x1))
Maintenant ma subroutine d’int´egration est ´ecrite. Je souhaite l’appliquer `a une fonction que j’ai ´ecrite en FORTRAN, du style :
real function truc(x) real x
... truc=... return end
Chapitre 10. Fonctions et subroutines
Je veux appeler la subroutine integ pour calculer l’int´egrale de cette fonction entre disons 1 et 2. J’´ecrirai :
call integ (1.0, 2.0, truc, somtruc)
1.0 et 2.0 sont des constantes real, somtruc une variable real qui me renverra la valeur de l’int´egrale...
Et truc ? C’est le nom d’une fonction FORTRAN. Ai-je le droit de passer ce genre de chose en argument `a une subroutine ? La r´eponse est oui, si je la d´eclare :
external truc
dans le bloc fonctionnel d’o`u je fais le call. De plus, comme cette fonction renvoie une valeur real, j’ajouterai :
real truc
10.8.2
R´ecapitulation
La figure10.9r´ecapitule tout ce que l’on vient d’expliquer.
Remarquons que la structure de truc est impos´ee par la subroutine qui demande que la fonction repr´esent´ee par son param`etre formel f ait un argument r´eel et renvoie une valeur r´eelle. Nous ne pourrions donc pas par exemple d´eclarer :
real function truc(x,y)
En g´en´eral, les subroutines du type integ sont des boites noires toutes faites (par des sp´ecialistes), et on vous indique juste le type de ses param`etres formels. Lorsque l’un d’entre eux est une fonction ou une subroutine, on vous indique en plus la liste des param`etres formels que doit avoir cette fonction ou subroutine.
10.8.3
Exercice
´
Ecrire la structure d’un programme (programme principal / subroutine / fonc- tions) pour trouver les z´eros d’une fonction f (x) par la m´ethode de Newton. On rappelle que cette m´ethode n´ecessite la connaissance de la fonction f (x) et de sa d´eriv´ee f0(x).
Initiation au langage FORTRAN
program test real somtruc external truc real truc
call integ (1.0, 2.0, truc, somtruc) end
subroutine integ (a, b, f, valint) real a, b, valint external f real f ... valint=valint + ( f(x1+h) + f(x1) )*h/2 ... return end
real function truc(x) real x
... truc=... return end
Chapitre 11
Les fichiers
Avertissement : nous parlons ici implicitement de fichiers dits s´equentiels, c’est-`a-dire qu’`a partir de l’ouverture du fichier, on lit les donn´ees dans l’ordre o`u elles sont stock´ees, sans pouvoir acc´eder directement `a une donn´ee particuli`ere. Au fur et `a mesure des lectures ou ´ecritures, un pointeur de fichier avance automatiquement d’une donn´ee `a la suivante.
Il existe en FORTRAN des fichiers dits `a acc`es direct, mais nous n’en parlerons pas ici.
Les fichiers s´equentiels sont divis´es en deux types : le fichiers format´es et les fichiers binaires.
11.1
Les fichiers format´es
Plus simplement, ce sont des fichiers texte, c’est-`a-dire organis´es en lignes de caract`eres, que l’on pourrait lire ou ´ecrire avec un ´editeur.
Lorsque l’on ´ecrit un objet FORTRAN sur ce type de fichier, celui-ci est converti en chaˆıne de caract`ere selon un formatage d´efini par l’utilisateur ou par d´efaut (voir « ´Ecritures format´ees » 7.1)
Ce type de fichier est pratique car on peut les visualiser par un ´editeur de texte, et de plus presque tous les logiciels savent lire des fichiers texte.
L’´ecran et le clavier sont des cas particuliers de fichiers format´es.