«Сохранение» общего блока

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

Появление общего имени блока предшествует и сопровождается косой чертой вSAVE Оператор имеет эффект указания всех объектов в этом общем блоке.

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

Ответы на вопрос(2)

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

 mgilson12 мар. 2012 г., 14:17
Насколько я понимаю, локальные переменные процедуры обычно располагаются в стеке (хотя стандарт f77 ничего не говорит о стеке / куче). яподумал что общие переменные должны быть размещены в куче, так как другие программные модули должны иметь возможность доступа к ним. Подвох в том, что другие программные модули должны вызываться программным модулем, содержащим общий блок, чтобы гарантировать, что общий блок определен (без явного оператора сохранения). Конечно, компиляторам, вероятно, проще просто выделить общие блоки из кучи, так что большинство себя ведет.
Решение Вопроса

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

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

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

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

 Francois Jacq24 февр. 2012 г., 20:44
Правильно, но я не знаю никакого компилятора F2008 до сих пор, и я не ожидаю такого рода компилятора через несколько (много?) Лет
 Jonathan Dursi24 февр. 2012 г., 03:36
+1; вау, это то, что я не только не знал, но и «знал», что это неправильно. Но, с другой стороны, я полагаю, что на практике обычно так называемые общие блоки используются именно для совместного использования данных в дереве вызовов. Еще одна хитрая причина никогда не использовать проклятые вещи.
 Francois Jacq24 февр. 2012 г., 17:04
Будьте осторожны: то же правило относится и к модулям. В этой области ОБЩИЕ и МОДУЛИ эквивалентны. К счастью на практике, я никогда не встречал систему, автоматически удаляющую переменные общего или модуля, когда эта становится «вне области».
 eriktous24 февр. 2012 г., 17:36
@FrancoisJacq: я считаю, что это было изменено в последнем стандарте. Все переменные модуля теперь неявно получаютsave приписывать.
 eriktous25 февр. 2012 г., 00:44
@FrancoisJacq: правда. Вам даже было бы трудно найти компилятор f2003, если у вас нет доступа к центру HPC.

Ваш ответ на вопрос