Что не так с этим фрагментом Fortran '77?

Мне поручили поддерживать некоторый устаревший код fortran, и у меня возникли проблемы с его компиляцией с помощью gfortran. Я написал довольно много Fortran 95, но это мой первый опыт работы с Fortran 77. Этот фрагмент кода вызывает проблемы:

      CHARACTER*22 IFILE, OFILE
      IFILE='TEST.IN'
      OFILE='TEST.OUT'
      OPEN(5,FILE=IFILE,STATUS='NEW')   
      OPEN(6,FILE=OFILE,STATUS='NEW')
      common/pabcde/nfghi

Когда я компилирую с gfortran file.FOR, все строки, начинающиеся с оператора common, являются ошибками (например, Error: Unexpected COMMON statement at (1) для каждой следующей строки, пока не будет достигнуто ограничение в 25 ошибок). Я скомпилировал с -Wall -pedantic, но исправление предупреждений не решило эту проблему.

Сумасшествие заключается в том, что если я закомментирую все 4 строки, начинающиеся с IF='TEST.IN', программа скомпилируется и заработает, как и ожидалось, но я должен закомментировать их все. Оставив любой из них без комментариев, я получаю те же ошибки, начиная с оператора common. Если я закомментирую оператор common, я получу те же ошибки, только начиная со следующей строки.

Я использую OS X Leopard (не Snow Leopard), используя gfortran. Я широко использовал эту систему с gfortran для написания программ на Fortran 95, так что теоретически сам компилятор в порядке. Что, черт возьми, происходит с этим кодом?


Изменить: Компиляция с помощью g77 дает:

test.FOR: In program `MAIN__':
test.FOR:154: 
     IFILE='TEST.IN'
     1
test.FOR:158: (continued):
     common/pabcde/nfghi
     2
Statement at (2) invalid in context established by statement at (1)

Э-э, какой контекст установлен в (1)?


person davidtbernal    schedule 16.05.2010    source источник


Ответы (1)


Я не думаю, что вы можете помещать операторы COMMON под исполняемые операторы в FORTRAN 77, см. спецификация, гл. 3.5. Просто переместите оператор COMMON ближе к началу процедуры перед любым исполняемым оператором.

person Yuji    schedule 16.05.2010
comment
Ах, конечно. Я как бы думал об этом, но мне нужно было переместить исполняемые операторы waaay вниз, и изначально я не переместил их достаточно далеко. Чтение спецификации помогло расшифровать и некоторые другие ошибки, которые я получал. - person davidtbernal; 17.05.2010