Linux VI f77 PDF
Linux VI f77 PDF
Linux VI f77 PDF
Les commandes de gestion des rpertoires et des fichiers pwd (affiche le chemin absolu du rpertoire courant) ls (list, affiche les rpertoires et les fichiers du rpertoire actif) ls (affiche seulement les noms) ls toto* (affiche les fichiers commenant par toto) ls -l (affiche le format long : types + droits + Nbre de liens + ....) cd (change directory) cp chemin (vers le rpertoire dont le chemin absolu est donn) cd .. (rpertoire parent) cd ~ (rpertoire de base) cd - (rpertoire prcedent) cd / (rpertoire racine) cp (copie) cp rapport*.txt sauvegarde cp * dossier (copie mv (move, renomme et dplace un fichier) mv source destination mv * dossier (dplace tous les fichiers du rpertoire actif vers le rpertoire dossier) mkdir (crer un rpertoire) mkdir rpertoire rmdir (effacer un rpertoire) rmdir dossier (supprime un rpertoire vide) rm (remove, fface!!!) rm -R (enlvement rcursif!!!) rm fichier rm -i fichier (interactivement, avec demande de confirmation) rm -f fichier (avec force, sans demande de confirmation) rm -r fichier (avec rcursivit, avec les sous rpertoires) rm -rf dossier (supprime le rpertoire et tou son contenu, sans confirmation) Les commandes de recherche grep (recherche les occurences de mots l'intrieur de fichier) grep motif fichier grep -i motif fichier (sans tenir compte de la casse) grep -c motif fichier (en comptant les occurences) grep -v motif fichier (inverse la recherche, en excluant le "motif") grep expression /rpertoire/fichier grep [aFm]in /rpertoire/fichier grep "\$" *.txt Les commandes d'dition more ("pager" qui affiche page par page sans retour en arrire, "h" affiche l'aide contextuelle)
more fichier more fichier1 fichier2 more *.txt cat (concatenate avec le code de fin de fichier eof=CTRL + D) cat fichier-un fichier-deux > fichier-un-deux cat -n fichier > fichier-numrot (cre un fichier dont les lignes sont numrots) cat -nb fichier (affiche sur la sortie standard les lignes numrot, sauf les lignes vides) head (affiche les 10 premires lignes d'un fichier) head -n22 fichier (affiche les 22 premires lignes) vi (l'diteur en mode texte universel) emacs (l'diteur GNU Emacs multi fonction pour l'dition, les mails, les news, la programmation, la gestion des fichiers,...) xemacs (l'diteur GNU Emacs sous X) diff (diffrence entre deux fichiers, utiles pour chercher les modifications) diff fishier1 fichier2 Les commandes d'impression et de conversion lp (la commande d'impression sur les systmes Unix Systme V) lpr (la commande d'impression sur les systmes BSD et Linux) lpr fichier echo $PRINTER lpc status (affiche l'tat de la file d'attente) lpq (affiche les travaux d'impression et leur numro) lprm (supprime un travail d'impression avec son numro comme argument) gv ("ghostview" permet de visualiser des fichiers POST SCRIPT) gv fichier.ps a2ps (convertit les fichiers ASCII en POST SCRIPT) a2ps -4 fichier -P fichier-post-script Les commandes de compilation et d'execution f77 compile un programme en fortran 77 f77 program.f (la terminaison .f indique que le fichier program.f est crit en f77 ./a.out excution Les autres commandes cal (calendar) cal 2002 date (affiche la date, le mois, l'heure et l'anne du jour. Les messages d'erreur et les e-mails sont toujours dats avec la date systme) date -s wc ("word & count", affiche le nombre de lignes + mots + caractres) who | wc -l (affiche uniquement le nombre de lignes)
spell (programme de correction orthographique) cat rapport.txt | spell > faute.txt read (lit dans un script shell la ligne saisie partir de l'entre par dfaut, le clavier)
L'diteurvi
viestunditeurdefichiersquicontiennentdeslignesdetexte.Ilfonctionneenmodecran;lenomvi provientdumotvisual.I
Quelquescommandesessentielles
Pourremplacerdutexte:
:setnuaffichelesnumrosdelignes
#dddtruit#lignespartirdelalignecouranteetplacedansletampon
Commandespluscomplexes Recherched'unechanedecaractresparticulire:
/chanecherchechaneenavanantverslafindufichier; ntrouvelaprochaineoccurrencedeladernirechanerecherche.
1) Introduction
voir /pat/internet/techinfo
structure de l'ordinateur (CPU, mmoire, interfaces, bus) les caractristiques du CPU, les diffrentes vitesses dans un PC, les caches. les priphriques le langage machine (petit exemple), les 5 gnrations de langages
2) La gestion de l'ordinateur
BIOS, OS, DOS les disques et leur gestion (FAT, rpertoires, adressage absolu et relatif) les Files Systems (FAT12, 16, 32, Unix, NFS...) sous Unix : arborescence classique, montage/dmontage, mkdir, rmdir, cd, ls, rm la compilation, l'dition de liens. En pratique (kwrite prog.f & / gcc prog.f -o prog / prog). Si vous cherchez un compilateur, je vous conseille le meilleur : GNU G77 (www.gnu.org). Il est disponible dans toutes les distributions Linux, pour Windows j'en ai fait une copie ici.
3) Bases du fortran 77
le format de la ligne ( C2345+789.....72CCCC ) : en colonne 1, un C (ou *) indique que la ligne est un commentaire (ne sera pas prise en compte par le compilateur). Les colonnes 1 5 peuvent contenir un label (numro de ligne par exemple). S'il y a un caractre en colonne 6 (un + par exemple), cette ligne est la continuation de la suivante. Les colonnes 7 72 contiennent les instructions. A partir de la colonne 73, plus rien n'est lu. Les compilateurs actuels (dont g77) acceptent un commentaire en fin de ligne : il commence par ! (et va jusqu la fin de la ligne). C'est mme conseill en premier caractre d'une ligne de commentaire (au lieu de C) pour la compatibilit avec F90 et plus. les identificateurs (noms des objets) : utilisez les caractres (A-Z,0-9), ni espace ni accent ni - (rserv la soustraction). Le premier doit tre une lettre, pas un chiffre. Le compilateur transforme toutes les minuscules en majuscules (sauf si entre apostrophes ' ). 6 caractres maxi (31 maxi en gnral, mais il vaut mieux qu'il n'y en ait pas deux avec les mmes 6 premiers). Les identificateurs sont spares par un ou plusieurs espaces, que l'on peut omettre si le caractre suivant n'est pas (A-Z,0-9). les types de variables de base : integer (en gnral jusqu' +ou- 109), real (en gnral avec 7 chiffres significatifs), double precision (en gnral avec 15 chiffres significatifs). Remarque : on peut (quand on sait exactement ce qu'on fait) imposer le nombre d'octets des variables : integer *2 et *4, real *4 et *8). Il existe aussi les character, logical et complex (voir plus loin) les oprateurs arithmtiques, par priorit dcroissante : (1) - unaire, (2) ** puissance, (3) * et /, (4) + et -. En cas de calcul entre deux entiers, le rsultat est entier. Ds qu'il y a au moins un rel, le rsultat est rel. Ds qu'il y a un double prcision, le rsultat est double prcision. les constantes : 1 (entier ), 100.0 ou 1E2 (rel), 1D0 (double prcision) petit programme (premprog.f)
program calcul entte implicit none pour plus de scurit, nous refusons integer nb les dclarations implicites real pu,pt print *,'combien de pices ?' crire l'cran read *,nb lire au clavier print *,'prix unitaire ?' read *,pu pt=pu*nb affectation: le calcul est effectu puis print *,'cela fera ',pt,' en tout' le rsultat est stock dans pt stop end program calcul clture
structure du programme :
entte (program nom au choix) dclarations (implicites et explicites) : les variables non dclares commenant par (I-N) sont considres entires, les autres relles. Accepter les dclarations implicites est souvent source d'erreurs difficiles localiser (un erreur de frappe cre une autre variable au lieu d'un message d'erreur), je vous conseille de toujours commencer par "implicit none" instructions : print affiche l'cran, read lit au clavier. L'affectation se note : variable = expression, ou contenant = contenu, ou o = combien. Le programme calcule d'abord combien vaut l'expression droite du =, puis stocke le rsultat dans la variable nomme gauche du =. "stop" arrte le programme, il est optionnel en dernire instruction du programme. clture du programme (end est suffisant, mais pour plus de clart on le complte par le nom du programme).
Le dernier ELSE (obligatoirement sans expression logique) est optionnel. Encore plus complexe, parmi les instructions conditionnelles on peut utiliser des if ... endif. On nomme cela des if imbriqus. Un endif correspond toujours
au dernier if qui n'en tait pas pourvu. exemple (il manque l'entte, les dclarations, la saisie des coefficients et surtout un test) :
delta=b*b-4*a*c if (delta.GT.0) then x1=(-b-sqrt(delta))/(2*a) x2=(-b+sqrt(delta))/(2*a) print *,'2 racines: ',x1,' et ',x2 elseif(delta.EQ.0) then x=-b/(2*a) print *,'1 racine double: ',x else print *,'aucune racine relle' endif
(voir seconddeg.f) Remarque sur la division : il faut TOUJOURS vrifier que le dnominateur est non nul (le clbre domaine de dfinition cher tous vos profs de maths depuis le collge).
Le label est un entier dans ]0,99999] (doit rentrer dans les 5 premiers caractres de la ligne). L'incrment est optionnel (1 par dfaut). La boucle sera effectue avec l'indice (que vous aurez dclar avant en integer) allant de 'val.initiale' 'val.finale' compris, par pas de 'incrment' . Il ne faut JAMAIS tenter de modifier l'indice, val.initiale, val.finale ou incrment en cours de boucle. En sortie de boucle, l'indice ne vaut pas ncessairement la valeur finale, a dpend des compilateurs. exemple :
10 do 10 i=1,10 print *,i,' coucou' continue
qui donne
1 coucou 2 coucou 3 coucou 4 coucou 5 coucou 6 coucou 7 coucou 8 coucou 9 coucou 10 coucou
En fait, le continue ne peut fermer que la dernire boucle ouverte (mais on peut imbriquer des boucles). Le label n'apporte rien (que peut-tre la clart). exemple :
DO 10 --------do 20 -------continue do 30 -------continue ----continue
boucles imbriques : OK
chevauchement impossible :
20 30 10
Mais ces boucles ne peuvent se faire que si leur nombre est fix d'avance. C'est pourquoi la plupart des compilateurs acceptent d'autres boucles, mais elles ne sont pas standardises dans fortran 77. Celle qui me semble la plus frquente (et accepte par les normes suivantes) est :
DO while (condition logique) une ou plusieurs instructions ENDDO
exemple :
DO while(x.gt.1) x=x/2 ENDDO
si x est infrieur 1 avant de commencer la boucle, aucune division par 2 n'est effectue. Deux instructions spcifiques aux boucles ont t rajoutes dans G77 : EXIT (sortir immdiatement de la boucle) et CYCLE (passer directement la prochaine itration). Autres critures de boucles existantes, suivant les compilateurs (mais je ne vous les conseille pas) :
while (condition) do instructions enddo do instructions while(condition) do instructions
until (condition)
Le label doit tre unique dans un programme, il peut se situer au dessus ou au dessous du GOTO. L'instruction en face du label n'est pas ncessairement un continue, ce peut tre n'importe quelle autre instruction (qui sera excute lors du saut). Les goto sont crateurs de nombreux problmes, (dans les programmes complexes ou buggs, uniquement) c'est pourquoi les programmeurs expriments essayent de s'en passer. Plusieurs GOTO diffrents peuvent sauter au mme label. On peut sortir par GOTO de n'importe o, mais on ne peut pas pointer vers l'intrieur d un bloc d'instructions (IF, DO, Subroutine) exemple :
1 do 10 i=deb,fin ----GOTO 5: ici un goto 10 passe au prochain i, goto 1 recommence deb. ----continue ----continue ---GOTO 5: d'ici, ce GOTO est impossible. Mais GOTO 1 le serait
5 10
Une criture frquente est le IF (condition) GOTO label, servant par exemple pour crer des boucles "tant que" qui soient compatibles avec tout compilateur.
exemple :
SUBROUTINE echange (x,y) implicit none
autre part :
real a,b a=10 b=15 CALL echange (a,b)
Les arguments rels doivent tre exactement du mme type que les arguments formels, aussi nombreux et dans le mme ordre (mme pas de transformation automatique d'entier en rel). Les arguments sont dits "passs par adresse", ce qui signifie que toute modification l'argument formel est rpercute l'argument rel (j'en parle parce que dans d'autres langages c'est diffrent). Une fonction, quand elle, a un rsultat. Elle est appele dans une expression
type FUNCTION nom (liste d'arguments formels) dclarations locales (y compris arguments formels) instructions (dont RETURN pour quitter la fonction, prcd d'une affectation au nom de la fonction) END FUNCTION nom
exemple:
real function puiss(x,n) implicit none real x,p integer i,n p=x; do i=2,n p=p*x enddo puiss=p return end function puiss
appel :
real z,puiss z=2.3 print *, 'calcul: ', puiss(z,10)+1
Remarque : ici z reste 2.3, car dans la fonction x est inchang. Si l'on avait modifi x dans la fonction, on aurait obtenu ce que l'on appelle un "effet de bord". Exemple de sous-programme effet de bord :
real function factorielle(n) integer res,n res=1 do while (n.GT.1) res=res*n
donneront ce rsultat
120 est la factorielle de 1
C'est assez dplorable, nb ne vaut plus 5 ! Conclusion : ne modifiez un argument formel que si c'est ncessaire. Dans le programme appelant la fonction, son type doit tre dclar. Dans l'exemple de la factorielle si vous l'oubliez (et avez oubli "implicit none"), il la considrera real, ce qui donnera des rsultats aberrants !
6) Les tableaux
On peut regrouper sous un seul nom plusieurs variables simples, c'est un tableau unidimensionnel ou vecteur. On les dclare ainsi :
type nom (indice dbut: indice fin)
La plupart du temps, on omet l'indice dbut (qui sera 1), l'indice fin sera alors aussi le nombre de composantes. Il existe dans ce cas une seconde mthode pour dclarer le tableau :
type nom dimension nom(nombre)
exemple :
real vecteur(3)
ou
real vecteur dimension vecteur(3)
exemple
x=(vecteur(i)-vecteur(1))/vecteur(i+1)
Attention, c'est au programmeur de vrifier qu'il utilise toujours des indices dans les limites dclares ! La dimension de tous les tableaux doit tre connue du compilateur, pour qu'il puisse grer la mmoire utilise par le programme,
avant mme que la premire instruction n'ait t excute . La dimension doit donc tre une constante, elle ne peut pas tre une variable que vous demanderiez l'utilisateur par un read. Par contre rien ne vous empche de dclarer une dimension assez importante, et n'utiliser qu'une partie du tableau, variable chaque utilisation du programme, mais toujours infrieure la dimension dclare. On ne peut, dans un programme, que traiter les composantes d'un tableau, pas son intgralit (par exemple, pour copier un tableau il faut, dans une boucle, copier toutes ses composantes). Par contre on peut passer un tableau en argument d'un sous-programme ou fonction. exemple :
real x(5) print *, 'moyenne: ',moy(x,5) --------real function moy(x,nb) real x(*),som integer nb,i som=x(1) do i=2,nb som=som+nb(i) enddo moy=som/nb end function moy
Dans la dclaration, la dimension du tableau n'a besoin d'tre donne que dans l'entit qui rserve la place ncessaire en mmoire, pas pour ceux qui reoivent le tableau en argument, qui mme si on leur donne la dimension ne s'en servent pas. C'est pourquoi il vaut mieux indiquer * (certains programmeurs dimensionnent 1 les tableaux reus en arguments, mais c'est peu clair). Une autre solution est de la passer en argument (ou mme une dimension infrieure la dimension relle, mais pas plus grande), dans la fonction ci-dessus on dclarerait real x(nb). Vous pouvez voir ici un programme de base sur les tableaux (tab-sp.f) Pour reprsenter une matrice, on utilise un tableau bidimensionnel. La dclaration est :
type nom (deb lig:fin lig , deb col:fin col)
l'appel est
nom(indice ligne, indice colonne)
Dans la pratique, le compilateur range en mmoire toute la premire ligne de la matrice, puis la seconde, la troisime... Mais tant que vous n'tes pas spcialistes, il vaut mieux l'ignorer. Rappelez-vous qu'en gnral le premier indice est la ligne, le second la colonne (licol). On peut tendre des dimensions suprieures, mais en se limitant la 7 dimension. Exemple :
integer rubiks(3,3,3)
Attention, en cas de passage en arguments de tableaux multidimensionnels, toutes les dimensions doivent tre dclares exactement, sauf la dernire qui peut tre * (en gnral on les donne toutes). Mais la solution idale est de passer les dimensions en arguments (obligatoirement la dimension exacte, sauf pour la dernire qui peut tre infrieure si c'est vraiment utile). exemple :
program matrice integer maxlig,maxcol parameter(maxlig=5,maxcol=3) real m(maxlig,maxcol) integer il,ic do il=1,maxlig do ic=1,maxcol m(il,ic)=il+(ic/10.0) enddo enddo call affmat(m,maxlig,maxcol) end subroutine affmat(mat,diml,dimc) implicit none integer diml,dimc real mat(diml,dimc) integer il,ic do il=1,diml print *,('M(',il,ic,')=',m(il,ic),ic=1,dimc) enddo end
Il est galement possible d'initialiser des variables. C'est dire fixer une valeur initiale une variable, mais cette valeur pourra changer au cours du programme. On utilise pour cela la dclaration DATA :
DATA liste de variables / liste de valeurs initiales /
exemple :
real x,y data x,y / 0.0 , 0.5 /
on peut remplacer une suite de valeurs identiques par "nombre*valeur". On peut galement initialiser des tableaux :
real t(2,5) data t / 5*0.0, 1.0, 4*0.0 /
Mme si un data se trouve dans une subroutine, l'initialisation ne sera effectue qu'une fois, au dbut de l'excution du programme.
ce qui donne dans z : "bonsoir c'est toi" On peut crer des tableaux de chanes. Par exemple : character*10 txt(20) On peut aussi comparer des chaines. Par .EQ. et .NE. mais aussi l'aide des fonctions LGE, LGT, LLE ou LLT. Par exemple, LGE(c1,c2) est .TRUE. si a1 est suprieur ou gal c2 (dans l'ordre alphabtique). Il existe d'autres fonctions spcifiques aux chanes de caractres : ichar(i) donne le caractre dont le code ASCII est l'entier i, char(c) donne le numro de code du caractre c. Pour trouver la position de la sous-chane sc dans la chane plus longue lc : index(lc,sc).
La conversion n'est faite que lorsque c'est ncessaire. Dans la plupart des cas, c'est la meilleure solution car la plus rapide. Il n'y a que dans le cas de la division que le rsultat est diffrent suivant les cas. En effet, la division de deux entiers donne un entier (et un reste, mais il est ignor). Par exemple, si x et y=2 sont rels, i=5 et j=3 sont des entiers, alors x=y+i/j met 3 dans x : la division est prioritaire l'addition, donc on l'effectue en premier. Les deux oprandes i et j sont de mme type donc 5/3 donne 1 (reste 2); y et 1 sont de type diffrent donc 1 est converti en 1.0, et additionn y pour donner 3.0 qui est stock dans x. De mme, l'affectation (variable=calcul) calcule d'abord l'expression droite du signe =, ce n'est qu'aprs qu'il regarde le type de la variable devant recevoir le rsultat pour faire, s'il le faut, une conversion. Vous pouvez donc crire x=i mais pas i=x. exemple :
double precision x,y,z x=5/3 y=5.0/3.0 z=5D0/3D0 print 10,x,y,z
10
format (f18.15)
affichera :
1.000000000000000 1.666666626930237 1.666666666666667
ATTENTION : la conversion n'est automatique que dans ces cas. En particulier, elle n'est pas effectue entre les arguments rels et formels d'un sousprogramme ou fonction
nint
idnint sngl
Ici aussi, faites attention aux divisions : float(5/3) ne vaut pas float(5)/float(3)
valeur absolue minimum maximum sinus cosinus tangente arccos arcsin arctan
Le common sera dclar dans chaque entit de programme (sous-programme, fonction) qui doit accder aux variables communes. Le nom dfinit le common. Les variables communes par contre sont dfinies par leur ordre, et pourraient avoir des noms diffrents dans toutes les entits (mais je vous le dconseille fortement), et doivent y tre dclares. Il peut y avoir plusieurs common diffrents, mais une variable ne peut appartenir qu' un seul common. Exemple : dans un programme d'analyse de l'volution de la temprature, toutes les entits doivent connatre les diffrentes tempratures (et leur nombre)
real maxi() common/temp/nb,t integer nb,i real t(100),m m=t(1) DO 100 i=2,nb if(t(i).gt.m)m=t(i) 100 continue maxi=m return end c program main
Les variables des diffrents common peuvent tre initialises (si ncessaire) dans une entit nomme bloc data qui ne peut comporter que des common, des dclarations et des data :
block data common/temp/nb,t integer nb real t(100) data nb /0/ end block data
Ne mettez qu'un seul block data dans un programme ! Pour viter de recopier partout les mmes common, on peut utiliser l'instruction
INCLUDE 'nomd1fichier'
Le fichier dsign est inclus cet endroit. Attention, cette possibilit n'est pas disponible partout, mais sous g77 elle l'est (comme d'ailleurs toules les directives # du C).
Si le numro est donn en premier, il n'est pas ncessaire de le prcder par UNIT=. C'est le programmeur qui fixe le numro, il doit tre unique dans le programme et ne peut tre variable (mais un parameter est
possible). Le nom du fichier peut tre donn directement entre apostrophes, ou tre une variable chane (c'est galement le cas pour d'autres arguments mais moins courant). Le statut est optionnel, il vaut soit NEW si le fichier doit obligatoirement ne pas exister avant (pour ne pas l'craser), soit OLD s'il doit exister avant (pour la lecture par exemple), soit SCRATCH si le programme doit le crer le temps du programme et le dtruire la fin, soit UNKNOWN (ou ne rien mettre) s'il doit l'ouvrir, aprs l'avoir cr si ncessaire. APPEND permet de se placer la fin du fichier (pour rajouter du texte la suite). En cas de refus d'ouverture, la variable dsigne par IOSTAT reoit un code d'erreur (0 si ok), et le programme saute directement au label dsign par ERR (s'il sont omis, le programme s'arrte en cas d'erreur). On peut aussi utiliser le fichier en accs direct (ACCESS='DIRECT') en imposant la taille des enregistrements (RECL=entier), qui seront soit directement crits en binaire dans le fichier (FORM='UNFORMATED') soit traduits en ASCII (FORM='FORMATED').
Il y a deux units qui sont automatiquement ouvertes au dbut du programme : 5 pour le clavier et 6 pour l'cran. Lorsque vous avez fini d'utiliser un flux, il faut le refermer, en particulier pour en donner accs aux autres. Tout flux non encore ferm le sera automatiquement la fin du programme. Pour cela, on utilise l'instruction :
close(unit=numro,IOSTAT=variable, ERR=label)
exemple :
open(10,FILE='resultats.txt') ---- etc ---close(10)
Les options sont identiques l'open, plus END qui donne le label o doit sauter le programme quand on est arriv la fin du fichier (pratique quand on n'en connat pas la longueur). En cas d'criture l'cran, l'unit est 6, mais on peut l'appeler *. On peut mme utiliser
print format, liste de variables
Pour la lecture au clavier, l'unit est 5, mais on peut l'appeler *. On peut galement utiliser :
read format, liste de variables
La liste de variables contient des variables ou expressions spares par des virules, mais on peut galement utiliser une "boucle implicite" :
(expression contenant un indice, indice=dbut,fin,pas)
'texte entre apostrophes' : le texte est crit tel quel In : entier sur n caractres (avec espaces devant si le nombre est plus petit) An : chane sur n caractres (avec rajout d'espaces en fin si ncssaire) Fn.p : rel sur f caractres dont p aprs la virgule (F5.2 donne 12.45) En.p : rel en notation scientifique dont p pour la partie dcimale (l'exposant en prend 4, ne pas oublier le . et peut-tre le signe -) (E9.2 donne -2.45E+09) Gn.p : rel en Fn.p si possible, En.p s'il est trop grand Dn.p : idem En.p mais pour un rel double prcision X : un espace (ou ignorer un caractre, dans le cas d'un read) / : un retour la ligne (ou ignorer la fin de la ligne dans un read)
Un composant prcd d'un entier n est rpt n fois. Pour rpter plusieurs composants, il faut les mettre entre parenthses : 3(5X,2I1) : 3 fois (5 espaces et 2 entiers d'un chiffre). Exemples :
10 11
write (*,10) nb,moy format ('la moyenne des ',I2,'tempratures est de ',F5.1,' degrs') write (*,11) ((mat(i,j),i=1,4),j=1,4) format ('la matrice est',4(/,'|', 4F5.2,'|')
Chaque read ou write correspond une ligne. Si l'on donne une liste de plusieurs variables dans un read, il faudra absolument entrer toutes les valeurs (entre espaces ou virgules) avant la touche Entre. Mais certains compilateurs (G77 par exemple) considrent qu'un caractre '$' en fin de format demande de ne pas retourner la ligne. remarque : on peut galement crire ou lire dans une variable chane de caractres, il suffit de remplacer le numro d'unit par le nom de la chane. De mme, le format peut tre une chane.
character*40 fmt integer i,nbchif data i /123/ , nbchif /4/ write(fmt,10) nbchif format(' ''*'',I',I1,',''*''') write (*,*) 'pour vrification FMT vaut:',fmt write (*,fmt) i
10
ceci affichera :
pour vrification FMT vaut:( '*',I4,'*') * 123*