2014-11-02 74 views
0

我找不出什么我的错误,我用Google搜索这个问题采取了“隐无”,并宣布eyery变量整数我用,但我仍然得到follwing错误:FORTRAN型missmatch调用函数

main.f95:37.20: 

    e = Collatzf(i) 
       1 
Error: Return type mismatch of function 'collatzf' at (1) (UNKNOWN/INTEGER(4)) 
main.f95:37.12: 

    e = Collatzf(i) 
     1 
Error: Function 'collatzf' at (1) has no IMPLICIT type 

这里是我的代码:

INTEGER FUNCTION Collatzf(n) 

    IMPLICIT NONE 
    INTEGER :: n, z 

    z = 0 

    DO WHILE(n /= 1) 

     IF (MOD(n, 2) == 0) THEN 
      n = n/2 
     ELSE 
      n = 3 * n + 1 
     END IF 

     z = z + 1 

    END DO 

    Collatzf = z 

END FUNCTION Collatzf 


PROGRAM ProjectEuler14 

    IMPLICIT NONE 
    INTEGER :: lsg, e, s, i 

    lsg = 0 
    e = 0 
    s = 0 
    i = 2 

    DO WHILE(i <= 1000000) 

     e = Collatzf(i) 

     IF(e > lsg) THEN 
      lsg = e 
      s = i 
     END IF 

     i = i + 1 

    END DO 

    WRITE(*, *) s, i 

END PROGRAM ProjectEuler14 

THX :)

回答

0

lanH的回答是正确的。三个建议的解决方案是:

1)“提供Collat​​zf的主程序内的类型的声明”,这意味着添加

INTEGER :: Collatzf 

语句在PROGRAM ProjectEuler14变量声明。

2),这意味着装置添加

INTERFACE 
    FUNCTION Collatzf (i) 
    INTEGER :: Collatzf 
    INTEGER, INTENT(IN) :: i 
    END FUNCTION Collatzf 
END INTERFACE 

语句来在 “PROGRAM ProjectEuler14” 变量声明 “为Collat​​zf功能提供接口机构”。

3)“作出这样的功能的模块程序,然后使用主程序内的模块”,这意味着创建一个新文件,命名为(为简单起见)“functions.f90”:

MODULE functions 

CONTAINS 

    INTEGER FUNCTION Collatzf(n) 

    IMPLICIT NONE 
    INTEGER :: n, z 

    z = 0 

    DO WHILE(n /= 1) 

     IF (MOD(n, 2) == 0) THEN 
      n = n/2 
     ELSE 
      n = 3 * n + 1 
     END IF 

     z = z + 1 

    END DO 

    Collatzf = z 

    END FUNCTION Collatzf 

END MODULE functions 

然后,例如通过先编译functions.f90:

gfortran -c functions.f90 

和编撰的 “功能” 模块链接到你的主程序:

gfortran main.f90 functions.o 
+0

谢谢你非常有帮助 – Anzzi 2014-11-03 13:41:14

1

没有声明主程序里面Collatzf功能。

Fortran中的程序单元有一个单独的编译模型 - 编译程序单元时,编译器技术上对其他程序单元一无所知,除非有声明明确说明其他单元。因此,编译主程序时(从PROGRAM语句到END PROGRAM语句)编译器不知道Collatzf是什么,即使该外部函数的定义紧接在主程序之前。它不能应用隐式打字规则,因为你指定了IMPLICIT NONE(一件好事),因此你会看到第二个错误。

在主程序中提供Collat​​zf类型的声明。比这更好 - 在主程序中为该功能提供接口主体。甚至比再次更好 - 使该功能成为模块过程,然后在主程序中使用该模块。