我无法弄清楚我的错误是什么我用谷歌搜索了“隐式无”并将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:)
答案 0 :(得分:1)
主程序中没有Collatzf
函数的声明。
Fortran中的程序单元有一个单独的编译模型 - 在编译程序单元时,编译器在技术上对其他程序单元一无所知,除非有一些语句能够让它明确了解其他单元。因此,在编译主程序时(从PROGRAM ...语句到END PROGRAM语句),编译器不知道Collatzf
是什么,即使该外部函数的定义紧接在主程序之前。它不能应用隐式类型规则,因为你已经指定了IMPLICIT NONE(一件好事),因此你会看到第二个错误。
在主程序中提供Collatzf类型的声明。更好的是 - 在主程序中为该函数提供一个接口体。甚至比这更好 - 使该功能成为模块程序,然后在主程序中使用该模块。
答案 1 :(得分:0)
lanH的回答是正确的。三个建议的解决方案是:
1)&#34;在主程序&#34;中提供Collatzf类型的声明,这意味着添加
INTEGER :: Collatzf
在PROGRAM ProjectEuler14中对变量声明的声明。
2)&#34;为Collatzf功能&#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.f90gfortran -c functions.f90
并链接已编译的&#34;函数&#34;模块进入你的主程序:
gfortran main.f90 functions.o