Старый фортран: Hollerith редактирует дескриптор синтаксиса для оператора 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+) формат. Любая помощь приветствуется.

1 ответ

Решение

На самом деле у вас есть дескрипторы редактирования Hollerith, а не константы (что может произойти в операторе DATA или CALL), хотя они используют один и тот же синтаксис. F77 полностью заменил константы Холлерита; он добавил символьный дескриптор редактирования как (намного!) лучшую альтернативу, но дескриптор редактирования 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 по моим подсчетам. Практически любой компилятор, который вы найдете сегодня, также принимает произвольную форму, которая допускает более длинные строки и имеет другие преимущества для нового кода, но может потребовать изменений в существующем коде, иногда обширных изменений.

Другие вопросы по тегам