gfortran错误:意外元素' \'格式字符串(1)

时间:2017-03-30 11:42:23

标签: fortran gfortran

我在VS2010中使用英特尔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)

3 个答案:

答案 0 :(得分:2)

另一种方法(尽管francescalus的答案在你的情况下更好)是建立一个格式字符串,其中包含要包含在行中的元素数量。一种方法是使用以下方法构建格式字符串(使用显式空格字符分隔文件中一行内的元素):

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

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

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

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

这是使用D21.13格式化的2个数字,每个数字后跟一个空格,以及使用D21.13格式化的最终数字,但后面没有空格(因为“:”在最终项目处停止)。

答案 1 :(得分:1)

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

这种反斜杠编辑旨在影响托架控制。就像在this answer中一样,这种效果可以通过(标准)非前进输出来处理。 1

由于您只是想将矩阵的每一列输出到记录/行,您不必为此付出麻烦。 2 相反(正如您在其他许多其他地方看到的那样)题):

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

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

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

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

答案 2 :(得分:0)

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

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