我正在查看用fortran编写的空气质量模型的代码,并对fortran从do-loops传递变量的方式有一些疑问。
这个非常简单的例子说明了我的意思:
PROGRAM carla
IMPLICIT NONE
!
INTEGER, PARAMETER :: LM = 24, DEZASSEIS = 16
INTEGER :: L, VARIAVEL, SOMA
!
DO L=1,LM
WRITE(*,*) 'L = ', L
END DO
!
WRITE(*,*) 'I am now ouside of the DO loop.'
WRITE(*,*) 'I would expect L=LM=24... And SOMA=40'
WRITE(*,*) 'L = ', L
SOMA = DEZASSEIS + L
WRITE(*,*) 'SOMA = ', SOMA
END PROGRAM carla
我希望L = LM = 24 ...并且SOMA = 40 ...... 但我得到了:
L = 25
SOMA = 41
我不明白为什么一旦我们在DO循环之外,L没有保持假设的最后一个值(SOMA将等于40),并且继续增加......
有人可以给我一个提示吗?
答案 0 :(得分:3)
Fortran不会那样工作。 (这不是Matlab:P)
如果在DO循环外使用索引变量,请务必小心 因为变量在循环结束时递增,即它 将比最终值更大的步骤。
http://www.oc.nps.edu/~bird/oc3030_online/fortran/do/do.html
这解释了循环后L=25
的原因。
编辑:以下内容不正确。请参阅下面的M.S.B.评论
在Fortran中,DO变量...永远不应在循环之外引用,除非先明确赋值。 - http://www.esm.psu.edu/~ajm138/fortranexamples.html
答案 1 :(得分:1)
从1到24循环, 所以当它达到25时,循环就完成了。
Think of it as
(pseudocode)
LL = 1
While LL < 25
LL = LL + 1;
正如GummiV所说,不要这样做。循环是编译器优化的主要目标,不能保证循环执行后的内容。可以很容易地为0,一个优化反转计数,因为检测LL = 0比LL更快> 24在一些机器上。不是更快,但编译器人员确实存在问题。