如何用fortran77写一行格式化的矩阵?
假设我有矩阵c(I,j)。我想把它写在最古老的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 )
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版本,因此您应该能够使用最现代的语言功能(并避免旧的攻击)。