正在寻找一种更简洁的方式来编写相对常见的循环?

Looking for a more concise way of writing a relatively common loop?

这种比较常见的循环,有没有更简洁的写法,

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 对所有类型的数组操作都有很好的支持,所以如果有人知道他们认为可以更清晰的方式,我将非常感谢所有建议!

假设 n 为正,在循环过程中 i 取值 mm+1、...、ntoc 和所以选择的 xi 的元素依次是 xi(m)xi(m+1)、...、xi(ntoc)yi的元素相似

就数组部分而言,xi(m:ntoc) 表示相同的 selection 元素。

同理,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)

并且如果边界是 xy1n+1,或者数组是可分配的,那么整个数组 xy 可以用在左侧。

对于 n 零或负数,数组部分将安全地 select 与循环相同的元素(一个或 none)。

如果你要在该片段之外使用 il 那么你当然必须手动设置它们(并且不要忘记 i 会取值 ntoc+1).

最后,如果您想要更多的动力来摆脱该循环:请注意,像这样的非块 do 结构已被 Fortran 2015 删除。