在 (1) 处的 READ 语句中需要变量

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”就可以读取它。这甚至不是我第一次尝试这样的事情。

Vla*_*r F 5

这是一个类似打字错误的错误,但我认为它值得在答案中进行更详细的解释。奇怪的是,英特尔 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)