TetaTricks/chap/Fortran.tex

137 lines
4.0 KiB
TeX
Raw Normal View History

2020-12-12 04:13:54 +01:00
\chapter{Fortran} \label{chap:Fortran} \index{Fortran}
Fortran (\textsc{FORmula TRANslator}) est, avec le Cobol\index{Cobol},
un des premiers langages évolués. Il a été conçu après la seconde
guerre mondiale, en 1954, par
John Warner Backus, ingénieur en radiophonie chez IBM\index{IBM},
2021-12-23 20:06:52 +01:00
% ========================================
2020-12-12 04:13:54 +01:00
\section{F77}
Dernière version à exiger le format '80 colonnes' des cartes perforées,
cette version est aussi (aux yeux de vieux dinos) la plus pure,
à cause d'instructions comme le \textsl{computed goto} ou le
mythique \textsl{comefrom}. Nom officiel : \texttt{ANSI X3.9-1978}.
2022-01-01 00:04:23 +01:00
% ============****************===============
% https://linuxfr.org/users/vmagnin/journaux/taptempo-fortran
2021-12-23 20:06:52 +01:00
\section{Gfortan} \index{gfortran}
2020-12-12 04:13:54 +01:00
Puis ce langage du passé a subi une évolution lente vers quelque
2021-12-23 20:06:52 +01:00
chose de bien plus moderne : le Fortran 90.
Les dinos vont devoir s'adapter. Et utiliser \texttt{gfortran},
2022-02-16 00:53:49 +01:00
un élément de la Gnu Compiler Collection\index{gcc}.
2021-12-23 20:06:52 +01:00
2022-02-16 00:53:49 +01:00
Comme pour tous les langages de programmation,
il est obligatoire d'avoir l'exemple canonique, donc le voilà.
2021-12-23 20:06:52 +01:00
Il faut l'enregister dans un fichier nommé \texttt{hello.f90}
2022-01-01 00:04:23 +01:00
pour que le compilateur puisse admettre que c'est écrit
en \textsl{free form format}.
2021-12-23 20:06:52 +01:00
\begin{verbatim}
2022-01-01 00:04:23 +01:00
$ cat hello.f90
2021-12-23 20:06:52 +01:00
program hello
implicit none
print *, "hello world"
end
2022-01-01 00:04:23 +01:00
$ gfortran -Wall hello.f90 -o hello && ./hello
hello world
$
2021-12-23 20:06:52 +01:00
\end{verbatim}
2022-01-19 23:31:51 +01:00
% --------------------------------------------------------
2022-04-03 11:56:49 +02:00
%
% https://fortranwiki.org/fortran/show/Command-line+arguments
%
2022-01-19 23:31:51 +01:00
\section{Args \& Env}
Un fort beau programme, mais il est un peu fermé au monde extérieur.
Quand on lance un programme, il peut recevoir des instructions
par (mais pas que) deux canaux : les arguments de la ligne de commande
et les variables d'environnement.
\begin{verbatim}
program rum_me
implicit none
integer :: nbarg, foo
character(len=32) :: arg
nbarg = IARGC()
if (nbarg .GT. 0) then
do foo=1, nbarg
call GETARG(foo, arg)
print *, foo," ", arg
enddo
endif
end
\end{verbatim}
2022-02-16 00:53:49 +01:00
Si un des arguments doir être vu comme une valeur numérique,
il faut la convertir avant usage.
\begin{verbatim}
character(len=89) :: arg
real :: cx
call getarg(2, string) ; read (string, *) cx
\end{verbatim}
2022-01-01 00:04:23 +01:00
% --------------------------------------------------------
2021-12-23 20:06:52 +01:00
2022-04-03 11:56:49 +02:00
\section{Tableaux}
2021-12-23 20:06:52 +01:00
2022-01-19 23:31:51 +01:00
Rank, Size, \textsc{allocatable}, toussa\dots
2022-01-01 00:04:23 +01:00
2022-04-03 11:56:49 +02:00
Amies du C, soyez d'entrée prévenues, en Fortran, l'indice
par défaut du premier élément d'un tablesu est \textbf{1},
mais cette valeur peut être modifiée à la déclaration
du tableau.
2022-01-01 00:04:23 +01:00
% --------------------------------------------------------
2022-04-03 11:56:49 +02:00
\section{Fichiers}
2022-02-16 00:53:49 +01:00
Pour qui vient du C et de la philosophie Unix, la gestion
des fichiers en Fortran est assez déroutante%
\footnote{Par contre, pour un dino des \textsl{big irons}\dots}.
Il semble qu'il y ait deux concepts orthogonaux.
2022-04-01 14:23:45 +02:00
\textit{Open, Read, Write, Inquire, toussa\dots}
2022-02-16 00:53:49 +01:00
% --------------------------------------------------------
2022-04-03 11:56:49 +02:00
\section{Modules}
2022-01-01 00:04:23 +01:00
Une notion essentielle, à mon avis, pour écrire des programmes
2022-01-19 23:31:51 +01:00
au-delà de 104 lignes. Oui, j'avoue, j'ai bien changé depuis
2022-02-16 00:53:49 +01:00
l'époque où je confectionnait des procédures \textsl{monobloc}
de 1337 lignes, avec une bonne centaine de \texttt{GOTO} dedans.
2021-12-23 20:06:52 +01:00
2022-04-01 14:23:45 +02:00
% --------------------------------------------------------
2022-04-03 11:56:49 +02:00
\section{Random et Aléa}
2022-04-01 14:23:45 +02:00
La dernière ligne va vous étonner.
\begin{verbatim}
integer, dimension(3) :: tarray
integer :: t3
real :: dummy
call itime(tarray)
t3 = 3600*tarray(1) + 60*tarray(2) + tarray(3)
write(0, '(A,3I3,A,I6)') "sranding: ", tarray, " --> ", t3
call srand(t3)
! after initializing the random generator engine,
! you MUST use it for initializing the initializer
dummy = rand()
\end{verbatim}
2022-01-01 00:04:23 +01:00
% --------------------------------------------------------
2022-04-03 11:56:49 +02:00
\section{Images}
2022-01-01 00:04:23 +01:00
2022-01-19 23:31:51 +01:00
Plplot semble être un bon choix pour commencer.
2022-01-01 00:04:23 +01:00
% ========================================