Fortran Coder

查看: 9622|回复: 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里面变成局域变量了,这是什么情况?

101

帖子

0

主题

0

精华

大师

F 币
670 元
贡献
299 点

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

地板
发表于 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 点
5#
 楼主| 发表于 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的什么特性导致的嘛?

2033

帖子

12

主题

5

精华

论坛跑堂

臭石头雪球

F 币
1643 元
贡献
709 点

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

6#
发表于 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 点
7#
 楼主| 发表于 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-12-27 16:19

Powered by Tencent X3.4

© 2013-2024 Tencent

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