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