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,但您不应该仅仅因为这个原因就避开它。
我有一个用 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,但您不应该仅仅因为这个原因就避开它。