Le compilateur de Format s'appelle f77
(c'est général sous UNIX).
Compilation d'un programme contenu dans truc.f
:
f77 truc.f |
Le fichier exécutable se nomme alors a.out
. Si vous préférez appeler
votre exécutable chose
, utilisez l'option -o
:
f77 truc.f -o chose |
Il existe de nombreuses options de f77
. En voici deux très utiles :
f77 -g truc.f -o chose |
est indispensable si vous voulez par la suite débugger votre programme.
L'omission de l'option -g
rendra impossible l'utilisation du
debugger. Utilisez-la systématiquement lorsque vous mettez au point votre
programme.
f77 -O truc.f -o chose |
optimise votre programme, qui tournera plus vite. L'option -O
est
incompatible avec l'option -g
.
Il est possible de couper un programme FORTRAN en plusieurs fichiers sources : il suffit que l'un des fichiers sources contienne le programme principal et on peut ensuite répartir l'ensemble des subroutines et fonctions dans des fichiers différents.
Pour compiler tous ces fichiers en même temps, on indique leurs noms à la
queue leu leu après f77
. Indiquez le fichier
contenant le programme principal en tête de liste !
Exemple :
f77 truc.f subs.f machin.f -o chose |
Si vous examinez votre répertoire après avoir compilé un ou plusieurs fichiers
FORTRAN, vous y trouverez des fichiers finissant par .o
. Il
s'agit de fichiers dits objets.
Le fichier truc.o
contiendra le code machine correspondant au
fichier source truc.f
, mais les appels aux subroutines extérieures à
truc.o
sont laissées en suspens.
Un éditeur de liens appelé ld
fait alors le lien entre
tous les fichiers .o
pour engendrer l'exécutable
correspondant. Dans la ligne de compilation précédente, les deux phases sont
effectuées successivement de manière transparente pour l'utilisateur :
truc.f
, subs.f
, et machin.f
sont compilés
séparément par f77
en truc.o
, subs.o
et
machin.o
truc.o
, subs.o
et machin.o
sont liés par
ld
pour créer le programme chose
.
On peut imposer cette décomposition soi-même en utilisant l'option
-c
pour chaque fichier source :
f77 -c truc.f |
Ceci peut être intéressant lorsque l'on compile de gros programmes (plusieurs
dizaines de fichiers sources) pour ne pas avoir à recompiler les fichiers
sources qui n'ont pas été modifiés. Un utilitaire très puissant appelé
« make
» permet de gérer simplement ce procédé.
Une librairie est une collection de fichiers objets .o
archivés dans
un même fichier dont le nom commence généralement par lib
et finit
toujours par .a
. La librairie NAG est par exemple archivée dans
libnag.a
.
Les librairies sont placées à des endroits de l'arborescence de fichiers que
vous n'êtes pas obligés de connaître et auxquels vous avez accès si votre
compte est configuré pour cela. Pour lier la librairie libxxx.a
à
votre programme :
f77 truc.f subs.f machin.f -o chose -lxxx |
La figure 12.1 présente un extrait (traduit en français) des « manual pages
» UNIX de la commande f77
. Il existe beaucoup plus d'options
que celles présentées ici. Le lecteur intéressé pourra se reporter à la documentation
FORTRAN SUN §1.3 ou bien consulter les pages manuelles complètes par la
commande :
man f77 |
|
"try.f", line 276: Error: bad dimension list for array "dfdx" |
Survient :
dfdx
) qui
n'est pas dimensionné
*
ou avec une variable.
"try.f", line 277: Error: unbalanced parentheses, statement skipped |
Problème de parenthèses. Attention le problème peut provenir d'une ligne en amont de la ligne indiquée.
"try.f", line 160: Warning: incompatible lengths for common block zone01 |
Un common n'a pas la même taille dans les différents sous-programme où il est utilisé. Bien que ce problème n'empêche pas la compilation (Warning), il entraînera généralement une erreur d'exécution.
"try.f", line 160: Error: declaration among executables |
Une instruction de déclaration est placée au milieu de la partie exécutable du programme.
"try.f", line 183: Error: do not closed |
Il manque une instruction ENDDO pour fermer une boucle.
"try.f", line 5: Error: unbalanced quotes; closing quote supplied |
Il manque une quote (') pour fermer une chaine de caractères. Cela arrive souvent lorsqu'une instruction est écrite à partir de la 6ème colonne ou bien lorsque vous dépassez la 72ème colonne. Cette erreur peut aussi arriver lorsqu'on oublie le caractère de déclaration de commentaire en première colonne.
En général, ce dernier oubli a des conséquences catastrophiques. La preuve :
"try.f", line 1: Error: illegal continuation card ignored |
ld: Undefined symbol |
Erreur lors de l'édition de liens :
sub1
et sub2
qui n'existent dans aucun des
fichiers source mentionnés. Cela arrive souvent lorsque l'on oublie le lien
avec une librairie.
sub1
et sub2
non
dimensionnés.
Lorsque l'un des symboles « undefined
» est
_MAIN_
, c'est qu'il n'y a pas de programme principal. Cela
se produit si vous compilez un fichier ne contenant que des subroutines sans
l'option -c
.
*** Segmentation Violation = signal 11 code 3 |
Survient lorsqu'on dépasse la dimension d'un vecteur ou un tableau.
*** Bus Error = signal 10 code 2 |
Très fréquent. Par exemple :
F(X)=NaN |
NaN
signifie « Not a Number ». Se produit lorsque les arguments
d'une fonction ne sont pas dans son domaine de définition (exemple racine d'un
nombre négatif) Remarque: Il est possible que l'exécution continue en
affichant la valeur NaN
là où l'on attendait voir s'afficher des
résultats par l'intermédiaire d'une instruction WRITE.
Inf |
Même principe que ci-dessus.
Inf
signifie « Infinity ». Se produit
lorsqu'une opération donne un nombre trop grand pour être codé dans un type
donné.
*** Illegal = signal 4 code 2 |
Survient lorsqu'on oublie de déclarer EXTERNAL une fonction ou une subroutine passée en argument à une fonction ou subroutine.
list io: [112] incomprehensible list input |
Le type de la donnée lue au clavier ou sur un fichier est incompatible avec le format de lecture spécifié dans l'instruction READ.
list read: [-1] end of file |
On essaye de lire après la fin d'un fichier.
F(X)=************* |
Erreur de format; la valeur à écrire ne peut l'être avec le formattage
spécifié dans l'instruction write
.
Ces deux listes d'erreurs ne sont pas exhaustives. Il est vraisemblable que vous rencontriez beaucoup d'autres erreurs. Dans ce cas, et afin d'affiner ces listes , prévenez-nous ou envoyez-nous le programme pour que nous les complétions.
Bonne chance !!