寻找一种更简洁的方法来编写一个相对常见的循环?

时间:2017-05-22 09:33:18

标签: fortran fortran90 fortran77

是否有更简洁的方式来编写这种相对常见的循环类型,

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现在对各种阵列操作都有很好的支持,所以如果有人知道他们认为可以的方式要更清晰,我会非常感谢所有的建议!

1 个答案:

答案 0 :(得分:2)

假设n为正,则在循环过程中i采用值mm+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)

如果边界为xy1n+1,或者数组是可分配的,那么整个数组x和{{可以在左侧使用1}}。

对于y零或负数,数组部分将安全地选择与循环相同的元素(一个或无)。

如果您要在该片段之外使用ni,那么您当然必须手动设置(并且不要忘记l将采取价值i)。

最后,如果你想要摆脱那个循环的更多动机:请注意Fortran 2015删除非阻塞做这样的构造。