chap07/sample5.f90

サンプルコードのダウンロード

 1program sample
 2  implicit none
 3
 4  ! optional属性付きの引数は省略可能
 5  call hello('Michael')             ! 標準出力へ
 6  call hello('Jackson', 0)          ! 標準エラー出力へ
 7
 8  ! キーワード引数の使い方 (1)
 9  ! 引数の順序は気にしなくて良い
10  ! optional引数がある場合はoptional引数は省略可能
11  call hello(unit=0, name='Albert') ! 標準エラー出力へ
12  call hello(name='Einstein')       ! 標準出力へ
13
14  ! キーワード引数の使い方 (2)
15  ! optional引数が無い場合でもキーワード引数を用いた呼出しは出来る.
16  ! この場合も引数の順序は気にしなくて良いが全ての引数が必須
17  call chao(unit=0, name='Enrico')  ! 標準エラー出力へ
18  call chao(name='Fermi', unit=6)   ! 標準出力へ
19
20  stop
21contains
22
23  !
24  ! <<< optional属性 >>>
25  !
26  ! optional属性付きの引数は呼出し時に与えなくても良い.与えられなかった場合のデ
27  ! フォルトの振る舞いはユーザーの責任で実装しなければならない.
28  ! 以下では出力先を引数で与える装置番号にするか,デフォルトの標準出力にするかを
29  ! 選択することが出来る.
30  !
31  subroutine hello(name, unit)
32    implicit none
33    character(len=*), intent(in) :: name
34    integer, intent(in), optional :: unit    ! optional属性付き引数
35
36    integer :: u
37
38    ! 組込み関数presentで引数が呼出し時に指定されたかどうかを調べることが出来る.
39    ! 返値が真なら指定有り,偽なら指定無し (偽の場合はデフォルトの動作を実装)
40    if(present(unit)) then
41      u = unit                              ! unitを指定
42    else
43      u = 6                                 ! デフォルトは標準出力
44    endif
45
46    write(u, *) 'Hello ', name              ! 表示
47
48    return
49  endsubroutine hello
50
51  !
52  ! これでもキーワード引数を使うことは出来る
53  !
54  subroutine chao(name, unit)
55    implicit none
56    character(len=*), intent(in) :: name
57    integer, intent(in) :: unit
58
59    write(unit, *) 'Chao ', name
60
61    return
62  endsubroutine chao
63
64endprogram sample