Fortran - Moduli
Un modulo è come un pacchetto in cui puoi conservare le tue funzioni e subroutine, nel caso tu stia scrivendo un programma molto grande, o le tue funzioni o subroutine possono essere usate in più di un programma.
I moduli forniscono un modo per suddividere i programmi tra più file.
I moduli sono utilizzati per:
Packaging sottoprogrammi, dati e blocchi di interfaccia.
Definizione di dati globali che possono essere utilizzati da più di una routine.
Dichiarazione di variabili che possono essere rese disponibili all'interno di qualsiasi routine scelta.
Importare un modulo interamente, per l'uso, in un altro programma o subroutine.
Sintassi di un modulo
Un modulo è composto da due parti:
- una parte specifica per la dichiarazione delle istruzioni
- a contiene una parte per le definizioni di subroutine e funzioni
La forma generale di un modulo è:
module name
[statement declarations]
[contains [subroutine and function definitions] ]
end module [name]
Utilizzo di un modulo nel programma
È possibile incorporare un modulo in un programma o in una subroutine mediante l'istruzione use -
use name
Si prega di notare che
È possibile aggiungere tutti i moduli necessari, ciascuno in file separati e compilato separatamente.
Un modulo può essere utilizzato in vari programmi differenti.
Un modulo può essere utilizzato più volte nello stesso programma.
Le variabili dichiarate in una parte di specifica del modulo sono globali per il modulo.
Le variabili dichiarate in un modulo diventano variabili globali in qualsiasi programma o routine in cui viene utilizzato il modulo.
L'istruzione use può apparire nel programma principale o in qualsiasi altra subroutine o modulo che utilizza le routine o le variabili dichiarate in un particolare modulo.
Esempio
Il seguente esempio dimostra il concetto:
module constants
implicit none
real, parameter :: pi = 3.1415926536
real, parameter :: e = 2.7182818285
contains
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
end module constants
program module_example
use constants
implicit none
real :: x, ePowerx, area, radius
x = 2.0
radius = 7.0
ePowerx = e ** x
area = pi * radius**2
call show_consts()
print*, "e raised to the power of 2.0 = ", ePowerx
print*, "Area of a circle with radius 7.0 = ", area
end program module_example
Quando compili ed esegui il programma sopra, produce il seguente risultato:
Pi = 3.14159274
e = 2.71828175
e raised to the power of 2.0 = 7.38905573
Area of a circle with radius 7.0 = 153.938049
Accessibilità di variabili e subroutine in un modulo
Per impostazione predefinita, tutte le variabili e le subroutine in un modulo sono rese disponibili al programma che sta utilizzando il codice del modulo, dal use dichiarazione.
Tuttavia, è possibile controllare l'accessibilità del codice del modulo utilizzando il private e publicattributi. Quando dichiari una variabile o una subroutine come privata, non è disponibile all'esterno del modulo.
Esempio
L'esempio seguente illustra il concetto:
Nell'esempio precedente, avevamo due variabili di modulo, e e pi. Rendiamoli privati e osserviamo l'output -
module constants
implicit none
real, parameter,private :: pi = 3.1415926536
real, parameter, private :: e = 2.7182818285
contains
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
end module constants
program module_example
use constants
implicit none
real :: x, ePowerx, area, radius
x = 2.0
radius = 7.0
ePowerx = e ** x
area = pi * radius**2
call show_consts()
print*, "e raised to the power of 2.0 = ", ePowerx
print*, "Area of a circle with radius 7.0 = ", area
end program module_example
Quando compili ed esegui il programma sopra, viene visualizzato il seguente messaggio di errore:
ePowerx = e ** x
1
Error: Symbol 'e' at (1) has no IMPLICIT type
main.f95:19.13:
area = pi * radius**2
1
Error: Symbol 'pi' at (1) has no IMPLICIT type
Da e e pi, entrambi sono dichiarati privati, il programma module_example non può più accedere a queste variabili.
Tuttavia, altre subroutine del modulo possono accedervi -
module constants
implicit none
real, parameter,private :: pi = 3.1415926536
real, parameter, private :: e = 2.7182818285
contains
subroutine show_consts()
print*, "Pi = ", pi
print*, "e = ", e
end subroutine show_consts
function ePowerx(x)result(ePx)
implicit none
real::x
real::ePx
ePx = e ** x
end function ePowerx
function areaCircle(r)result(a)
implicit none
real::r
real::a
a = pi * r**2
end function areaCircle
end module constants
program module_example
use constants
implicit none
call show_consts()
Print*, "e raised to the power of 2.0 = ", ePowerx(2.0)
print*, "Area of a circle with radius 7.0 = ", areaCircle(7.0)
end program module_example
Quando compili ed esegui il programma sopra, produce il seguente risultato:
Pi = 3.14159274
e = 2.71828175
e raised to the power of 2.0 = 7.38905573
Area of a circle with radius 7.0 = 153.938049