Цель SAVE и COMMON вместе в Фортране
Общий блок в Фортране служит глобальным переменным?
Если это так, то могут ли эти значения быть изменены подпрограммой?
Будет SAVE
сохранить измененные параметры внутри подпрограммы для использования, отличного от подпрограммы?
2 ответа
[Редактировать: я основываю ответ на том понимании, что вопрос о SAVE
на общем блоке, а не на локальных переменных (т. е. в качестве альтернативы COMMON
). В противном случае см. Комментарий чашки.]
Общие блоки действительно были подходом для "глобальных" переменных в Fortran 77. Переменные в блоке могут быть изменены в подпрограмме, и изменения будут видны в другом месте (см. Предостережение).
SAVE
напрямую не изменяет способность других подпрограмм использовать измененные переменные. Вместо этого его цель состоит в том, чтобы гарантировать, что данные в блоке не станут неопределенными, когда блок выходит из области видимости. Обратите внимание, что если SAVE
присутствует в одной подпрограмме, он должен присутствовать в блоке во всех подпрограммах, в которых присутствует блок (но не обязательно в основной программе).
По памяти это означает, что (это не совсем F77; для концепции):
call s1
call s2
end
subroutine s1
common /bl/ i,j
i=2
end subroutine s1
subroutine s2
common /b1/ i,j
print *, i
end subroutine s2
не будет хорошо себя вести [Реальный мир компиляторы Будьте заставить вас платить спорно.]
Переменные в общем блоке не могут иметь SAVE
атрибут применяется отдельно, а наличие атрибута в локальной переменной не меняет его доступности. Так, например, SAVE K
в одной подпрограмме не сделал бы эту переменную доступной где-либо еще. Однако случится так, что он сохранит свое значение после того, как оттуда вернется управление (при следующем вводе подпрограммы).
Наконец, есть лучшие подходы после Фортрана 77.
Да, common
создает глобальные переменные. Fortran >=90 предоставляет переменные модуля для этой цели - переменные модуля должны использоваться в новом коде вместо общих. common добавляет обычно ненужную сложность порядка хранения. общие или модульные переменные могут использоваться несколькими процедурами (подпрограммами и функциями) и основной программой.
save
в первую очередь для локальных переменных в процедурах, чтобы эти переменные сохраняли свои значения при вызовах. Fortran SAVE заявление
save
также может применяться к переменным модуля, чтобы гарантировать, что они не потеряют свои значения, если в области видимости нет подпрограммы, использующей модуль. Это больше не нужно в Fortran 2008 - см. Когда модуль выходит из области видимости в Fortran 90/95?