1 fortran
我写了一个扩展名为 x 的文件。现在我想阅读它,但是当我尝试编译时,出现错误“在 (1) 的 Read 语句中期望变量”
这就是我编写 x 文件的方式:
program avewmean
REAL*8, ALLOCATABLE, DIMENSION (:) :: yc,zc
INTEGER :: p1,p2,p3
ny=192
nz=192
ALLOCATE(yc(ny+1))
ALLOCATE(zc(nz+1))
open(11,file='wmean2d.x',form='unformatted')
write (11) p3,p2
write (11) (((zc(k)),k=1,nz),
. j=1,ny),
. (((yc(j)),k=1,nz),
. j=1,ny)
close(11)
stop
end
Run Code Online (Sandbox Code Playgroud)
这就是我尝试阅读它的方式:
program avewmean
REAL*8, ALLOCATABLE, DIMENSION (:) :: yc,zc
INTEGER :: p1,p2,p3
ny=192
nz=192
ALLOCATE(yc(ny+1))
ALLOCATE(zc(nz+1))
open(11,file='wmean2d.x',form='unformatted')
read (11) p3,p2
read (11) (((zc(k)),k=1,nz),
. j=1,ny),
. (((yc(j)),k=1,nz),
. j=1,ny)
close(11)
stop
end
Run Code Online (Sandbox Code Playgroud)
编译命令为:
gfortran -fdefault-real-8 -o avwmean2d2 avwmean2d2.f
Run Code Online (Sandbox Code Playgroud)
我得到的错误是指“”行read (11) (((zc(k)),k=1,nz):

我究竟做错了什么?
由于我以这种方式编写了代码,因此我认为只需将“write”替换为“read”就可以读取它。这甚至不是我第一次尝试这样的事情。
这是一个类似打字错误的错误,但我认为它值得在答案中进行更详细的解释。奇怪的是,英特尔 Fortran 编译代码时没有进行编译,这使得调试变得更加困难。
由于双重隐含的 do 循环,很容易在括号中迷失,但同样的错误也会发生
read (11) (p3),(p2)
Run Code Online (Sandbox Code Playgroud)
输入列表中的项目(p3)和(p2)是表达式,而不是变量。这是因为变量周围有括号。因此,gfortran 拒绝编译代码,因为输入列表中需要变量。以类似的方式,你无法阅读,p2+p3你也无法阅读(p3)或(p2)。
同样,你需要
read (11) ((zc(k),k=1,nz),
. j=1,ny),
. ((yc(j),k=1,nz),
. j=1,ny)
Run Code Online (Sandbox Code Playgroud)