如何用 fortran77 将格式化后的矩阵写成一行?

How to write the formatted matrix in a lines with fortran77?

假设我有矩阵 c(i,j)。我想用最古老的 Fortran77 语言在屏幕上用逗号后的三个符号来写它。我写

         do i=1,N
         write(*,"(F8.3)") ( c(i,j), j=1,N )
         end do

但输出的形式是

c(1,1)

c(1,2)

...

c(1,10) c(2,1)

c(2,2)

...

最后,我可能会简单地写

         do i=1,N
         write(*,*) ( c(i,j), j=1,N )
         end do

然后输出就像矩阵一样,但是,当然,它没有格式化。

如何在 Fortran77 中获得正确的输出?

编辑。似乎解决方案之一是写

   do i=1, N
   do j=1, N
    write(*,'(F9.3,A,$)') c(i,j), ' '
   end do
    write(*,*) ' '
   end do

您的格式只指定了一个浮点数,但您实际上想每行写 N

这个简单案例的一个相当通用的解决方案类似于

  program temp
  implicit none
  integer, parameter :: N=3
  real, dimension(N,N) :: c
  integer :: i,j
  character(len=20) :: exFmt
  c = 1.0
  write(exFmt,'("(",I0,"(F8.3))")') N
  do i=1,N
     write(*,exFmt) (c(i,j), j=1,N)
  end do
  end program

这将使 exFmt 成为 '(3(F8.3))',它指定打印三个浮点数(请注意,您可能确实希望 '(3(F8.3," "))' 明确包含一些间距)。

注意一些编译器将允许 exFmt 只是 '(*(F8.3))'。这是 fortran 2008 规范的一部分,因此您可以访问的所有编译器可能都没有提供。有关编译器支持的摘要,请参阅 here(请参阅 无限格式项 ,感谢 HighPerformanceMark)

最后一个简单的方法是使用像 '(1000(F8.3))' 这样的格式语句,其中 1000 比您需要的要大。