#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) の変数の場合は気をつけないと全く意図しないことが起こりうる.~ 見つけたらなるべく修正したほうがよい.