【问题标题】:How do `DO` loops work in Fortran 66?`DO` 循环如何在 Fortran 66 中工作?
【发布时间】:2011-07-29 14:01:06
【问题描述】:

我正在阅读一本在二手书店找到的旧书(又一次)。这本书被称为“Fortran 技术——特别提到非数值应用”,作者是 A. Colin Day,由剑桥大学出版社于 1972 年出版。毕竟,跟上软件开发的最新进展非常重要; -)

本书声称涵盖了 Fortran-66 (X3.9-1966),即 Fortran-IV,与 DATA 语句的标准略有不同,此处不相关。

问题是,这本书似乎留下了很多猜测,我的猜测很不确定 WRT DO 循环。这是在第 1 章中,所以不是一个很好的迹象。

这是一个例子……

    DO 15 I = 1, 87
    J = I - 44

DO 行中,1 和 87 似乎代表循环的包含范围 - I 取值 1 到 87(含),因此 J 取值 -43 到 +43(含)。但是,15 代表什么?

另一个例子是……

    N = 1
    DO 33 I = 1, 10
    ...
33  N = N + N

在这种情况下,33 看起来像一个标签或行号 - 大概是循环重复(或退出)之前执行的最后一行。但是 33 是​​一个奇数,可以作为任意标签选择。

编辑这是一个错误 - 请参阅 duffymo 的答案 - How do `DO` loops work in Fortran 66?

接下来的例子是……

    DO 33 I = 1, 10
    N = 2 ** (I-1)

再次使用相同的 33,但没有任何行被明确标记。

我是不是因为这些是断章取义的短 sn-ps 而感到困惑? DO n ...中的n代表什么?

【问题讨论】:

  • @eriktous - 我找了教程,但没有一个涵盖 Fortran IV 或 66 - 77 似乎是最旧的版本。我没想过要寻找标准 - 我想存在版权问题,即使是古代语言版本。无论如何,我学习 77 可能会更好——它并不那么严重,除了这本书之外,没有什么特别的理由要学习一个版本而不是另一个版本,这本书看起来更像是一本“sn-ps”书而不是一本语言教程或参考。
  • F66 和 F77 标准在 NAG (Numerical Algorithms Group) ftp 服务器上公开可用,该服务器作为标准委员会工作文件的宿主 (ftp.nag.co.uk/sc22wg5/ARCHIVE)。您还可以在那里找到后来标准的草案版本。特定标准的最终草案实际上与官方标准相同。 gfortran wiki 有很多指向各种文档的链接 (gcc.gnu.org/wiki/GFortranStandards)。除非您必须使用遗留代码,否则没有充分的理由不学习现代 Fortran。
  • @eriktous - 谢谢 - 这些链接会很有用。不过,我学习 Fortran 的唯一原因是更好地了解编程语言设计的历史,而学习更新的版本对此无济于事。

标签: fortran


【解决方案1】:

这是一个完整的程序,应该可以回答您的一些问题。可以很容易地测试这个历史问题...... FORTRAN IV 仍然受到许多编译器的支持,尽管 FORTRAN IV 的某些部分要么正式过时,要么在我看来应该过时。我用 g77(由于长期不受支持,已经接近过时)和 gfortran 编译并检查了这个程序。

这是一个示例程序:

      implicit none

      integer i
      real q

      q = 1.0
      do i=1, 10
         q = q * 1.5
      end do
      write (6, *) "modern loop: q =", q

      q = 1.0
      do 100 i=1, 10
         q = q * 1.5
  100 continue
      write (6, *) "loop with continue: q =", q

      q = 1.0
      do 200 i=1, 10
  200 q = q * 1.5
      write (6, *) "loop without continue: q =", q

      stop
      end

以及如何用 gfortran 编译它: gfortran -fixed-form -fixed-line-length-none -std=gnu test_loops.for -o test_loops.exe

关于您的问题:如果您使用作为可执行代码的标记行终止循环,那么该行是循环的一部分吗?程序的输出清楚地表明标记的行是循环的一部分。这是 gfortran 的输出:

现代循环:q = 57.665039
循环继续:q = 57.665039
没有继续的循环:q = 57.665039

【讨论】:

    【解决方案2】:

    行号告诉代码循环完成后去哪里。

    是的,这些数字是奇数、任意且毫无意义的。这是使 FORTRAN 难以阅读和理解的部分原因。

    【讨论】:

    • 但是...... Fortran 如何知道哪些行作为循环的一部分执行?它只是下一行吗?或者到那条标记线的线?对于第二个示例,使用33 N = N + N,本书强烈暗示该行循环中执行-它是通过​​“如果需要一个循环,其中N假定值为1、2、4 , 8, 16, 32, 64, 128, 256, 512,即每次翻倍,则解可以是:"。
    • 我发现的一个 Fortran 77 教程 - folk.uio.no/steikr/doc/f77/tutorial - 建议每个循环的结尾都应该用 continue 标记。对于任何未完成的DO 循环,从程序末尾掉下来是否会导致隐含的continue?作者是不是漏掉了continue来迷惑人?
    • 不,continue 是后来添加到该语言中的。原来都是行标号。
    • 好吧,我仍然很困惑 - 不清楚 Fortran 如何知道在循环中执行 within 的哪些行,以及是否包含标记的行 - 但我不知道不要认为这是我的错。
    • DO(包括)和 continue/labeled 行(不包括)之间的所有行。标记的线就是你退出时降落的地方。
    【解决方案3】:

    数字 15 被称为“标签”,它是由程序员决定的。根据组织标准,这些数字受到控制并遵循特定规则。虽然有些程序员没有遵守标准,他们的代码一团糟;注释和行缩进也是大多数人遵循的标准的一部分。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-08-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多