Fortran/COMMON文について

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の変更をサブルーチンにも反映することができる.

参考サイト