非常に骨の折れるデバッグの後、私はここでstackoverflowで確認したいFortranのユニークなプロパティを見つけたと思います。
私が気付いたのは、少なくとも、内部論理変数の値は、関数またはサブルーチンの呼び出し全体で保持されるということです。
これが私のポイントを説明するためのいくつかのサンプルコードです:
PROGRAM function_variable_preserve
IMPLICIT NONE
CHARACTER(len=8) :: func_negative_or_not ! Declares function name
INTEGER :: input
CHARACTER(len=8) :: output
input = -9
output = func_negative_or_not(input)
WRITE(*,10) input, " is ", output
10 FORMAT("FUNCTION: ", I2, 2A)
CALL sub_negative_or_not(input, output)
WRITE(*,20) input, " is ", output
20 FORMAT("SUBROUTINE: ", I2, 2A)
WRITE(*,*) 'Expected negative.'
input = 7
output = func_negative_or_not(output)
WRITE(*,10) input, " is ", output
CALL sub_negative_or_not(input, output)
WRITE(*,20) input, " is ", output
WRITE(*,*) 'Expected positive.'
END PROGRAM function_variable_preserve
CHARACTER(len=*) FUNCTION func_negative_or_not(input)
IMPLICIT NONE
INTEGER, INTENT(IN) :: input
LOGICAL :: negative = .FALSE.
IF (input < 0) THEN
negative = .TRUE.
END IF
IF (negative) THEN
func_negative_or_not = 'negative'
ELSE
func_negative_or_not = 'positive'
END IF
END FUNCTION func_negative_or_not
SUBROUTINE sub_negative_or_not(input, output)
IMPLICIT NONE
INTEGER, INTENT(IN) :: input
CHARACTER(len=*), INTENT(OUT) :: output
LOGICAL :: negative = .FALSE.
IF (input < 0) THEN
negative = .TRUE.
END IF
IF (negative) THEN
output = 'negative'
ELSE
output = 'positive'
END IF
END SUBROUTINE sub_negative_or_not
これは出力です:
FUNCTION: -9 is negative
SUBROUTINE: -9 is negative
Expected negative.
FUNCTION: 7 is negative
SUBROUTINE: 7 is negative
Expected positive.
ご覧のとおり、関数またはサブルーチンが1回呼び出されると、論理変数negative
は、に切り替えられた場合、型宣言ステートメントでto.TRUE.
が初期化されても、そのまま残ります。negative
.FALSE.
もちろん、negative = .FALSEの行を追加するだけで、この問題を修正できます。関数とサブルーチンで変数を宣言した後。
しかし、これが必要なのは私には非常に奇妙に思えます。
移植性とコードの再利用性のために、言語(またはコンパイラー)は、サブルーチンまたは関数が呼び出されるたびに、すべての内部変数の再初期化を要求するべきではありませんか?