«Сохранение» общего блока - PullRequest
6 голосов
/ 24 февраля 2012

Я имею дело с неким устаревшим кодом, который широко использует блоки COMMON, а иногда и оператор SAVE.После консультации со стандартом Фортрана, он говорит:

Появление имени общего блока, перед которым следует косая черта в операторе SAVE, приводит к указанию всех объектов в этом общем блоке.

При каких обстоятельствах размещение переменной в общем блоке не подразумевает SAVE?Поскольку переменная должна быть доступна в любом другом программном модуле, который включает этот общий блок, как это может быть SAVE ed?

Ответы [ 2 ]

7 голосов
/ 24 февраля 2012

Мне пришлось поискать это, потому что у меня было такое же впечатление, как и у вас.

Кажется, что только переменные в неназванном, так называемом пустом, общем блоке сохраняют свой статус определения во всемпрограмма.Несохраненные переменные в именованном общем блоке становятся неопределенными при возврате из подпрограммы, если только другой активный в данный момент программный модуль не включает общий оператор для того же общего блока.

Из стандарта (Fortran 77, но последний содержит аналогичныйформулировка):

17.3 События, которые приводят к тому, что объекты становятся неопределенными
[...]
6. Выполнение оператора RETURN или оператора END в подпрограмме вызывает все объекты внутриподпрограмма станет неопределенной, за исключением следующего:
[...]
d.Объекты в именованном общем блоке, который появляется в подпрограмме и появляется по крайней мере в одном другом программном блоке, который прямо или косвенно ссылается на подпрограмму

4 голосов
/ 24 февраля 2012

Многие компиляторы эпохи Fortran 77 «сохранили» все локальные переменные процедуры, независимо от того, было ли указано «SAVE». Это общая причина того, что устаревшие программы не работают с современными компиляторами, которые отменяют определение переменных, когда они выходят из области видимости, как это допускается стандартом языка. Вероятно, эти старые компиляторы также поддерживали бы значения всех общих переменных в течение всего времени выполнения программы, хотя это не требовалось языковым стандартом.

...