Estesa la parte sul fortran 95 con qualche sempio di I/O
Leonardo Robol [2009-10-21 18:31]
Estesa la parte sul fortran 95 con qualche sempio di I/O
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