如何使循环计数器不大于最终值?

时间:2012-08-08 22:57:33

标签: fortran intel-fortran

样本循环:

do i=1,1
    print *,i
enddo
print *,i

2作为i的最终值。如何在Windows上为Visual Studio设置英特尔Fortran,为1提供i的最终值?

2 个答案:

答案 0 :(得分:5)

这是Fortran循环工作数十年的方式,你不能简单地用编译器选项来改变它。 Fortran标准明确指出:

  

8.1.4.4.1循环启动

     

(2)DO变量用初始参数 m 1 的值定义。

     

(3)迭代计数已建立,是表达式的值   MAX (INT ((m2 – m1 + m3) / m3), 0)

此处 m 1 m 2 m 3 loop-control 中的三个参数:[,] var = m1,m2[,m3],给出i=1,1的示例( m 3 < / em>如果省略则隐式1)迭代计数为MAX(INT((1-1+1)/1),0),其计算结果为1,即循环应该执行一次。 i根据(2)初始化为1

  

8.1.4.4.2执行周期

     

DO构造的执行周期由以下步骤重复执行,直到终止:

     

(1)测试迭代计数(如果有的话)。如果迭代计数为零,则循环终止并且DO构造变为非活动状态。如果 loop-control [ , ] WHILE (scalar-logical-expr),则会评估标量 - 逻辑区域xpr ;如果此表达式的值为false,则循环终止,DO构造变为非活动状态。因此,如果共享 do-term-shared-stmt 的所有DO构造都处于非活动状态,则完成所有这些构造的执行。但是,如果共享 do-term-shared-stmt 的某些DO构造处于活动状态,则继续执行主动DO构造的执行周期的步骤(3),其DO语句最近执行

Fortran测试剩余的迭代次数是否大于零,而不是DO变量小于(大于)结束值。

  

(2)如果迭代计数非零,则执行循环的范围。

     

(3)迭代计数(如果有的话)减1。 DO变量(如果有)将增加增量参数 m 3 的值。

当执行循环的迭代时,DO变量总是递增。因此,在第一次执行后i增加了1,其评估为2

  

除了在步骤(3)中发生的DO变量的增量之外,DO变量在DO构造处于活动状态时,既不能重新定义也不能变为未定义。

     

8.1.4.4.4循环终止

     

当DO构造变为非活动状态时,DO构造的DO变量(如果有的话)保留其最后定义的值。

最后定义的值为2。因此,在DO循环结束后,i等于2

我已经从ISO / IEC 1539:1991(又名Fortran 90)中删除了文本,但是也可以在ISO / IEC 1539:1980(又名ANSI X3J3 / 90.4)的§11.10.3中找到相同的文本。又称FORTRAN 77;没有F77中不存在的WHILE内容,以及ISO / IEC 1539-1:2010(又名Fortran 2008)的§8.1.6.6。

答案 1 :(得分:3)

你不能,因为那是DO的工作原理;当控制变量超出限制时停止。

一般来说,在几乎任何带有FOR / DO计数循环的语言中,你应该只在循环体内使用循环控制变量,并在其他地方将其视为未定义,即使你实际上不能将其范围限制为身体。

在你的情况下,我会使用一个不同的变量来跟踪任何迭代中i的实际最后一个值:

lasti = 0
do i=1,1
   print *,i
   lasti = i
enddo
print *,lasti