是否有更简洁的方式来编写这种相对常见的循环类型,
70 M=NTOC-N
L=0
DO 100 I=M,NTOC
L=L+1
X(L)=XI(I)
100 Y(L)=YI(I)
不进入索引定义,它的作用是将数组XI,YI的内容从索引 M 复制到 NTOC 到数组X,Y索引1到......(NTOC-M)......需要多少。
在重构一些旧代码时,我注意到我有很多这种循环,虽然我当时可能不太了解,但我想知道 现在更简洁了将此写入辅助代码易读性/可读性的方法? 虽然很大程度上依赖于循环,但我知道Fortran现在对各种阵列操作都有很好的支持,所以如果有人知道他们认为可以的方式要更清晰,我会非常感谢所有的建议!
答案 0 :(得分:2)
假设n
为正,则在循环过程中i
采用值m
,m+1
,...,ntoc
等等所选xi
的元素按顺序排列为xi(m)
,xi(m+1)
,...,xi(ntoc)
。 yi
的元素类似。
就数组部分而言,xi(m:ntoc)
表示相同的元素选择。
同样,左侧x
的元素为x(1)
,x(2)
,...,x(ntoc-m+1)
(= x(n+1)
)。作为数组部分,x(1:n+1)
表示相同的元素。
这意味着:
x(1:n+1)=xi(ntoc-n:ntoc) ! Replacing m with its value
y(1:n+1)=yi(ntoc-n:ntoc)
如果边界为x
且y
为1
和n+1
,或者数组是可分配的,那么整个数组x
和{{可以在左侧使用1}}。
对于y
零或负数,数组部分将安全地选择与循环相同的元素(一个或无)。
如果您要在该片段之外使用n
和i
,那么您当然必须手动设置(并且不要忘记l
将采取价值i
)。
最后,如果你想要摆脱那个循环的更多动机:请注意Fortran 2015删除非阻塞做这样的构造。