fortran类型的missmatch调用函数

fortran类型的missmatch调用函数,fortran,Fortran,我不知道我的错误是什么,我在谷歌上搜索了这个问题,使用“隐式无”并将eyery变量声明为我使用的整数,但我仍然得到以下错误: 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:

我不知道我的错误是什么,我在谷歌上搜索了这个问题,使用“隐式无”并将eyery变量声明为我使用的整数,但我仍然得到以下错误:

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
整数函数Collatzf(n)
隐式无
整数::n,z
z=0
DO WHILE(n/=1)
如果(MOD(n,2)==0),则
n=n/2
其他的
n=3*n+1
如果结束
z=z+1
结束
Collatzf=z
端功能衣领
计划项目EULER14
隐式无
整数::lsg,e,s,i
lsg=0
e=0
s=0
i=2
那就去做吧
lsg=e
s=i
如果结束
i=i+1
结束
写(*,*)s,i
结束程序项目EULER14

Thx:)

主程序中没有关于
Collatzf
函数的声明

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


在主程序中提供Collatzf类型的声明。比这更好-在主程序中为该函数提供一个接口体。甚至比这更好——将该函数设置为模块过程,然后在主程序中使用该模块。

lanH的答案是正确的。建议的三种解决办法是:

1) “在主程序中提供Collatzf类型的声明”,这意味着添加

INTEGER :: Collatzf
INTERFACE 
   FUNCTION Collatzf (i)
     INTEGER :: Collatzf
     INTEGER, INTENT(IN) :: i
   END FUNCTION Collatzf
END INTERFACE
语句添加到程序ProjectEuler14中的变量声明

2) “为Collatzf函数提供接口体”,意思是添加

INTEGER :: Collatzf
INTERFACE 
   FUNCTION Collatzf (i)
     INTEGER :: Collatzf
     INTEGER, INTENT(IN) :: i
   END FUNCTION Collatzf
END INTERFACE
“PROGRAM ProjectEuler14”中变量声明的语句

3) “将该函数设置为模块过程,然后在主程序中使用该模块”,这意味着创建一个名为(为简单起见)“functions.f90”的新文件:

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

gfortran -c functions.f90
并将编译后的“函数”模块链接到主程序中:

gfortran main.f90 functions.o