next up previous
Next: À propos de ce document... Up: Initiation au Langage Fortran Previous: Les fichiers

Sous-sections

La compilation et la correction des erreurs

Le compilateur FORTRAN SUN

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 :

On peut imposer cette décomposition soi-même en utilisant l'option -c pour chaque fichier source :

f77 -c truc.f
f77 -c subs.f
f77 -c machin.f
f77 truc.o subs.o machin.o -o chose

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é.

Utilisation de librairies

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


  
Figure 12.1: Extrait traduit de la « manual page » de f77.
NAME
f77 - Sun FORTRAN compiler


SYNOPSIS
f77 [-C] [-c] [-g] [-lx] [-o output] [-u] sourcefile ...


OPTIONS
-c Compilation sans édition de lien; Permet de créer les
différents fichiers objets (.o) des fichiers .f qui
figurent en argument.


ex: f77 -c test.f ou f77 -c *.f


-C Permet lors de la compilation de tester si l'on dépasse de
manière explicite la dimension d'un vecteur ou d'un tableau.


-g Génère les fichiers objets et exécutables associés à une
table de symboles permettant d'utiliser le débugger dbx.


ex: f77 -g *.f
dbx a.out


-lx Permet l'édition de liens avec les fichiers objets d'une
bibliothèque de sous-programmes (libx.a).


ex: f77 -c *.f
f77 *.o -lnag (pour la bibliothèque NAG)


-o output

Permet de donner un autre nom (ici output) au fichier
exécutable.


ex: f77 *.f -o exec


-u Génère une erreur avec un message pour toute les variables
non déclarées (équivalent à placer l'instruction
"IMPLICIT NONE" en tête de tous les programmes)


Quelques erreurs de compilation

"try.f", line 276: Error: bad dimension list for array "dfdx"
Compilation failed

Survient :


"try.f", line 277: Error: unbalanced parentheses, statement skipped
"try.f", line 277: Error: unclassifiable statement

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
"try.f", line 187: Error: nested loops with variable "i"
"try.f", line 188: Error: do loops not properly nested

Il manque une instruction ENDDO pour fermer une boucle.


"try.f", line 5: Error: unbalanced quotes; closing quote supplied
"try.f", line 5: Error: unclassifiable statement

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
"try.f", line 65: Error: "vect" is a non-argument adjustable array
"try.f", line 65: Error: "nvar": Adjustable array's bounds must be a dummy
argument or in a common block
"try.f", line 79: Error: bad dimension list for array "vect"
"try.f", line 86: Warning: RETURN statement in main or block data
"try.f", line 104: Warning: RETURN statement in main or block data
"try.f", line 120: Warning: RETURN statement in main or block data
"try.f", line 231: Error: external name "MAIN"


ld: Undefined symbol
_sub1_
_sub2_

Erreur lors de l'édition de liens :

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.

Quelques erreurs d'exécution

*** Segmentation Violation = signal 11 code 3
Traceback has been recorded in file:
/home1/dr/pcf/letourne/ALGO/TEST/./a.out.trace
Note: Line numbers for system and library calls may be incorrect
IOT trap

Survient lorsqu'on dépasse la dimension d'un vecteur ou un tableau.


*** Bus Error = signal 10 code 2
Traceback has been recorded in file:
/home1/dr/pcf/letourne/ALGO/TEST/./a.out.trace
Note: Line numbers for system and library calls may be incorrect
IOT trap

Très fréquent. Par exemple :


F(X)=NaN
Note: the following IEEE floating-point arithmetic exceptions
occurred and were never cleared; see ieee_flags(3M):
Invalid Operand;
Note: IEEE NaNs were written to ASCII strings or output files;
see econvert(3).
Sun's implementation of IEEE arithmetic is discussed in
the Numerical Computation Guide.

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
Note: the following IEEE floating-point arithmetic exceptions
occurred and were never cleared; see ieee_flags(3M):
Inexact; Overflow;
Note: IEEE Infinities were written to ASCII strings or output files;
see econvert(3).

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
Traceback has been recorded in file:
/home1/dr/pcf/letourne/ALGO/TEST/./a.out.trace
Note: Line numbers for system and library calls may be incorrect
IOT trap

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
logical unit 5, named 'stdin'
lately: reading sequential list external IO
part of last format: ext list io
IOT trap

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
logical unit 5, named 'stdin'
lately: reading sequential list external IO
part of last format: ext list io
part of last data: .0001J|
IOT trap

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 !!


next up previous
Next: À propos de ce document... Up: Initiation au Langage Fortran Previous: Les fichiers

Copyright © EMAC - 1996-1999 - Paul GABORIT