我在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)
答案 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,但你不应该因为这个原因而避免它。