我目前正在处理一些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作为声明编号。
有人能说出是否有解决方案?
答案 0 :(得分:2)
我认为这需要一个完整的解释,不适合评论。 FORMAT不是可执行语句。它只是指示编译器以哪种格式打印或读取DATA。在给定范围内,始终只能有一个FORMAT
语句具有相同的标签。究竟是哪一行并不重要。
特别是,在执行write
,print
或read
语句时,程序不会以任何方式跳转到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的答案详细介绍了解决格式重用问题的其他方法。