#author("2022-08-08T13:46:26+09:00","default:Miyashita","Miyashita")
#author("2022-08-08T13:47:06+09:00","default:Miyashita","Miyashita")
*FORTRAN77 デバッグメモ [#d965f721]
古いコードに手をつけなければならなかった時にハマったことなど.

** X0 は勝手に X (0) として解釈される?? [#xd43e9de]
#codeprettify(lang-fortran){{
      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) の部分も削除したら,なんとその前後で計算結果が変わった.~
無駄と思って X0 の宣言も X0(1)=X(N) の部分も削除したら,不思議なことにその前後で計算結果が変わった.~
代わりに以下のように修正すると,結果変わらず実行できた.
#codeprettify(lang-fortran){{
      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)と配列のように宣言しているのがミソなのかもしれない.~
~


**サブルーチンへの配列の渡しがサブルーチン内の宣言と違うとき [#cbe97b2d]
以下のように subroutine の中で配列を宣言していたとして
#codeprettify(lang-fortran){{
      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 するときにその配列のサイズではない変数を引数としたとき,例えば
#codeprettify(lang-fortran){{
      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