Формат строки для вывода зависит от переменной - PullRequest
13 голосов
/ 27 марта 2012

Я бы хотел, чтобы оператор записи на Фортран был отформатирован, чтобы зависеть от какой-либо переменной. Например, я мог бы написать:

write(*,'(3f15.3,3f9.2)') x,y,z,(var(i),i=1,nvari)

, где nvari = 3. Но что делать, если в некоторых случаях у меня на самом деле есть 4 переменные (т.е. nvari = 4). Я хотел бы написать что-то вроде этого:

write(*,'(3f15.3,nvari(f9.2))') x,y,z,(var(i),i=1,nvari)

Теперь, nvari может быть любым, и вывод будет работать так, как мне нравится. Как я могу сделать что-то вроде этой работы?

Ответы [ 4 ]

16 голосов
/ 12 апреля 2012

Если вы используете Intel fortran, у него есть проприетарное расширение для этого - вы можете включить существующую переменную в угловые скобки, чтобы действовать как спецификатор:

  write(*,'(3f15.3,<nvari>f9.2)') x,y,z,(var(i),i=1,nvari)
13 голосов
/ 27 марта 2012

Если ваш компилятор поддерживает это, '(3f15.3, *(f9.2))'

Если у вас более старый компилятор, просто используйте большее число, чем у вас будет элементов для вывода, например, '(3f15.3, 999(f9.2))'.Вам не нужно использовать формат.

Для наиболее сложных случаев вы можете записать формат в строку и использовать его в качестве формата:

write (string, '( "(3f15.3, ", I4, "(f9.2))" )' )  nvari
write (*, string )  x,y,z, (array(i), i=1,nvari)

С пониманиемформатов, включая реверсию форматов, использование строковых форматов редко требуется.

11 голосов
/ 27 марта 2012

Вместо записи формата непосредственно в операторе записи также можно использовать символьную переменную.

character(len=32) :: my_fmt
my_fmt = '(3f15.3,3f9.2)'
write(*, my_fmt) x, y, z, (var(i), i = 1, nvari)

Теперь можно манипулировать символьной переменной, чтобы она содержала желаемый счетчик повторений перед записьюоператор, используя так называемую внутреннюю запись, или запись во внутренний файл.

write(my_fmt, '(a, i0, a)') '(3f15.3,', nvari, 'f9.2)'

(Просто убедитесь, что заявленная длина my_fmt достаточно велика, чтобы содержать всю строку символов.)

4 голосов
/ 20 сентября 2012

Вы хотели написать что-то вроде этого:

write(*,'(3f15.3,nvari(f9.2))') x, y, z, (var(i), i=1,nvari)

На самом деле, в стандарте Фортрана есть старый трюк, который позволяет вам пропустить nvari, таким образом:

write(*,'(3f15.3,(f9.2))') x, y, z, (var(i), i=1,nvari)

или даже так:

write(*,'(3f15.3,f9.2)') x, y, z, (var(i), i=1,nvari)

Стандарт гласит, что последний дескриптор в формате неявно повторяется так часто, как это необходимо для размещения всех переменных в списке.Этот «последний дескриптор» может быть заключен в скобки, так что последняя группа дескрипторов неявно повторяется, например:

write(*,'(3f15.3,(2x,f9.2))') x, y, z, (var(i), i=1,nvari)
...