物性研スーパー利用者の皆様(6/22 荻津さんからの e-mail より)

[フォートランコンパイラのデフォルトオプションの変更(6/25)のお知らせ]

物性研の荻津です。6/65日のシステム作業の際、フォートランコンパイラ のデフォルトオプションとして、-Abを加えることとなりました。このオプショ ンの詳細については、man frtpxを御覧下さい。ここでは、簡単な内容と、こ の理由を説明します。

-Abオプションは、サブルーチンの変数(配列ではなく)の引渡し法を、値渡 しではなくアドレス渡しにするオプションです。このオプションをデフォルト として採用する理由ですが、値渡しがデフォルトであると(現在)、デバッグ オプション-Da(引数チェック)が正しく機能しない場合があることが判明し たためです。引数の型チェック(-Da)オプションを常に正常に動作させるた めには、引数の渡し方を常にアドレス渡しにしておく必要があります。このた め、-Ab(アドレス渡し)をデフォルトとして採用することになりました。

(注) この変更で、実行結果が変わった方は、以下のようなプログラムを書 いていないかチェックして下さい。


-------< 以下、富士通竹内氏からのメールの引用 >---------------

以下のcommonに関して誤りを含むプログラムにおいて 位置取り, 値取りの時, 実行結果が異なります.

--------------------  sample program  ------------------------------------
C234567
      program sample
      real*8 arg
      common arg
      arg=1.0
      write(*,*) 'main program arg = ',arg
      call sub1(arg)
      write(*,*) 'after main program arg = ',arg
      stop
      end
C
      subroutine sub1(arg)
      real*8 arg
      arg=2.0
      write(*,*) 'subroutine sub1 arg = ',arg
      call sub2
      return
      end
C
      subroutine sub2
      real*8 arg
      common arg
      write(*,*) 'subroutine sub2 arg = ',arg
      return
      end 
--------------------  sample program  ------------------------------------

実行結果

1. 値取りの時 

 main program arg = 1.000000000000000 
 subroutine sub1 arg = 2.000000000000000 
 subroutine sub2 arg = 1.000000000000000 
 after main program arg = 2.000000000000000 

2. 位置取りの時 (-Abオプション使用)

 main program arg = 1.000000000000000 
 subroutine sub1 arg = 2.000000000000000 
 subroutine sub2 arg = 2.000000000000000  <- 実行結果異
 after main program arg = 2.000000000000000 

実行結果が異なる原因は値取りの場合, commonの変数(arg)が, sub1での変更が反映される前に, sub2でcommonをアクセスしている為に発生しています.