Fortran Coder

标题: F77的write问题(本来应该是0,但是显示成了2130567168) [打印本页]

作者: 青青子衿    时间: 2017-7-9 20:14
标题: F77的write问题(本来应该是0,但是显示成了2130567168)
程序目的:键盘输入一维整型数组的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, 下载次数: 306)

得到的错误结果

得到的错误结果

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

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

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

作者: vvt    时间: 2017-7-10 09:37
我分别用 IVF,gfortran,Ftn95,g95 四种编译器做了测试。均能得到正确的结果。
不管注释行是注释还是执行语句。

请问您用的那款编译器?
作者: 青青子衿    时间: 2017-7-15 10:03
vvt 发表于 2017-7-10 09:37
我分别用 IVF,gfortran,Ftn95,g95 四种编译器做了测试。均能得到正确的结果。
不管注释行是注释还是执行 ...

你好,才看到。
我使用的是CVF。
作者: kyra    时间: 2017-7-15 10:29
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

作者: 青青子衿    时间: 2017-7-15 10:40
kyra 发表于 2017-7-15 10:29
SUMARR 没有初始化。
[mw_shl_code=fortran,true]        PROGRAM SUM
        IMPLICIT NONE

哦好 谢谢 我试一下。但新定义的INTEGER变量,它的初始值不都是0吗?
作者: 青青子衿    时间: 2017-7-15 10:48
vvt 发表于 2017-7-10 09:37
我分别用 IVF,gfortran,Ftn95,g95 四种编译器做了测试。均能得到正确的结果。
不管注释行是注释还是执行 ...

你好,

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

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

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

谢谢你的帮助:)
作者: 燕雨蔷薇    时间: 2017-7-15 11:43
本帖最后由 燕雨蔷薇 于 2017-7-15 11:47 编辑

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

作者: 青青子衿    时间: 2017-7-15 12:47
燕雨蔷薇 发表于 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,谢谢你指出这种求和方法。
作者: chiangtp    时间: 2017-8-12 14: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)




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2