Цель 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?

Другие вопросы по тегам