После долгих мучительных отладок я считаю, что нашел уникальное свойство Fortran, которое я хотел бы проверить здесь в stackoverflow.
Что я заметил, так это то, что, по крайней мере,значение внутренних логических переменных сохраняется при вызовах функций или подпрограмм.
Вот пример кода, иллюстрирующего мою точку зрения:
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.
Как видите, после однократного вызова функции или подпрограммы логическая переменная negative
, если она переключена на .TRUE.
, остается таковой, несмотря на инициализацию negative
в .FALSE.
воператор объявления типа.
Я мог бы, конечно, исправить эту проблему, просто добавив строку негатива = .FALSE.после объявления переменной в моей функции и подпрограмме.
Однако мне кажется очень странным, что это необходимо.
Ради переносимости и повторного использования кода не следуетязык (или, возможно, компилятор) требует повторной инициализации всех внутренних переменных при каждом вызове подпрограммы или функции?