Старый фортран: синтаксис дескриптора редактирования Холлерита для оператора Format

Я пытаюсь модернизировать старый код (или, по крайней мере, сделать его более понятным), но столкнулся со странным форматом оператора FORMAT.

В частности, это оператор FORMAT с константами Холлерита (nH, где n — число):

  FORMAT(15H  ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,')  te'        
 1,'xt'  ) 

Это мешает подсветке синтаксиса, так как кажется, что в нем есть незакрытые скобки. Он отлично компилируется с этим оператором формата как есть, но закрытие круглых скобок вызывает ошибку компиляции (с использованием компилятора Intel или gfortran).

Насколько я понимаю, константы Холлерита были порождением Фортрана 66 и были заменены с появлением CHARACTER в Фортране 77. Обычно я понимаю их, когда они используются как что-то вроде символа, но использование в качестве FORMAT меня смущает.

Кроме того, если я изменю 15H ((... на 15H ((... (т.е. удалю один пробел), он не скомпилируется. Фактически, он не скомпилируется, даже если я изменю код на этот:

  FORMAT(15H  ((C(I,J),J=1,I3,12H),(D(J),J=1,I3, 6H),I=1,I3,')  text'  ) 

Я бы хотел, чтобы это было в более нормальном формате (F77+). Любая помощь приветствуется.


person Romy    schedule 29.03.2016    source источник


Ответы (1)


На самом деле у вас есть дескрипторы редактирования Холлерита, а не константы (что могло бы произойти в операторе DATA или CALL), хотя они используют тот же синтаксис. F77 полностью заменил константы Холлерита; он добавил дескриптор редактирования char-literal как (намного!) лучшую альтернативу, но дескриптор редактирования H оставался в стандарте до F95 (и даже тогда некоторые компиляторы все еще принимали его как функцию совместимости).

В любом случае число перед H занимает такое же количество символов после H без какого-либо другого разделителя; вот почему удаление (или добавление) символа после H портит его. Разбор вашего формата разбивает его на эти части

15H  ((C(I,J),J=1,
I3,
12H),(D(J),J=1,
I3,
 6H),I=1,
I3,
')  te' 
'xt'

и, таким образом, современный эквивалент (с необязательными пробелами для ясности)

   nn FORMAT( '  ((C(I,J),J=1,', I3, '),(D(J),J=1,', I3, '),I=1,', I3 
     1,') text' )

или, если вы предпочитаете, вы можете поместить этот текст после продолжения (включая круглые скобки) в значение CHARACTER, переменную или параметр, используемый в операторе ввода-вывода вместо метки FORMAT, но поскольку вы должны удвоить все символы кавычек, чтобы получить их в значении CHARACTER, которое менее удобно.

Ваша однострочная версия, вероятно, не скомпилировалась, потому что вы использовали фиксированную форму, возможно, по умолчанию, и только первые 72 символа каждой исходной строки принимаются в фиксированной форме, из которых первые 6 зарезервированы. для номера оператора и индикатора продолжения осталось только 66, и этот оператор по моим подсчетам равен 71. Практически любой компилятор, который вы найдете сегодня, также принимает свободную форму, которая позволяет использовать более длинные строки и имеет другие преимущества для нового кода, но может потребовать изменений в существующем коде, иногда значительных изменений.

person dave_thompson_085    schedule 30.03.2016