错误 #6404:此名称没有类型,必须具有显式类型 - 在子例程中使用函数

error #6404: This name does not have a type, and must have an explicit type - using function in subroutine

我正在使用 Fortran 90 和 Intel 编译器。 我对在子例程中使用函数感到非常困惑。我的代码是(我删除了所有不重要的东西):

program test
INTEGER     :: seed=5 
REAL        :: nor_ran_number1, nor_ran_number2
CALL Box_Muller_transform(seed,nor_ran_number1,nor_ran_number2)
end program test

double precision function grnd(SEED)
grnd=5
return
end

SUBROUTINE Box_Muller_transform (seed,nor_ran_number1,nor_ran_number2)
implicit none
INTEGER, INTENT(in) :: seed
REAL, INTENT(out)   :: nor_ran_number1, nor_ran_number2

    nor_ran_number1 = grnd(seed)
    nor_ran_number2 = grnd(seed)

end SUBROUTINE Box_Muller_transform

编译器returns:

error #6404: This name does not have a type, and must have an explicit
type.   [GRND]
nor_ran_number1 = grnd(seed)
------------------^

我找到了 this 并了解到函数 "grad" 在 "Box_Muller_transform" 中不可见。 但是 那么我希望下面的代码会产生同样的错误:

program test
INTEGER ::a=5, b
call sub(a,b)
write(*,*) b
end program 

SUBROUTINE sub(a,b)
INTEGER, INTENT(in)     ::a
INTEGER, INTENT(out)    ::b
b = fun(a)
end subroutine sub

function fun(a)
INTEGER     :: fun 
INTEGER     :: a
fun         = a*a
end function fun 

但这是可行的。 如果有人能指出差异并解释解决此问题的最简单方法,我将非常高兴。

函数必须定义其 return 值。由于您在第一个示例中使用 implicit none,因此必须明确定义 grnd 的 return 值的类型:

SUBROUTINE Box_Muller_transform (seed,nor_ran_number1,nor_ran_number2)
implicit none
INTEGER, INTENT(in) :: seed
REAL, INTENT(out)   :: nor_ran_number1, nor_ran_number2
double precision    :: grnd

    nor_ran_number1 = grnd(seed)
    nor_ran_number2 = grnd(seed)

end SUBROUTINE Box_Muller_transform

在第二个示例中,您没有在 sub 中指定 implicit none,因此 fun 被假定为(隐式)类型 real。编译器似乎默默地将其转换为整数。