\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}, % ======================================== \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}. % ============****************=============== % https://linuxfr.org/users/vmagnin/journaux/taptempo-fortran \section{Gfortan} \index{gfortran} Puis ce langage du passé a subi une évolution lente vers quelque chose de bien plus moderne : le Fortran 90. Les dinos vont devoir s'adapter. Et utiliser \texttt{gfortran}, un élément de la Gnu Compiler Collection\index{gcc}. Comme pour tous les langages de programmation, il est obligatoire d'avoir l'exemple canonique, donc le voilà. Il faut l'enregister dans un fichier nommé \texttt{hello.f90} pour que le compilateur puisse admettre que c'est écrit en \textsl{free form format}. \begin{verbatim} $ cat hello.f90 program hello implicit none print *, "hello world" end $ gfortran -Wall hello.f90 -o hello && ./hello hello world $ \end{verbatim} % -------------------------------------------------------- % % https://fortranwiki.org/fortran/show/Command-line+arguments % \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} 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} % -------------------------------------------------------- \section{Tableaux} Rank, Size, \textsc{allocatable}, toussa\dots 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. % -------------------------------------------------------- \section{Fichiers} 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. \textit{Open, Read, Write, Inquire, toussa\dots} % -------------------------------------------------------- \section{Modules} Une notion essentielle, à mon avis, pour écrire des programmes au-delà de 104 lignes. Oui, j'avoue, j'ai bien changé depuis l'époque où je confectionnait des procédures \textsl{monobloc} de 1337 lignes, avec une bonne centaine de \texttt{GOTO} dedans. % -------------------------------------------------------- \section{Random et Aléa} 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} % -------------------------------------------------------- \section{Images} Plplot semble être un bon choix pour commencer. % ========================================