【发布时间】:2021-01-23 02:46:50
【问题描述】:
我用过 Intel fortran 编译器,它支持使用 <n> 扩展,比如
write(*, '(<n>(2I4))') (i, 2*i, i=1,n)
为了说明,我给出一个s1_fprint.f90子程序如下
subroutine fprint(name,bb)
IMPLICIT NONE
character(len=*), intent(in) :: name
real, intent(in) :: bb(:,:)
integer :: column=10
integer i,j,k,m,n
n = size(bb,1)
m = size(bb,2)
write(*,'(1a)')name
do k=0,m/column-1
write(*, '(1x,<column>i16)')(i,i=k*column+1,(k+1)*column)
write(*,'(1i10,<column>f)')(i,(bb(i,j),j=k*column+1,(k+1)*column),i=1,n)
write(*,'(/)')
end do
if(mod(m,column)/=0)then
write(*, '(1x,<m-m/column*column>i16)')(i,i=m/column*column+1,m)
write(*,'(1i10,<m-m/column*column>f)')(i,(bb(i,j),j=m/column*column+1,m),i=1,n)
write(*,'(/)')
endif
end subroutine fprint
现在,我将 Intel fortran 编译器更改为 gfortran,然后进行测试 (t1_useSur.f90)
gfortran 中的上述子程序如下:
program main
implicit none
real :: A(2,3) = reshape([1.2, 2.3, 3.4, 4.5, 5.6, 6.7], [2,3])
call fprint('A',A)
end program main
这应该向我们展示类似的东西
A
1 2 3
1 1.2000000 3.4000001 5.5999999
2 2.3000000 4.5000000 6.6999998
但是,当我在 gfortran 编译器中运行时
gfortran t1_useSur.f90 s1_fprint.f90 -o out
./out
有很多错误
.\s1_fprint.f90:14.17:
write(*, '(1x,<column>i16)')(i,i=k*column+1,(k+1)*column)
1
Error: Unexpected element '<' in format string at (1)
.\s1_fprint.f90:15.19:
write(*,'(1i10,<column>f)')(i,(bb(i,j),j=k*column+1,(k+1)*column),i=1,n)
1
Error: Unexpected element '<' in format string at (1)
.\s1_fprint.f90:19.17:
write(*, '(1x,<m-m/column*column>i16)')(i,i=m/column*column+1,m)
1
Error: Unexpected element '<' in format string at (1)
.\s1_fprint.f90:20.19:
write(*,'(1i10,<m-m/column*column>f)')(i,(bb(i,j),j=m/column*column+1,m),i=
1
Error: Unexpected element '<' in format string at (1)
由于gfortran不支持<n>扩展,如何解决这些问题?
【问题讨论】:
-
关于您之前的补充问题,
m/column-1将小于零,不会通过循环。你只需要m-1。 -
我会试试的。谢谢你的帮助@francescalus
标签: fortran gfortran intel-fortran