Fortran从if语句中写入同一个文件

时间:2016-01-25 11:37:29

标签: fortran

我目前正在处理一些fortran代码并收到错误。

 `Duplicate statement label 201 at (1) and (2)`

我的代码很长,但简化如下:

      integer :: y,x,method
      x = 0
      print*, "Please enter a value (1 or 2)." 
      read(*,*) method
          if (method .EQ. 1) then
            x = 10
              do i=1,1000
                 y = x * i
                 Call OtherFile(y,x,i)
                 write(6,201) long,list,of,variables
201      format('OUTPUT: ',i5,1p,7d10.2)
              enddo
              stop
          else if (method .EQ. 2) then
           x = 10
              do i=1,1000
                y = x * i * i
                Call OtherFile(y,x,i)
                write(6,201) long,list,of,variables,
201       format('OUTPUT: ',i5,1p,7d10.2)
            enddo
          stop
        end if

编辑:在发布之前,我意识到这段代码可行。我无法发布原始作品,所以我最好尝试重新创建问题。 Edit2:我在将其标记为Fortran77时犯了错误,它实际上是旧版本,因为它是以穿孔卡格式编写的。

有问题的行是以201开头的行。

我可以通过分别在每个FORMAT部分之前选择201和202来解决问题,但是还有其他文件依赖于参数201作为声明编号。

有人能说出是否有解决方案?

2 个答案:

答案 0 :(得分:2)

我认为这需要一个完整的解释,不适合评论。 FORMAT不是可执行语句。它只是指示编译器以哪种格式打印或读取DATA。在给定范围内,始终只能有一个FORMAT语句具有相同的标签。究竟是哪一行并不重要。

特别是,在执行writeprintread语句时,程序不会以任何方式跳转到FORMAT语句。编译器只使用那里定义的格式描述。

因此:

          write(6,201) something
201       format('OUTPUT: ',i5,1p,7d10.2)

201       format('OUTPUT: ',i5,1p,7d10.2)
          write(*,201) something

201       format('OUTPUT: ',i5,1p,7d10.2)

          !many lines here

          write(*,201) something

          write(*,201) something

          !many lines here

201       format('OUTPUT: ',i5,1p,7d10.2)

  write(*,"('OUTPUT: ',i5,1p,7d10.2)") something

  write(*,"(i5,1p,7d10.2)") 'OUTPUT: ', something

所有人都会做同样的事情,一切都会好起来的。

在write语句中使用字符常量(或变量)而不是FORMAT语句标签的最后一种方法是现代化的方法。

答案 1 :(得分:1)

format语句不是可执行语句。除非如下所述,否则它们在代码中的位置并不重要。因此,尽管将格式与输出语句放在一起可能很诱人

      write(6,201) long,list,of,variables
201   format('OUTPUT: ',i5,1p,7d10.2)

没有必要。如果想稍后复制该输出,只需复制两行就没有用了:显示的错误信息可以弹出。

详细信息:write(unit=6,fmt=201)(为清晰起见而添加关键字)要求使用标记为format的{​​{1}}语句的格式写入单元6,该语句出现在相同的包含范围内201。后来的一行write正在提供这样的东西。

错误是同一范围内的两个语句不能具有相同的标签。删除其中一个,或更改标签(及其参考)将是合适的。

Vladimir F的答案详细介绍了解决格式重用问题的其他方法。