由非内在函数给出的常量值
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了由非内在函数给出的常量值相关的知识,希望对你有一定的参考价值。
在Fortran中,有没有办法在编译时使用除内部函数之外的其他常量函数初始化我的命名常量?
我想使用我自己的函数计算一个值,然后使用此值来声明数组的大小,例如我在下面的尝试中。
integer function factorial(n)
implicit none
integer, intent(in) :: n
integer :: i, ans
ans=1
do i=1,n
ans=ans*i
end do
factorial = ans
end function Factorial
integer function binomial(n,k)
implicit none
integer, intent(in) :: n, k
integer :: factorial
binomial = Factorial(n)/factorial(n-k)/factorial(k)
end function binomial
program main
implicit none
integer, parameter :: m=10, n=3
integer :: binomial
integer, parameter :: sz=binomial(m,n)
complex, dimension(sz) :: hamiltonian
...
end program main
或者我是否必须自己计算这个值并在代码中明确地写出来?
答案
正如您所知,Fortran标准禁止在编译时计算超出内部例程的能力。如果你真的必须在编译时进行这些计算,那么像这样的黑客可能会吸引你:
INTEGER, DIMENSION(20), PARAMETER :: ints = [1,2,3,4,5,6,7,8,9,10, &
11,12,13,14,15,16,17,18,19,20]
INTEGER, PARAMETER :: m=10, n=3
INTEGER, PARAMETER :: sz = PRODUCT(ints(1:m))/PRODUCT(ints(1:m-n))/&
PRODUCT(ints(1:n))
COMPLEX, DIMENSION(sz) :: hamiltonian
这正确地编译和执行。如果你将自己限制在64位整数,则数组ints
不需要大于20。
哦,顺便说一句,不要使用size
作为参数的名称,它已经是一个有用的内在函数的名称。
然后,你可以自己计算阶乘并写:
INTEGER, DIMENSION(20), PARAMETER :: factorial = [1,2,6,24,...]
INTEGER, PARAMETER :: m=10, n=3
INTEGER, PARAMETER :: sz = factorial(m)/factorial(m-n)/factorial(n)
COMPLEX, DIMENSION(sz) :: hamiltonian
并完成它。
以上是关于由非内在函数给出的常量值的主要内容,如果未能解决你的问题,请参考以下文章
intel fortran 编译错误“此内在函数在常量表达式中无效”
使用 vshr_n_u32 时,NEON 内在,编译错误“参数必须是常量”