fortran类型不匹配调用函数 [英] fortran type missmatch calling function

查看:186
本文介绍了fortran类型不匹配调用函数的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我无法弄清楚我的错误是什么,我在问题上进行了搜索,隐式无",并将eyery变量声明为我使用的整数,但仍然出现以下错误:

I cant figure out whats my mistake I googled the problem took "implicit none" and declared eyery variable to integer I used but I still get the follwing errors:

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

推荐答案

lanH的答案是正确的.建议的三种解决方案是:

lanH's answer is correct. Three suggested solutions are:

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

1) "Provide a declaration of the type of Collatzf inside the main program", which means adding

INTEGER :: Collatzf

在PROGRAM ProjectEuler14中声明变量的声明.

statement to the variable declaration in PROGRAM ProjectEuler14.

2)为Collat​​zf函数提供接口主体",这意味着添加

2) "Provide an interface body for Collatzf function", which means means adding

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

"PROGRAM ProjectEuler14"中变量声明的声明.

statements to the variable declaration in "PROGRAM ProjectEuler14".

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

3) "Make that function a module procedure, and then USE the module inside the main program", which means creating a new file, named (for simplicity) "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

然后首先编译函数f90,例如:

Then compile functions.f90 first by e.g.:

gfortran -c functions.f90

并将已编译的功能"模块链接到您的主程序中:

and link the compiled "functions" module into your main program:

gfortran main.f90 functions.o

这篇关于fortran类型不匹配调用函数的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆