fortran类型不匹配调用函数

时间:2014-11-02 23:17:27

标签: 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: 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:)

2 个答案:

答案 0 :(得分:1)

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

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

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

答案 1 :(得分:0)

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

1)&#34;在主程序&#34;中提供Collat​​zf类型的声明,这意味着添加

INTEGER :: Collatzf

在PROGRAM ProjectEuler14中对变量声明的声明。

2)&#34;为Collat​​zf功能&#34;提供接口主体,意味着添加

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

在&#34; PROGRAM ProjectEuler14&#34;。

中对变量声明的语句

3)&#34;使该功能成为模块程序,然后在主程序&#34;中使用该模块,这意味着创建一个新文件,名为(为简单起见)&#34; functions.f90&#34 ;:

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

并链接已编译的&#34;函数&#34;模块进入你的主程序:

gfortran main.f90 functions.o