Fortran Coder

查看: 195|回复: 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

得到的错误结果

得到的错误结果

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

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

使用道具 举报

452

帖子

0

主题

0

精华

大师

F 币
926 元
贡献
437 点

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

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。

29

帖子

0

主题

0

精华

熟手

F 币
240 元
贡献
88 点

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

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 点
 楼主| 发表于 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 点
 楼主| 发表于 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,才产生了问题。

谢谢你的帮助:)

3

帖子

0

主题

0

精华

入门

F 币
49 元
贡献
30 点
发表于 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 点
 楼主| 发表于 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,谢谢你指出这种求和方法。

61

帖子

2

主题

0

精华

版主

F 币
329 元
贡献
208 点

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

发表于 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)
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|QQ群|Fcode

GMT+8, 2017-10-19 17:07

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

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