chap07/sample7.f90

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

 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