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