COMMON文は共有ブロックと呼ばれ,プログラム単位間でのデータのやり取りをするのによく用いられるが,デバッグが難しいので現在では非推奨である.
概要
COMMON文は以下のように使う.
common /datablock/ p1, p2
! datablock: 共有ブロック
! p1, p2: プログラム全体で共通の変数
この共有ブロックをほかのサブルーチンの中でも用いたいときはサブルーチンの頭でもこの文を置く
subroutine sub1(a1,b1)
common /datablock/ p1, p2
! datablock: 共有ブロック
! p1, p2: プログラム全体で共通の変数
double precision :: a1(10), b1(10)
do i = 1, 10
b1(i) = p1*a1(i)*a1(i)+p2
enddo
return
end
プログラムの例
ソースコード
program common_test
common /datablock/ p1, p2
double precision :: a1(10), b1(10)
integer :: i
p1 = 1.0E2; p2 = 2.0E1
call sub1(a1,b1)
write(*,*) 'a1 = ', (a1(i), i = 1,10)
write(*,*) 'b1 = ', (b1(i), i = 1,10)
p1 = 2.0E2; p2 = 1.0E1
call sub1(a1,b1)
write(*,*) 'a1 = ', (a1(i), i = 1,10)
write(*,*) 'b1 = ', (b1(i), i = 1,10)
end program common_test
subroutine sub1(a1,b1)
common /datablock/ p1, p2
! datablock: 共有ブロック
! p1, p2: プログラム全体で共通の変数
double precision :: a1(10), b1(10)
do i = 1, 10
b1(i) = p1*a1(i)*a1(i)+p2
enddo
return
end
出力例
a1 = 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000
0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000
0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000
0.000000000000000E+000
b1 = 20.0000000000000 20.0000000000000 20.0000000000000
20.0000000000000 20.0000000000000 20.0000000000000
20.0000000000000 20.0000000000000 20.0000000000000
20.0000000000000
a1 = 0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000
0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000
0.000000000000000E+000 0.000000000000000E+000 0.000000000000000E+000
0.000000000000000E+000
b1 = 10.0000000000000 10.0000000000000 10.0000000000000
10.0000000000000 10.0000000000000 10.0000000000000
10.0000000000000 10.0000000000000 10.0000000000000
10.0000000000000
といった具合に,p1, p2の変更をサブルーチンにも反映することができる.