我正在使用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
但这很有效。 如果有人能指出差异并解释解决这个问题的最简单方法,我会很高兴。
答案 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
。编译器似乎默默地将其转换为整数。