Chapter 模組 台灣師範大學數學系 黃聰明
M-1 Public and Private 程式說明 module test implicit none private var_1 public var_2,sub_1 integer :: var_1,var_2 ... contains subroutine sub_1 … end module test 將模組內的變數或函式定義成只能在此模組內使用的變數或函式 內定的狀態為 public 將模組內的變數或函式定義成可以對外界公開使用的變數或函式 函式要放在contains中
M-1 Public and Private < Ex0M01. 完整程式> <接下頁> module bank implicit none private money public LoadMoney, SaveMoney, Report integer :: money = 1000000 contains subroutine LoadMoney(num) implicit none integer :: num money=money-num return end subroutine < Ex0M01. 完整程式> <接下頁> 變數 money 只能在 module bank 中使用,主程式中不能使用 money 變數 將 LoadMoney, SaveMoney, Report 定義成可以對外界公開使用的函式
M-1 Public and Private < Ex0M01. 完整程式> <接下頁> subroutine SaveMoney(num) implicit none integer :: num money=money+num return end subroutine subroutine Report() write(*,"('銀行目前庫存',I,'元')") money return end module bank < Ex0M01. 完整程式> <接下頁>
M-1 Public and Private < Ex0M01. 完整程式> < Ex. 執行結果> program ex0M01 use bank implicit none call LoadMoney(100) call SaveMoney(1000) call Report() stop end program ex0M01 < Ex0M01. 完整程式> < Ex. 執行結果> TEST
M-2 USE 更改模組中變數名稱 use指令後面,可以臨時把 module 裡面的變數或函式名稱改名 module A implicit none integer :: va end module A module B integer :: va, vb end module program main use A, aa=>va use B ... use指令後面,可以臨時把 module 裡面的變數或函式名稱改名 把 module A 中的變數 va改名為 aa 來使用,若不使用 “use A, aa=> va”,module A 和 module B 都同時擁有名稱為 va 的變數,在主程式中同時使用這兩個 module 時,會出現變數名稱重複的問題
M-2 USE 只使用模組中的某些變數 use指令後面,可以臨時只選擇 module 裏面所需之變數或函式 module A implicit none integer :: va, vb, vc end module module B integer :: va, vb program main use A, only : vc use B ... use指令後面,可以臨時只選擇 module 裏面所需之變數或函式 只用 module A 中的變數 vc,其他 va 和vb 變數都不使用,因此不會與 module B 中的va 和vb 變數衝突
M-2 USE 合併使用 use指令後面,可以臨時 只選擇 module 裏面所需之變數或函式並名稱改名 module A implicit none integer :: va, vb, vc end module module B integer :: va, vb program main use A, only : c => vc use B ... use指令後面,可以臨時 只選擇 module 裏面所需之變數或函式並名稱改名 只用module A 中的變數 vc,不過把 vc 改名成 c 來使用
M-2 USE < Ex0M02. 完整程式> <接下頁> module MA implicit none real :: a,b contains subroutine getx() write(*,"('x=',F5.2)") -b/a return end subroutine end module < Ex0M02. 完整程式> <接下頁>
M-2 USE < Ex0M02. 完整程式> <接下頁> module MB use MA implicit none real :: c contains subroutine getx2() real :: a2, d, sqrt_d a2=2*a d=b*b-4*a*c if ( d>=0 ) then sqrt_d = sqrt(d) write(*,"('x=',F5.2,',',F5.2)")(-b+sqrt_d)/a2, (-b-sqrt_d)/a2 < Ex0M02. 完整程式> <接下頁>
M-2 USE < Ex0M02. 完整程式> < Ex0M02. 完整程式> <接下頁> else write(*,*) "無實數解" end if return end subroutine end module < Ex0M02. 完整程式> <接下頁> subroutine sub1() use MA implicit none a=2.0 b=3.0 call getx() return end subroutine < Ex0M02. 完整程式> <接下頁>
M-2 USE < Ex. 執行結果> < Ex0M02. 完整程式> < Ex0M02. 完整程式> TEST subroutine sub2() use MB implicit none a=1.0 b=4.0 c=4.0 call getx2() return end subroutine < Ex0M02. 完整程式> program main implicit none call sub1() call sub2() end program < Ex0M02. 完整程式>
M-3 Interface Overload Overload subroutine 在程式碼中可以同時擁有多個名稱相同,但是參數型態、 數目不同的函式,程式會自動根據傳入的參數,來決定 要呼叫哪一個函式 Overload subroutine 在 module 中使用 interface,可以用來定義一個虛擬的 函式名稱
M-3 Interface < Ex0M03. 完整程式> <接下頁> module MA implicit none interface show module procedure show_int module procedure show_character end interface contains subroutine show_int( n ) integer, intent(in) :: n write(*,"('n=',I3)") n return end subroutine show_int < Ex0M03. 完整程式> <接下頁> 虛擬的函式名稱show
M-3 Interface < Ex0M03. 完整程式> <接下頁> subroutine show_character( str ) implicit none character(len=*), intent(in) :: str write(*,"('str=',A)") str return end subroutine show_character end module < Ex0M03. 完整程式> <接下頁>
M-3 Interface < Ex. 執行結果> < Ex0M03. 完整程式> TEST program main use MA implicit none call show_int(1) call show(1) call show_character("FORTRAN 95") call show("FORTRAN 95") stop end program < Ex0M03. 完整程式> 參數是整數, 會自動選擇呼叫show_int 參數是字串, 會自動選擇呼show_character