Fortran - โมดูล

โมดูลเปรียบเสมือนแพ็กเกจที่คุณสามารถเก็บฟังก์ชันและรูทีนย่อยของคุณไว้ได้ในกรณีที่คุณเขียนโปรแกรมขนาดใหญ่มากหรือฟังก์ชันหรือรูทีนย่อยของคุณสามารถใช้ในโปรแกรมได้มากกว่าหนึ่งโปรแกรม

โมดูลช่วยให้คุณสามารถแยกโปรแกรมของคุณระหว่างไฟล์ต่างๆ

โมดูลใช้สำหรับ -

  • โปรแกรมย่อยบรรจุภัณฑ์ข้อมูลและบล็อกอินเทอร์เฟซ

  • การกำหนดข้อมูลส่วนกลางที่สามารถใช้ได้กับรูทีนมากกว่าหนึ่งรายการ

  • การประกาศตัวแปรที่สามารถใช้ได้ภายในกิจวัตรที่คุณเลือก

  • การนำเข้าโมดูลทั้งหมดเพื่อใช้ในโปรแกรมหรือรูทีนย่อยอื่น

ไวยากรณ์ของโมดูล

โมดูลประกอบด้วยสองส่วน -

  • ส่วนข้อมูลจำเพาะสำหรับการประกาศงบ
  • มีส่วนสำหรับรูทีนย่อยและนิยามฟังก์ชัน

รูปแบบทั่วไปของโมดูลคือ -

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

การใช้โมดูลในโปรแกรมของคุณ

คุณสามารถรวมโมดูลในโปรแกรมหรือรูทีนย่อยโดยใช้คำสั่ง -

use name

โปรดทราบว่า

  • คุณสามารถเพิ่มโมดูลได้มากเท่าที่ต้องการแต่ละโมดูลจะอยู่ในไฟล์แยกกันและคอมไพล์แยกกัน

  • โมดูลสามารถใช้ในโปรแกรมต่างๆได้

  • โมดูลสามารถใช้งานได้หลายครั้งในโปรแกรมเดียวกัน

  • ตัวแปรที่ประกาศในส่วนข้อมูลจำเพาะของโมดูลเป็นแบบโกลบอลสำหรับโมดูล

  • ตัวแปรที่ประกาศในโมดูลจะกลายเป็นตัวแปรส่วนกลางในโปรแกรมหรือรูทีนที่ใช้โมดูล

  • คำสั่ง use สามารถปรากฏในโปรแกรมหลักหรือรูทีนย่อยหรือโมดูลอื่น ๆ ที่ใช้รูทีนหรือตัวแปรที่ประกาศในโมดูลเฉพาะ

ตัวอย่าง

ตัวอย่างต่อไปนี้แสดงให้เห็นถึงแนวคิด -

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