Unità di programma: Moduli, simboli pubblici e privati

  • 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