在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
或者我是否必须自己计算这个值并在代码中明确写出来?
答案 0 :(得分:3)
正如您所知,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
并完成它。