Fortran Coder

查看: 10686|回复: 8
打印 上一主题 下一主题

[数值问题] F77的write问题(本来应该是0,但是显示成了2130567168)

[复制链接]

5

帖子

1

主题

0

精华

新人

F 币
26 元
贡献
14 点
跳转到指定楼层
楼主
发表于 2017-7-9 20:14:15 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
程序目的:键盘输入一维整型数组的3个元素,调用自定义的FUNCTION,对这3个元素求和,并且显示在屏幕上。
[Fortran] 纯文本查看 复制代码
        PROGRAM SUM
        IMPLICIT NONE
        INTEGER SUMARR             ! FUNCTION的声明
        INTEGER N,S,A(3)
        N=3
        READ *,A
        S=SUMARR(A,N)                ! 调用自定义FUNCTION
        WRITE(6,10) S
10        FORMAT(1X,'SUM OF THE ARRAY ELEMENTS: ',I10)  !不管输入是多少,程序的输出总是 213056**** 这种类型的10位数字
        ENDPROGRAM SUM

        INTEGER FUNCTION SUMARR(A,N)      ! FUNCTION定义
        IMPLICIT NONE
        INTEGER I,N,A(N)
        DO I=1,N
                SUMARR=SUMARR+A(I)
        ENDDO
C        PRINT *,''                       ! 如果这一行由注释变成可执行语句,程序的求和会正常输出,比如输入1,1,1, 就会输出3;如果这行作为注释行,输入0,0,0,得到的结果是2130567168
        RETURN
        END

1111.png (39.31 KB, 下载次数: 321)

得到的错误结果

得到的错误结果

2222.png (43.66 KB, 下载次数: 325)

在FUNCTION里随意添加一个print后就能得到正确结果

在FUNCTION里随意添加一个print后就能得到正确结果
分享到:  微信微信
收藏收藏 点赞点赞 点踩点踩

954

帖子

0

主题

0

精华

大师

F 币
184 元
贡献
75 点

规矩勋章元老勋章新人勋章水王勋章热心勋章

QQ
沙发
发表于 2017-7-10 09:37:11 | 只看该作者
我分别用 IVF,gfortran,Ftn95,g95 四种编译器做了测试。均能得到正确的结果。
不管注释行是注释还是执行语句。

请问您用的那款编译器?

5

帖子

1

主题

0

精华

新人

F 币
26 元
贡献
14 点
板凳
 楼主| 发表于 2017-7-15 10:03:30 | 只看该作者
vvt 发表于 2017-7-10 09:37
我分别用 IVF,gfortran,Ftn95,g95 四种编译器做了测试。均能得到正确的结果。
不管注释行是注释还是执行 ...

你好,才看到。
我使用的是CVF。

260

帖子

0

主题

0

精华

版主

World Analyser

F 币
722 元
贡献
512 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
地板
发表于 2017-7-15 10:29:04 | 只看该作者
SUMARR 没有初始化。
[Fortran] 纯文本查看 复制代码
        PROGRAM SUM
        IMPLICIT NONE
        INTEGER SUMARR             
        INTEGER N,S,A(3)
        N=3
        READ *,A
        S=SUMARR(A,N)             
        WRITE(6,10) S
10        FORMAT(1X,'SUM OF THE ARRAY ELEMENTS: ',I10) 
        ENDPROGRAM SUM

        INTEGER FUNCTION SUMARR(A,N)    
        IMPLICIT NONE
        INTEGER I,N,A(N)
        SUMARR = 0 !!!!!!!!!!!******这一句非常重要
        DO I=1,N
                SUMARR=SUMARR+A(I)
        ENDDO
C        PRINT *,''                   
        RETURN
        END

5

帖子

1

主题

0

精华

新人

F 币
26 元
贡献
14 点
5#
 楼主| 发表于 2017-7-15 10:40:04 | 只看该作者
kyra 发表于 2017-7-15 10:29
SUMARR 没有初始化。
[mw_shl_code=fortran,true]        PROGRAM SUM
        IMPLICIT NONE

哦好 谢谢 我试一下。但新定义的INTEGER变量,它的初始值不都是0吗?

5

帖子

1

主题

0

精华

新人

F 币
26 元
贡献
14 点
6#
 楼主| 发表于 2017-7-15 10:48:54 | 只看该作者
vvt 发表于 2017-7-10 09:37
我分别用 IVF,gfortran,Ftn95,g95 四种编译器做了测试。均能得到正确的结果。
不管注释行是注释还是执行 ...

你好,

kyra指出,因为SUMARR没有初始化,我由此调整了代码,得到了正确结果。

使用IVF、gfortran、Ftn95、g95都得到了正确的结果,应该是因为在这些编译器中,会给没有赋初值的INTEGER变量赋值为0。

而CVF可能在这方面出了些问题,所以我在FUNCTION中定义的SUMARR的初值并不是0,才产生了问题。

谢谢你的帮助:)

6

帖子

0

主题

0

精华

入门

腐女

F 币
76 元
贡献
49 点
7#
发表于 2017-7-15 11:43:21 | 只看该作者
本帖最后由 燕雨蔷薇 于 2017-7-15 11:47 编辑

未初始化的变量,其值不确定。IVF、gfortran这些,如果是0,亦不能保证始终是0。
所以,任何编译器,都应该初始化变量。这是一个良好的习惯。
另外,求数组的和,本可以不用循环,
SUMARR = sum( A )
就能求取了。此时,SUMARR 也无需初始化。

5

帖子

1

主题

0

精华

新人

F 币
26 元
贡献
14 点
8#
 楼主| 发表于 2017-7-15 12:47:44 | 只看该作者
燕雨蔷薇 发表于 2017-7-15 11:43
未初始化的变量,其值不确定。IVF、gfortran这些,如果是0,亦不能保证始终是0。
所以,任何编译器,都应该 ...

谢谢你的建议,"new variable should be created with type, name, initial value",完整地描述一个变量需要3个维度:NAME \TYPE \ INVAL。
这里是在练习FUNCTION的定义及使用方法,所以没有使用FORTRAN的libFUNs,谢谢你指出这种求和方法。

130

帖子

10

主题

0

精华

大师

F 币
617 元
贡献
372 点

贡献勋章管理勋章帅哥勋章元老勋章星光勋章规矩勋章

9#
发表于 2017-8-12 14:10:10 | 只看该作者
給"地板"+"7#"的"觀念"拍拍手

程式的"測試"階段, compilt-time-options要儘量non-optimization, runtime時 "undefined", "array subscript overflow", ..."會無所遁形
Logical Errors: 人認為錯的, runtime不一定會報錯 (optimization, 不檢查跑得快), 與Fortran/C/...U=抑或NAG/Compaq/...無關, 切記:是程式員的錯

補充兩點, 敬請參考
小點心: data-initialization.pdf (37.17 KB, 下载次数: 2)
大塊肉: save-attribute.pdf (363.39 KB, 下载次数: 2)
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

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

GMT+8, 2024-12-26 08:58

Powered by Tencent X3.4

© 2013-2024 Tencent

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