我有一个当前为3x3的数组。当我打印出字符时,我得到的结果以环绕线样式打印。我希望打印出更具可读性的方阵 而不是一行中的XXXXXXXXXXXXX。可以执行do循环吗?
我有以下内容:
CHARACTER(len=1) :: Grid(2,2)
Grid = "*"
Print *, Grid
答案 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标准。