- Tutte le variabili e le costanti dichiarate nella parte
dichiarativa di un modulo (prima del CONTAINS), così come
tutti i sottoprogrammi in esso contenuti (esclusi eventuali
sottoprogrammi interni ai sottoprogrammi stessi), hanno di
default l'attributo PUBLIC, sono cioè accessibili
dalle unità di programma che fanno USE di quel modulo.
- È possibile cambiare questo comportamento, ad esempio per evitare
che altre routine vadano a "rovinare" lo stato delle variabili di un
modulo o facciano cattivo uso di una subroutine che è utile solo al
modulo stesso, utilizzando l'attributo PRIVATE:
- incorporato nella dichiarazione di variabili e costanti
- su una riga a parte, con un elenco di variabili, costanti e/o
sottoprogrammi
- L'attributo PRIVATE da solo su una riga fa sì che
PRIVATE diventi il default per il modulo corrente e si
debbano quindi dichiarare esplicitamente come PUBLIC tutti i
simboli che il modulo desidera mettere a disposizione.
|
PROGRAM rete_oss
USE stazioni
IMPLICIT NONE
CHARACTER (LEN=20), rnome
REAL :: rlon, rlat, rt
DO WHILE(.TRUE.)
READ*, rnome, rlon, rlat, rt
IF (rlon < -361.) EXIT
CALL aggiungi_staz(rnome, rlon, rlat, rt)
ENDDO
PRINT'(A,I3,A)','Ho letto ',get_nstaz(),' stazioni'
CALL elabora_temp()
END PROGRAM rete_oss
|
MODULE stazioni
IMPLICIT NONE
INTEGER, PARAMETER :: nstazmax=100
INTEGER :: nstaz = 0
REAL :: lon(nstazmax), lat(nstazmax), t(nstazmax)
CHARACTER (LEN=20) :: nome(nstazmax)
PRIVATE nstaz
CONTAINS
SUBROUTINE aggiungi_staz(nnome, nlon, nlat, nt)
CHARACTER (LEN=*), INTENT(IN) :: nnome
REAL, INTENT(IN) :: nlon, nlat, nt
IF (nstaz < nstazmax) THEN
nstaz = nstaz + 1
nome(nstaz) = nnome
lon(nstaz) = nlon
lat(nstaz) = nlat
t(nstaz) = nt
ELSE
PRINT*,'Raggiunto il massimo delle stazioni'
ENDIF
END SUBROUTINE aggiungi_staz
SUBROUTINE stampa_anag()
INTEGER :: i
DO i = 1, nstaz
PRINT'(A,2F7.2)',TRIM(nome(i)),lon(i),lat(i)
ENDDO
END SUBROUTINE stampa_anag
SUBROUTINE elabora_temp()
IF (nstaz > 0) THEN
PRINT'(A,F9.2)','Temperatura media:', SUM(t(1:nstaz))/nstaz
ENDIF
END SUBROUTINE elabora_temp
INTEGER FUNCTION get_nstaz()
get_nstaz = nstaz
END FUNCTION get_nstaz
END MODULE stazioni
|