我发现在我正在使用的旧代码中有一个嵌套的 do
结构,希望理解并现代化它。它使用相同的标记行为语句来终止 do
循环以及 go to
语句。这里是一个简化版本,用一些无关紧要的操作说明了原始代码的逻辑:
subroutine original(lim)
k=0
do 10 i=1,4
do 10 j=1,3
k=k-2
if (i>lim) go to 10
k=k+i*j
10 k=k+1
write(*,*) k
return
end
在查看了其他问题和外部资源后,我尽力重写了原始代码逻辑,去除了过时的特性(以及go to
):
subroutine modern(lim)
integer, intent(in) :: lim
integer :: i, j, k
k=0
outer: do i=1,4
inner: do j=1,3
k=k-2
if (i>lim) then
k=k+1
cycle inner
end if
k=k+i*j
k=k+1
end do inner
end do outer
write(*,*) k
end subroutine modern
我使用以下程序对代码进行了测试,包括触发/不触发go to
语句的替代方案:
write(*, '(a)') 'original:'
call original(2)
call original(5)
write(*, '(/,a)') 'modern:'
call modern(2)
call modern(5)
end
它针对原始版本和我现代重写的代码产生相同的结果:
original:
6
48
modern:
6
48
这个动作声明很复杂(对我来说),重写 do
循环时,不能简单地用两个 end do
语句代替它,
而且由于有 go to
的存在,情况更加复杂。我的重写需要复制该动作声明(在 inner
循环的末尾和 if
语句的主体内部)。
因此,我的问题是:
- 处理共享标记行为说明的规范/推荐方法是什么?
- 我的
modern
子程序是原始程序的正确重写吗? - 是否可能重写原始代码而不复制该动作声明(
k=k+1
)?
k=k-1
作为操作的不良选择(再加上动作语句中的k=k+1
)。也许我应该编辑问题,将k=k-1
改为k=k*2
... - jbdv