错误#6404:此名称没有类型,并且必须具有显式类型 - 在子例程

时间:2016-07-01 17:37:28

标签: fortran fortran90 intel-fortran

我正在使用Fortran 90和英特尔编译器。 我很困惑在子程序中使用函数。我的代码是(我删除了一切不重要的):

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

编译器返回:

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 

但这很有效。 如果有人能指出差异并解释解决这个问题的最简单方法,我会很高兴。

1 个答案:

答案 0 :(得分:0)

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

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

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