Fortran - moduły
Moduł jest jak pakiet, w którym możesz zachować swoje funkcje i podprogramy na wypadek, gdybyś pisał bardzo duży program lub gdy twoje funkcje lub podprogramy mogły być używane w więcej niż jednym programie.
Moduły umożliwiają dzielenie programów między wiele plików.
Moduły są używane do -
Pakowanie podprogramów, bloków danych i interfejsów.
Definiowanie danych globalnych, które mogą być używane przez więcej niż jedną procedurę.
Deklarowanie zmiennych, które można udostępnić w ramach dowolnych wybranych procedur.
Całkowite importowanie modułu w celu użycia do innego programu lub podprogramu.
Składnia modułu
Moduł składa się z dwóch części -
- część specyfikacji do deklaracji oświadczeń
- a zawiera część dla definicji podprogramów i funkcji
Ogólna forma modułu to -
module name
[statement declarations]
[contains [subroutine and function definitions] ]
end module [name]
Używanie modułu do programu
Możesz włączyć moduł do programu lub podprogramu za pomocą instrukcji use -
use name
Proszę to zanotować
Możesz dodać tyle modułów, ile potrzeba, każdy będzie w osobnych plikach i skompilowany oddzielnie.
Moduł może być używany w różnych programach.
Moduł może być używany wielokrotnie w tym samym programie.
Zmienne zadeklarowane w części specyfikacji modułu są globalne dla modułu.
Zmienne zadeklarowane w module stają się zmiennymi globalnymi w dowolnym programie lub procedurze, w której moduł jest używany.
Instrukcja use może pojawić się w programie głównym lub w dowolnym innym podprogramie lub module, który używa procedur lub zmiennych zadeklarowanych w określonym module.
Przykład
Poniższy przykład ilustruje koncepcję -
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
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
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
Dostępność zmiennych i podprogramów w module
Domyślnie wszystkie zmienne i podprogramy w module są udostępniane programowi, który używa kodu modułu, przez use komunikat.
Możesz jednak kontrolować dostępność kodu modułu za pomocą private i publicatrybuty. Kiedy deklarujesz jakąś zmienną lub procedurę jako prywatną, nie jest ona dostępna poza modułem.
Przykład
Poniższy przykład ilustruje koncepcję -
W poprzednim przykładzie mieliśmy dwie zmienne modułu, e i pi. Uczyńmy je prywatnymi i obserwujmy wyniki -
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
Kiedy kompilujesz i uruchamiasz powyższy program, wyświetla następujący komunikat o błędzie -
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
Od e i pi, oba są deklarowane jako prywatne, program przykład_modułu nie ma już dostępu do tych zmiennych.
Jednak dostęp do nich mają inne podprogramy modułu -
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
Kiedy kompilujesz i wykonujesz powyższy program, daje on następujący wynik -
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