FORTRAN77 デバッグメモ

古いコードに手をつけなければならなかった時にハマったことなど.

X0 は勝手に X (0) として解釈される??

      REAL :: X0(1), X(76), Y0(1), Y(76), DS0(1), DS(76)

      X0(1)=X(N)
      Y0(1)=Y(N)
      DS0(1)=DS(N)

というコードがあって,これ以降一度も X0, Y0, DS0 という変数が使われることはなかった.
無駄と思って X0 の宣言も X0(1)=X(N) の部分も削除したら,不思議なことにその前後で計算結果が変わった.
代わりに以下のように修正すると,結果変わらず実行できた.

      REAL :: X(0:76), Y(0:76), DS(0:76)

   X(0)=X(N)
      Y(0)=Y(N)
      DS(0)=DS(N)

どういうことなのか全くわからんが, 上記の処理では X0(1) が勝手に X (0) の役割を果たしたということ?そんなことある?

X0は配列の要素が1つしかないのに,ここではあえてX0(1)と配列のように宣言しているのがミソなのかもしれない.

サブルーチンへの配列の渡しがサブルーチン内の宣言と違うとき

以下のように subroutine の中で配列を宣言していたとして

      SUBROUTINE HOGE(A, M, B, N)
      IMPLICIT NONE

      COMPLEX, INTENT(INOUT) :: A(75,M)
      INTEGER, INTENT(IN) :: M
      COMPLEX, INTENT(INOUT) :: B(75,N)
      INTEGER, INTENT(IN) :: N

call するときにその配列のサイズではない変数を引数としたとき,例えば

      CALL HOGE(F(1:2,M), M, G(2,1), 1)

というときには,コンパイラによって挙動が変わる.
曖昧なことをしているのでおかしな挙動をしても当たり前だが,特に intent (inout) の変数の場合は気をつけないと全く意図しないことが起こりうる.
見つけたらなるべく修正したほうがよい.


Front page   Edit Diff Attach Copy Rename Reload   New List of pages Search Recent changes   Help   RSS of recent changes
Last-modified: 2022-08-05 (Fri) 16:50:06 (120d)