Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/powerbi/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何用fortran77写一行格式化的矩阵?_Fortran_Output_Fortran77 - Fatal编程技术网

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

如何用fortran77写一行格式化的矩阵?,fortran,output,fortran77,Fortran,Output,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 )

假设我有矩阵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规范的一部分,因此您可能无法访问所有编译器。有关编译器支持的摘要,请参阅(由于HighPerformanceMark,请参阅无限制格式项)


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

您的格式只指定一个浮点,但实际上您希望每行写入
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规范的一部分,因此您可能无法访问所有编译器。有关编译器支持的摘要,请参阅(由于HighPerformanceMark,请参阅无限制格式项)


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

您在这里添加的
$
在技术上是非标准的,我相信可以用更现代的fortran语言(例如
write(*,”(F9.3,a)”,advance='no')c(I,j),“
来代替。请注意,您的解决方案不是Fortran 77。问题是,你为什么要求Fortran 77?你必须深入挖掘才能找到只有F77的编译器。您的代码片段肯定不是F77,因此不太清楚您要的是什么。@haraldkl:这不是真的,因为我只是使用mpif77编译器运行它。但完全有可能
mpif77
实际上指向fortran 90(及以后)兼容的编译器。试着运行
mpif77--version
,看看它实际上使用的是什么编译器“引擎盖下”。这是一个相对现代的
gfortran
版本,它将完全支持从fortran 77到fortran 2008的许多fortran版本,因此您应该能够使用最现代的语言功能(并避免旧的攻击)。我相信您在这里添加的
$
在技术上是不标准的,可以用更现代的fortran中的
advance='no'
代替(例如
write(*,'(F9.3,A)',advance='no')c(I,j),“
)。请注意,您的解决方案不是fortran 77。问题是,你为什么要求Fortran 77?你必须深入挖掘才能找到只有F77的编译器。您的代码片段肯定不是F77,因此不太清楚您要的是什么。@haraldkl:这不是真的,因为我只是使用mpif77编译器运行它。但完全有可能
mpif77
实际上指向fortran 90(及以后)兼容的编译器。试着运行
mpif77--version
,看看它实际上使用的是什么编译器“引擎盖下”。这是一个相对现代的
gfortran
版本,它将完全支持从fortran 77到fortran 2008的许多fortran版本,因此您应该能够使用最现代的语言功能(并避免旧的攻击)。