2016-03-29 1 views
0

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

В частности, это 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).

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

Кроме того, если я меняю 15H ((... на 15H ((... (т. Е. Удаляю одно место), он не будет компилироваться. На самом деле, это не компилирует, даже если изменить код следующим образом:

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

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

ответ

5

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

Смежные вопросы