以下小代码不起作用:
program main
implicit none
integer, parameter :: dp=selected_real_kind(15)
real(dp) :: v(9)
real(dp) :: vector_norm
v(:) = 3.14_dp
print *, 'Vector norm = ', vector_norm(9,v)
end program main
function vector_norm(n,vec) result(norm)
integer, intent(in) :: n
real(dp), intent(in) :: vec(n)
real(dp) :: norm
norm = sqrt(sum(vec**2))
end function vector_norm
在主程序中,我正在创建一个类型变量 dp
,这样所有内容都是 double 的,我希望函数 vector_norm
也产生 double 结果。我知道我可以简单地使用 double precision function
而不是 function
语句。你们中的任何人都可以在继续使用 selected_real_kind 语句的同时帮助解决该错误。
注意:错误是“A kind type parameter must be a compile-time constant.”
最佳答案
有一个单独的module很方便定义精度,然后在整个代码中导入此模块以确保一致地使用精度。使用模块结构,您的代码将变为
module precision_module
implicit none
integer, parameter :: dp=selected_real_kind(15)
end module
module vector_norm_module
use precision_module, only : dp
implicit none
contains
function vector_norm(n,vec) result(norm)
integer, intent(in) :: n
real(dp), intent(in) :: vec(n)
real(dp) :: norm
norm = sqrt(sum(vec**2))
end function vector_norm
end module
program main
use precision_module, only : dp
use vector_norm_module, only : vector_norm
implicit none
real(dp) :: v(9)
v(:) = 3.14_dp
print *, 'Vector norm = ', vector_norm(9,v)
end program main
关于fortran - 在主程序和函数中使用一致的精度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70082046/