【问题标题】:Looking for a more concise way of writing a relatively common loop?寻找一种更简洁的方式来编写一个相对常见的循环?
【发布时间】:2017-05-22 09:33:18
【问题描述】:

有没有更简洁的方式来写这种比较常见的循环类型,

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

【问题讨论】:

  • 你的意思是像x(1:n+1)=xi(ntoc-n:ntoc)
  • @francescalus - 正是这样。非常感激。如果你把它写下来作为答案,我会接受它。

标签: fortran fortran90 fortran77


【解决方案1】:

假设n 是正数,在循环过程中i 取值mm+1、...、ntocxi 的元素按顺序选择,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,或者数组是可分配的,那么整个数组 xy 可以在左侧使用.

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

如果您要在该片段之外使用il,那么您当然必须手动设置它们(不要忘记i 将采用值ntoc+1)。

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

【讨论】:

    猜你喜欢
    • 2021-03-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-04-07
    • 1970-01-01
    相关资源
    最近更新 更多