Fortran Coder

标题: 最后这个数是哪来的? [打印本页]

作者: Yming    时间: 2020-2-19 14:13
标题: 最后这个数是哪来的?
Program test_contains_localVar
    Implicit None
    Integer :: i
    Do i = 1, 3
        Write(*,*) 'ido=',i
        Write(*,*) 'fact=',fact(i)
    End do

    Contains
        Function fact(n)
            Integer :: fact,n,temp
            temp = 1
            Do i = 2, n
                Write(*,*) 'i=',i
                temp = i*temp
            End do
            fact = temp
        End Function fact
End Program test_contains_localVar

出来的结果是:
ido= 1
fact=1
ido=3
i=2
i=3
6
好奇怪啊,为什么主程序里直接跳过2了?最后那个6是哪来的,我输出语句都标注了?


作者: Yming    时间: 2020-2-19 14:14
为什么没有ido=2啊?有大佬知道原因嘛?
作者: Yming    时间: 2020-2-19 14:29
我记得视频教程里面明确说过fortran没有全局变量,但我们老师说刚才那个程序中,i
是全局变量,只是后来到了function里面变成局域变量了,这是什么情况?
作者: 胡文刚    时间: 2020-2-20 10:34
2个问题,见注释
[Fortran] 纯文本查看 复制代码
Program test_contains_localVar
  Implicit None
  Integer :: i , s
  Do i = 1, 3
    Write(*,*) 'ido=',i
    s = fact(i) !//避免主程序write中子程序也write
    Write(*,*) 'fact=',s
  End do

  Contains
    Function fact(n)
    Integer :: i,fact,n,temp!//子程序要单独定义循环变量
    temp = 1
    Do i = 2, n
      Write(*,*) 'i=',i
      temp = i*temp
    End do
    fact = temp
    End Function fact
End Program test_contains_localVar

作者: Yming    时间: 2020-2-20 14:47
胡文刚 发表于 2020-2-20 10:34
2个问题,见注释
[mw_shl_code=fortran,true]Program test_contains_localVar
  Implicit None

我试了一下,确实正常了。不过,我发现,如果在函数中不单独定义i,就会在主程序中直接跳过i=2,而且编译和运行也不报错,这是fortran的什么特性导致的嘛?
作者: fcode    时间: 2020-2-20 15:30
如果 fact 里不定义 i,就会继承主程序的 i (因为 fact 是 contains 在主程序里的,所以会继承)
那么,主程序 i=1 的时候,fact 就修改了 i。修改后 i=3,所以到主程序去的时候,i就直接是3,而跳过了 i=2
作者: Yming    时间: 2020-2-20 20:13
fcode 发表于 2020-2-20 15:30
如果 fact 里不定义 i,就会继承主程序的 i (因为 fact 是 contains 在主程序里的,所以会继承)
那么,主 ...

原来如此,我明白了。谢谢大佬




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2