Учебники

Фортран — Модули

Модуль подобен пакету, в котором вы можете хранить свои функции и подпрограммы, если вы пишете очень большую программу или ваши функции или подпрограммы могут использоваться более чем в одной программе.

Модули предоставляют вам способ разделения ваших программ между несколькими файлами.

Модули используются для —

  • Упаковка подпрограмм, блоков данных и интерфейса.

  • Определение глобальных данных, которые могут использоваться более чем одной подпрограммой.

  • Объявление переменных, которые можно сделать доступными в любых подпрограммах по вашему выбору.

  • Полностью импортировать модуль для использования в другую программу или подпрограмму.

Упаковка подпрограмм, блоков данных и интерфейса.

Определение глобальных данных, которые могут использоваться более чем одной подпрограммой.

Объявление переменных, которые можно сделать доступными в любых подпрограммах по вашему выбору.

Полностью импортировать модуль для использования в другую программу или подпрограмму.

Синтаксис модуля

Модуль состоит из двух частей —

  • часть спецификации для декларации операторов
  • a содержит часть для определения подпрограммы и функции

Общая форма модуля —

module name     
   [statement declarations]  
   [contains [subroutine and function definitions] ] 
end module [name]

Использование модуля в вашей программе

Вы можете включить модуль в программу или подпрограмму с помощью оператора use —

use name  

Обратите внимание, что

  • Вы можете добавить столько модулей, сколько нужно, каждый будет в отдельных файлах и скомпилирован отдельно.

  • Модуль может использоваться в различных программах.

  • Модуль может использоваться много раз в одной и той же программе.

  • Переменные, объявленные в части спецификации модуля, являются глобальными для модуля.

  • Переменные, объявленные в модуле, становятся глобальными переменными в любой программе или подпрограмме, где используется модуль.

  • Оператор использования может появляться в основной программе или в любой другой подпрограмме или модуле, который использует процедуры или переменные, объявленные в определенном модуле.

Вы можете добавить столько модулей, сколько нужно, каждый будет в отдельных файлах и скомпилирован отдельно.

Модуль может использоваться в различных программах.

Модуль может использоваться много раз в одной и той же программе.

Переменные, объявленные в части спецификации модуля, являются глобальными для модуля.

Переменные, объявленные в модуле, становятся глобальными переменными в любой программе или подпрограмме, где используется модуль.

Оператор использования может появляться в основной программе или в любой другой подпрограмме или модуле, который использует процедуры или переменные, объявленные в определенном модуле.

пример

Следующий пример демонстрирует концепцию —

Live Demo

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   

Доступность переменных и подпрограмм в модуле

По умолчанию все переменные и подпрограммы в модуле делаются доступными для программы, использующей код модуля, с помощью оператора использования .

Однако вы можете контролировать доступность кода модуля, используя атрибуты private и public . Когда вы объявляете некоторую переменную или подпрограмму как приватную, она недоступна за пределами модуля.

пример

Следующий пример иллюстрирует концепцию —

В предыдущем примере у нас было две переменные модуля, e и pi. Давайте сделаем их приватными и посмотрим на результат —

Live Demo

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 оба объявлены как private, программа module_example больше не может обращаться к этим переменным.

Однако другие подпрограммы модуля могут получить к ним доступ —

Live Demo

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

Когда вы компилируете и запускаете вышеуказанную программу, она дает следующий результат —