将Fortran 2D阵列打印为矩阵

时间:2018-10-01 18:44:17

标签: fortran

我有一个当前为3x3的数组。当我打印出字符时,我得到的结果以环绕线样式打印。我希望打印出更具可读性的方阵 而不是一行中的XXXXXXXXXXXXX。可以执行do循环吗?

我有以下内容:

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

2 个答案:

答案 0 :(得分:2)

有点像一次打印一个数组行:

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中主要是列。这就是为什么您必须对其进行转置的原因(以及为什么在创建格式字符串时采用维度2而不是第一个示例的ubound的原因)。

答案 1 :(得分:1)

根据您想要的输出格式,您不一定需要执行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标准。