1program sample
2 implicit none
3
4 ! 16進数変換のためのテーブル (内部手続きからも参照される)
5 character(len=1), parameter :: hex_char(0:15) = &
6 & (/'0', '1', '2', '3', '4', '5', '6', '7', '8', '9', &
7 & 'A', 'B', 'C', 'D', 'E', 'F'/)
8
9 integer :: n = 10
10 character(len=8) :: hexstr
11
12 ! どちらの n を参照するか?
13 call sub()
14
15 ! 整数を16進数に変換して表示
16 n = 15 * 16**6 + 4 * 16**4 + 3 * 16**3 + 16**2 + 1
17 call decimal2hex(n, hexstr)
18 write(*, *) 'decimal = ', n, ' ===> hex = ', hexstr
19
20 stop
21contains
22 !
23 ! 内部手続きのスコープについて (1)
24 !
25 ! 内部手続きからはメインプログラムで宣言された変数を参照可能.ただし逆は不可.
26 !
27 ! nという名前の変数をサブルーチン内で宣言するかどうかで挙動が変わる
28 subroutine sub()
29 implicit none
30 ! もし以下の行があればメインプログラムのnとサブプログラムのnは独立
31 !integer :: n
32
33 write(*, *) n ! メインプログラム中の変数nにアクセス
34 endsubroutine sub
35
36 !
37 ! 内部手続きのスコープについて (2)
38 !
39 ! メインプログラムで定義された変数は内部手続きから参照出来るが,一般論としては
40 ! 引数として渡すようにした方が安全である.以下の例のようにプログラム全体で共通
41 ! に用いる定数であれば問題は起こらないことが多い.
42 !
43 ! 10進数を16進数に変換
44 subroutine decimal2hex(decimal, hex)
45 implicit none
46 integer :: decimal
47 character(len=*) :: hex
48
49 integer :: i, n, d
50
51 d = decimal
52 do i = 1, 8
53 n = d / 16**(8 - i)
54 d = d - n * 16**(8 - i)
55 ! メインプログラムで宣言された変数(hex_char)を参照
56 hex(i:i) = hex_char(n)
57 enddo
58
59 endsubroutine decimal2hex
60
61endprogram sample