Yming 发表于 2020-2-19 14:13:54

最后这个数是哪来的?

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:41

为什么没有ido=2啊?有大佬知道原因嘛?:'(

Yming 发表于 2020-2-19 14:29:34

我记得视频教程里面明确说过fortran没有全局变量,但我们老师说刚才那个程序中,i
是全局变量,只是后来到了function里面变成局域变量了,这是什么情况?:'(

胡文刚 发表于 2020-2-20 10:34:48

2个问题,见注释
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:50

胡文刚 发表于 2020-2-20 10:34
2个问题,见注释
Program test_contains_localVar
Implicit None


我试了一下,确实正常了。不过,我发现,如果在函数中不单独定义i,就会在主程序中直接跳过i=2,而且编译和运行也不报错,这是fortran的什么特性导致的嘛?

fcode 发表于 2020-2-20 15:30:29

如果 fact 里不定义 i,就会继承主程序的 i (因为 fact 是 contains 在主程序里的,所以会继承)
那么,主程序 i=1 的时候,fact 就修改了 i。修改后 i=3,所以到主程序去的时候,i就直接是3,而跳过了 i=2

Yming 发表于 2020-2-20 20:13:39

fcode 发表于 2020-2-20 15:30
如果 fact 里不定义 i,就会继承主程序的 i (因为 fact 是 contains 在主程序里的,所以会继承)
那么,主 ...

原来如此,我明白了。谢谢大佬{:4_110:}
页: [1]
查看完整版本: 最后这个数是哪来的?