青青子衿 发表于 2017-7-9 20:14:15

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

程序目的:键盘输入一维整型数组的3个元素,调用自定义的FUNCTION,对这3个元素求和,并且显示在屏幕上。
      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

vvt 发表于 2017-7-10 09:37:11

我分别用 IVF,gfortran,Ftn95,g95 四种编译器做了测试。均能得到正确的结果。
不管注释行是注释还是执行语句。

请问您用的那款编译器?

青青子衿 发表于 2017-7-15 10:03:30

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

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

kyra 发表于 2017-7-15 10:29:04

SUMARR 没有初始化。
      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:04

kyra 发表于 2017-7-15 10:29
SUMARR 没有初始化。
      PROGRAM SUM
      IMPLICIT NONE


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

青青子衿 发表于 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,才产生了问题。

谢谢你的帮助:)

燕雨蔷薇 发表于 2017-7-15 11:43:21

本帖最后由 燕雨蔷薇 于 2017-7-15 11:47 编辑

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

青青子衿 发表于 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,谢谢你指出这种求和方法。

chiangtp 发表于 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/...無關, 切記:是程式員的錯

補充兩點, 敬請參考
小點心:
大塊肉:
页: [1]
查看完整版本: F77的write问题(本来应该是0,但是显示成了2130567168)