gfortran error: unexpected element '\' in format string at (1)

gfortran error: unexpected element '\' in format string at (1)

我有一个用 VS2010 和 Intel Visual Fortran 编写的项目。我有一个转储子例程来将 2D 矩阵写入文件:

subroutine Dump2D(Name,Nx,Ny,Res)
    implicit none
    integer i,j,Nx,Ny
    real(8) :: Res(Nx,Ny)
    character(len=30) name,Filename
    logical alive
    write(filename,*) trim(Name),".dat"
    Write(*,*) "Saving ",trim(Name)," Please wait..."
    open (10,file=filename)
    do i=1,Ny
           Write(10,FMt="(D21.13\)")   (Res(j,i),j=1,Nx)
           Write(10,*)  
    end do
    close(10)
    Write(*,*) "Save ",trim(Name),"Complete!"  
    return
end subroutine Dump2D

可以编译,运行。但是当我使用 gfortran 在 emacs 中编译时,它给了我错误:

我认为这是因为 gfortran 无法识别 \ 格式的写入命令。我该如何解决这个问题?

                Write(10,FMt="(D21.13\)") (Res(j,i),j=1,Nx)
                                   1
Error: Unexpected element '\' in format string at (1)

编辑描述符\反斜杠 编辑有关。这是一个非标准的扩展 provided by the Intel compiler(也许还有其他)。 gfortran 不支持它。

这样的反斜杠编辑是为了影响回车控制。就像在 this answer 中一样,可以使用(标准)非推进输出来处理这种效果。1

因为您只是想将矩阵的每一列输出到一个 record/line,所以您不必为此费心。2 相反(正如您将看到的在许多其他问题中):

do i=1,Ny
   write(10,fmt="(*(D21.13))") Res(:,i)
end do

还有其他方法可以通过更一般的搜索找到。


1 英特尔编译器以相同的方式处理 \$

2 \ 有一些微妙的方面,但我假设你不关心这些。

另一种方法(尽管 francescalus 的答案对你来说更好)是构建一个格式字符串,其中包含要包含在你的行中的元素数。这样做的一种方法是使用以下内容来构建格式字符串(它使用显式 space 字符来分隔文件中一行中的元素):

WRITE(fmtString, '(A,I0,A)') '(', Nx, '(D21.13,:,1X))'    *

然后在 WRITE 语句中使用格式字符串变量,如下所示:

do i=1,Ny
   Write(10,FMt=fmtString)   (Res(j,i),j=1,Nx)
end do

如果您想使用 spaces 以外的东西来分隔元素(例如逗号或分号),这种方法也非常有用。

*由于这有点难以阅读,我将提供一个示例。对于 Nx = 3,这相当于:

fmtString = '(3(D21.13,:,1X))'

这是使用 D21.13 格式化的 2 个数字,每个数字后跟一个 space,最后一个数字使用 D21.13 格式化,但后面没有 space(如“: " 停在最后一项)。

反斜杠在 Fortran 77 FORMAT 语句中无效。 Gfortran 不会编译它,除非你修改代码。没有标志会改变 AFAIK(-fbackslash 在这里应该没有帮助)。

如果我正确理解了意图(我可能是错的),反斜杠与其他一些编译器中的美元符号的作用相同,并防止终止记录(行)。在这种情况下,写入语句中的 advance="no" 应该会有所帮助。它是 Fortran 90,但您不应该仅仅因为这个原因就避开它。