Что не так с этим фрагментом Fortran '77? - PullRequest
0 голосов
/ 17 мая 2010

Мне было поручено сохранить какой-то унаследованный код на 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)?

1 Ответ

4 голосов
/ 17 мая 2010

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

...