Назначение Fortran при объявлении и сохранении атрибута gotcha - PullRequest
16 голосов
/ 28 июля 2010

В Фортране 95, если вы назначаете переменную при объявлении

integer :: var = 0

эквивалентно

integer, save :: var = 0

и поэтому переменная сохраняется после выполнения процедуры (эквивалентно static на языке C) и не инициализируется при повторном вызове В чем причина / техническая проблема такого (ИМХО опасного) поведения?

Ответы [ 2 ]

8 голосов
/ 28 июля 2010

Я не думаю, что такое поведение обосновано.

Но, насколько я знаю, Стефано, вы использовали неверную терминологию.В вашем коде нет оператора присваивания только инициализация переменной (var) с использованием выражения инициализации (0).

integer :: var = 0 ! type declaration & initialization

integer :: var ! type declaration
var = 0        ! assignment

Так что, похоже, это было просто решение по проекту комитета.Если у нас есть такое выражение (со знаком равенства в операторе объявления типа), это инициализация, а не присвоение.Инициализация происходит только один раз во время выполнения программы (а не процедур).

Однако могут быть некоторые исторические причины для такого решения.Взгляните на этот поток.

Сегодня такое поведение опасно, поскольку многие другие широко используемые языки следуют другим соглашениям об инициализации / присваивании.

6 голосов
/ 28 июля 2010

Многие старые компиляторы FORTRAN 77 и более ранних версий статически распределяли все переменные.Многие программисты полагались на такое поведение - это технически было ошибкой в ​​их программах, поскольку, если они не использовали квалификатор «SAVE» в объявлении (или не добавляли простой оператор SAVE в каждую процедуру), значение переменной было неопределенным после повторного входа впроцедура.Но поскольку в те дни программы, как правило, годами привязывались к конкретной платформе и компилятору, программистам это сходит с рук.Это очень распространенная ошибка при переносе устаревшего кода FORTRAN 77 на современные компиляторы Fortran> = 90.Большинство компиляторов предоставляют переключатели времени компиляции для восстановления этого поведения, такие как fno-automatic опция gfortran.Скорее всего, комитет рассматривал переменные, которые были инициализированы в их декларации, как весьма вероятно, что потребуется атрибут SAVE - на мой взгляд, разумное проектное решение.Я думаю, что больше всего отличается от других языков и легче всего запутать многоязычного программиста, так это то, что инициализация выполняется только один раз.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...