错误 #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
。编译器似乎默默地将其转换为整数。
我正在使用 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
。编译器似乎默默地将其转换为整数。