Распечатать двумерный массив Fortran в виде матрицы - PullRequest
0 голосов
/ 01 октября 2018

У меня есть массив, который в настоящее время 3x3.Когда я распечатываю символы, я получаю результаты, напечатанные в стиле обтекания строк.Я надеюсь напечатать квадратную матрицу, которая будет более читабельной, а не XXXXXXXXXXXXX в одной строке.Возможно ли это с помощью цикла do?

У меня есть следующее:

CHARACTER(len=1) :: Grid(2,2)
Grid = "*"
Print *, Grid

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

В зависимости от желаемого формата вывода, вам не обязательно нужен цикл do, вот самое простое:

program simple
    implicit none
    CHARACTER(len=1) :: Grid(2,2)
    Grid = reshape( ["1","2","3","4"] , shape=shape(Grid) )
    write( * , "(A)" ) Grid
end program simple

Строка с reshape, использует синтаксис конструктора массива Fortran> 2003[].Поэтому убедитесь, что в настройках компилятора уже установлен стандарт Fortran 2008.В противном случае просто замените [] старым синтаксисом конструктора массива (//).

Если вы хотите, чтобы каждая строка печаталась на отдельной строке, то цикл был бы необходим, по крайней мере, подразумевал do-loop ,

program simple
    implicit none
    integer :: i,j
    integer, parameter :: n=2
    CHARACTER(len=1) :: Grid(n,n)
    Grid = reshape( ["1","2","3","4"] , shape=shape(Grid) )
    write( * , "(*(g0))" ) ( (Grid(i,j)," ",j=1,n), new_line("A"), i=1,n )
end program simple

Вышеупомянутая версия, я полагаю, избегает ненужного временного массива, созданного компилятором для хранения незагрязненного раздела массива Grid(i,:), перед его выводом на выход,Дескриптор редактирования g0 является удобной функцией Fortran 2008. Поэтому убедитесь, что ваш компилятор поддерживает стандарт Fortran 2008.

0 голосов
/ 01 октября 2018

Что-то вроде печати строки массива за раз:

program printarray
  implicit none
  CHARACTER(len=1) :: Grid(3,2)
  integer :: i
  Grid = "x"
  do i = 1, ubound(Grid, 1)
     print *, Grid(i, :)
  end do
end program printarray

В качестве альтернативы, можно зависеть от того факта, что если в записываемом элементе будет больше материала, чем элементов, то он переключаетсяна новую линию.Итак, что-то вроде:

program printarray2
  implicit none
  CHARACTER(len=1) :: Grid(4,2)
  character(len=10) :: fmt
  Grid = "x"
  write(fmt, '(A,I0,A)') '(', ubound(Grid, 2), 'A)'
  write(*, fmt) transpose(grid)
end program printarray2

Здесь есть небольшая хитрость в том, что печать всего массива печатает его в порядке памяти, который является основным столбцом в Fortran.Вот почему вы должны транспонировать его (и поэтому вы берете ubound измерения 2, а не 1, как в первом примере при создании строки формата).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...