Фортран - Модули
Модуль подобен пакету, в котором вы можете хранить свои функции и подпрограммы, если вы пишете очень большую программу или ваши функции или подпрограммы могут использоваться более чем в одной программе.
Модули позволяют разделить ваши программы между несколькими файлами.
Модули используются для -
Упаковка подпрограмм, данных и интерфейсных блоков.
Определение глобальных данных, которые могут использоваться более чем одной подпрограммой.
Объявление переменных, которые могут быть доступны в любых подпрограммах по вашему выбору.
Полный импорт модуля для использования в другую программу или подпрограмму.
Синтаксис модуля
Модуль состоит из двух частей -
- часть спецификации для объявления операторов
- a содержит часть для определений подпрограмм и функций
Общая форма модуля -
module name
[statement declarations]
[contains [subroutine and function definitions] ]
end module [name]
Использование модуля в вашей программе
Вы можете включить модуль в программу или подпрограмму с помощью оператора use -
use name
Обратите внимание, что
Вы можете добавить столько модулей, сколько нужно, каждый будет в отдельных файлах и скомпилирован отдельно.
Модуль можно использовать в разных программах.
Модуль можно использовать много раз в одной программе.
Переменные, объявленные в части спецификации модуля, являются глобальными для модуля.
Переменные, объявленные в модуле, становятся глобальными переменными в любой программе или подпрограмме, в которой используется модуль.
Оператор использования может появляться в основной программе или в любой другой подпрограмме или модуле, которые используют процедуры или переменные, объявленные в конкретном модуле.
пример
Следующий пример демонстрирует концепцию -
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
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
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
Доступность переменных и подпрограмм в модуле
По умолчанию, все переменные и подпрограммы в модуле становятся доступными для программы, использующей код модуля, с помощью use заявление.
Однако вы можете контролировать доступность кода модуля с помощью private и publicатрибуты. Когда вы объявляете какую-либо переменную или подпрограмму как частную, она недоступна вне модуля.
пример
Следующий пример иллюстрирует концепцию -
В предыдущем примере у нас было две переменные модуля, e и pi. Давайте сделаем их приватными и посмотрим на результат -
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
Когда вы компилируете и выполняете вышеуказанную программу, она выдает следующее сообщение об ошибке -
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
поскольку e и pi, оба объявлены закрытыми, программа module_example больше не может обращаться к этим переменным.
Однако другие подпрограммы модуля могут получить к ним доступ -
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
Когда вы компилируете и выполняете вышеуказанную программу, она дает следующий результат:
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