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