Fortran Coder

查看: 9351|回复: 6

[子程序] 最后这个数是哪来的?

[复制链接]

9

帖子

3

主题

0

精华

入门

F 币
48 元
贡献
29 点
发表于 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是哪来的,我输出语句都标注了?

9

帖子

3

主题

0

精华

入门

F 币
48 元
贡献
29 点
 楼主| 发表于 2020-2-19 14:14:41 | 显示全部楼层
为什么没有ido=2啊?有大佬知道原因嘛?

9

帖子

3

主题

0

精华

入门

F 币
48 元
贡献
29 点
 楼主| 发表于 2020-2-19 14:29:34 | 显示全部楼层
我记得视频教程里面明确说过fortran没有全局变量,但我们老师说刚才那个程序中,i
是全局变量,只是后来到了function里面变成局域变量了,这是什么情况?

93

帖子

0

主题

0

精华

大师

F 币
641 元
贡献
283 点

规矩勋章元老勋章新人勋章

发表于 2020-2-20 10:34:48 | 显示全部楼层
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
天之道,损有余而补不足

9

帖子

3

主题

0

精华

入门

F 币
48 元
贡献
29 点
 楼主| 发表于 2020-2-20 14:47:50 | 显示全部楼层
胡文刚 发表于 2020-2-20 10:34
2个问题,见注释
[mw_shl_code=fortran,true]Program test_contains_localVar
  Implicit None

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

1947

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1295 元
贡献
545 点

美女勋章热心勋章星光勋章新人勋章贡献勋章管理勋章帅哥勋章爱心勋章规矩勋章元老勋章水王勋章

发表于 2020-2-20 15:30:29 | 显示全部楼层
如果 fact 里不定义 i,就会继承主程序的 i (因为 fact 是 contains 在主程序里的,所以会继承)
那么,主程序 i=1 的时候,fact 就修改了 i。修改后 i=3,所以到主程序去的时候,i就直接是3,而跳过了 i=2

9

帖子

3

主题

0

精华

入门

F 币
48 元
贡献
29 点
 楼主| 发表于 2020-2-20 20:13:39 | 显示全部楼层
fcode 发表于 2020-2-20 15:30
如果 fact 里不定义 i,就会继承主程序的 i (因为 fact 是 contains 在主程序里的,所以会继承)
那么,主 ...

原来如此,我明白了。谢谢大佬
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-3-28 17:04

Powered by Tencent X3.4

© 2013-2024 Tencent

快速回复 返回顶部 返回列表