From 181b90064e45cc28291e4e766b0dc3c636df3142 Mon Sep 17 00:00:00 2001 From: Leonardo Robol Date: Wed, 21 Oct 2009 20:31:14 +0200 Subject: [PATCH] Estesa la parte sul fortran 95 con qualche sempio di I/O --- AppFortran.tex | 76 ++++++++++++++++++++++++++++++++++++++++++++++++-- CalcoloScientifico.tex | 2 +- 2 files changed, 75 insertions(+), 3 deletions(-) diff --git a/AppFortran.tex b/AppFortran.tex index b7222ab..d10872b 100644 --- a/AppFortran.tex +++ b/AppFortran.tex @@ -70,6 +70,23 @@ Si possono aggiungere delle parole chiave alle dichiarazioni di tipi, più preci \begin{itemize} \item \lstinline-PARAMETER-: questa indica che la variabile non verrà modificata, è semplicemente un parametro per il programma. + \item \lstinline-ALLOCATABLE-: Questo parola chiave indica che la memoria per la variabile verrà + allocata esplicitamente in un secondo momento, è particolarmente utile con l'altra parola chiave + \item \lstinline-DIMENSION-: questa permette di speicificare che la variabile dichiarate è un array + e la sua relativa dimensione (Esempio: \lstinline- INTEGER, DIMENSION(5) :: vec-); è possibile specificare + \lstinline-:- come dimensione, nel qual caso il compilatore assumerà che la dimensione verrà determinata + in un secondo momento. Un caso tipico è la creazione di un vettore la cui dimensione verrà determinata + a run-time\footnote{ovvero durante l'esecuzione.}; questo si può realizzare con un codice di questo tipo + \begin{lstlisting}[frame=tb] + PROGRAM allocatore + INTEGER , ALLOCATABLE :: i + INTEGER :: size + ! Leggo da tastiera la dimensione dell'array e lo alloco + READ(*,*) size + ALLOCATE(i(size)) + END PROGRAM + \end{lstlisting} + \end{itemize} I tipi principali presenti in Fortran sono \begin{itemize} @@ -82,6 +99,61 @@ I tipi principali presenti in Fortran sono INTEGER, PARAMETER :: db = KIND(0.D0) REAL(dp) :: real_var \end{lstlisting} - + che si occuperà di assegnare al tipo \lstinline-REAL- dichiarato la stessa dimensione delle costante di tipo + \texttt{double} \lstinline-0.D0-. +\end{itemize} + +\subsection{Input e Output} +Per iniziare ci basterà conoscere le istruzioni di stampa su schermo e lettura da tastiera, che sono rispettivamente +\begin{itemize} + \item \lstinline-WRITE(*,*) dato_1, dato_2 , ...- che si occuperà di scrivere sullo schermo (identificato dal primo + \lstinline-*-) e con una formattazione standard (identificata dal secondo \lstinline-*-) i dati che gli inseriamo dopo; + \item \lstinline-READ(*,*) var_1, var_2, ...- che si occuperà di leggere da tastiera (il primo \lstinline-*-) i dati + in un formato standard (il secondo \lstinline-*-); \end{itemize} - \ No newline at end of file +In realtà queste istruzioni ci permettono di controllare anche formattazioni e sorgenti e destinazioni di Input e Output. +Per scrivere (o leggere) su un file è prima necessario \textbf{aprirlo}. Per fare questo bisogna eseguire una +chiamata alla funzione \lstinline-OPEN()-. Questa si occuperà di aprire un file da noi indicata ed assegnarlo ad +un numero intero, anche quello indicato da noi. Bisogna fare attenzione in quest'ultimo passaggio a ricordare +che \lstinline-5- e \lstinline-6- sono già riservati alla tastiera ed allo schermo. +Potremmo poi fare riferimento (sia in lettura che in scrittura) +a quel determinato file sostituendo quell'intero a \lstinline-*-. Questo codice probabilmente chiarirà meglio la questione. +\begin{lstlisting}[frame=tb] + PROGRAM CopiaIncolla + IMPLICIT NONE + + ! Dichiaro delle variabili intere di tipo PARAMETER + ! per contenere gli interi con cui poi mi riferiro' ai file. + ! Sarebbe infatti complicato dover ricordare tanti numeri + ! a memoria e renderebbe il codice meno leggibile + INTEGER, PARAMETER :: infile = 11, outfile = 12 + INTEGER :: j + INTEGER :: buf + + ! Cerco di aprire il file in.txt + OPEN(FILE='in.txt', UNIT=infile) + + ! E anche il file out.txt + OPEN(FILE='out.txt', UNIT=outfile) + + ! Leggo le prime 10 righe da questo file + ! e le scrivo su out.txt, raddoppiate (assumendo + ! che siano interi) + DO j=1,10 + READ(infile,*) buf + WRITE(outfile,*) buf * 2 + END DO + + ! Alla chiusura del programma anche tutti i file vengono chiusi, + ! e quindi questo rende le prossime righe superflue. Pero' e' buona + ! norma ricordarsi di chiudere i file che si sono aperti, e quindi + ! lo facciamo + CLOSE(infile) + CLOSE(outfile) + + END PROGRAM +\end{lstlisting} +Abbiamo qui introdotto anche la chiamata \lstinline-CLOSE()- che serve appunto per +chiudere un file. \`E normalmente buona norma chiudere tutti i file che si aprono e quindi, +in programma corposi, conviene sempre scrivere la chiamata ad \lstinline-OPEN()- insieme +alla chiamata \lstinline-CLOSE()- per evitare di dimenticarla. \ No newline at end of file diff --git a/CalcoloScientifico.tex b/CalcoloScientifico.tex index 28cc913..c929e02 100644 --- a/CalcoloScientifico.tex +++ b/CalcoloScientifico.tex @@ -131,7 +131,7 @@ \lstset{backgroundcolor=\color{listinggray}} \lstset{frameround=trbl} \lstset{% general command to set parameter(s) - basicstyle=\small\ttfamily, % print whole listing small + basicstyle=\footnotesize\ttfamily, % print whole listing small keywordstyle=\color{black}\bfseries\underbar, % underlined bold black keywords identifierstyle=, % nothing happens -- 2.1.4