Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/fortran/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
通过gfortran使用write语句输出格式_Fortran_Gfortran_Intel Fortran - Fatal编程技术网

通过gfortran使用write语句输出格式

通过gfortran使用write语句输出格式,fortran,gfortran,intel-fortran,Fortran,Gfortran,Intel Fortran,我曾经使用过英特尔fortran编译器,它支持使用扩展名,如 write(*, '(<n>(2I4))') (i, 2*i, i=1,n) 现在,我将英特尔fortran编译器更改为gfortran,然后进行测试(t1\u 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

我曾经使用过英特尔fortran编译器,它支持使用扩展名
,如

write(*, '(<n>(2I4))') (i, 2*i, i=1,n)
现在,我将英特尔fortran编译器更改为gfortran,然后进行测试(
t1\u 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)
\s1\u fprint.f90:14.17:
写入(*,'(1x,i16))(i,i=k*列+1,(k+1)*列)
1.
错误:重复附近出现意外元素“

对于一维情况,如
(i,i=…)

  • 如果您有(或得到)一个支持F08的gfortran版本,其浏览量大约在4.6.4以上,请使用
    *
    作为计数,如
    (1x,*i16)

  • 否则,使用老式的hillsF77技巧:由于忽略了格式重复或“超出”数据列表的项,因此只需使用至少与数据一样大的重复计数(但不超过巨大的(0)),这里
    (1x,10i16)
    实际上足够了,但类似于
    (1x,999i16)
    使其更加明显

  • 或者,如果你喜欢额外的工作,可以像下面的2-dim盒子一样在飞行中完成

对于像
(i,(bb(i,j),j=…),i=…)
这样的2维情况,当前使用格式循环插入记录中断:

  • 通过将记录分段写入单独的写入,将其减少到1-dim:
  • 动态生成正确的计数:
附言:实际上你不需要
1i10
,只需要
i10
,但为了一致性,我留下了它。另外,我可能会执行以下操作,而不是对完整块执行循环,然后对部分块执行if,这必须保持同步:

    do k=1,m,column
      l=min(k+column-1,m)
      ... print chunk for i=k,l (numcols is l-k+1) ...
    end do !k

Tks!我按照您的提示测试代码,请参阅上面我重新编辑的内容。它仍然存在一些问题。顺便说一下,PC上的<代码> gfortran版本-/c>命令给出了<代码> GNU FORTRAN(X86Y6POSIX-SEH,由明W64项目构建)4.93.版权(C)2015免费软件基金会, @ DaveTHOMPOSPON.085请不要编辑您的问题来问一个新问题-只要问一个合适的新问题。这让其他搜索者更容易找到它,对此感到抱歉。谢谢你提醒我这个@IanBush@Ian关于您之前的补充问题,
m/column-1
将小于零,不会通过循环。你只需要
m-1
,我试试看。谢谢你的帮助@francescalus
    do i=...
        write(*,'(1i10,*f)') i,(bb(i,j),j=...)
    end do !i
    character(len=20) fmt
    ...
    write(fmt,'(a,i0,a)') '(1i10,', numcols_expression, 'f)'
    write(*, trim(fmt)) (i,(bb(i,j),j=...),i=...)
    ... or ...
    write(fmt,'(i0)') numcols_expression
    write(*, '(1i10,'//trim(fmt)//'f)') (i,bb(i,j),j=...),i=...)
    do k=1,m,column
      l=min(k+column-1,m)
      ... print chunk for i=k,l (numcols is l-k+1) ...
    end do !k