Старый фортран: 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 по моим подсчетам. Практически любой компилятор, который вы найдете сегодня, также принимает произвольную форму, которая допускает более длинные строки и имеет другие преимущества для нового кода, но может потребовать изменений в существующем коде, иногда обширных изменений.