由非内在函数给出的常量值

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 内在,编译错误“参数必须是常量”

使用 sse 和 avx 内在函数将一组打包的单曲添加到一个值中

firestore 收集路径给出带有常量值和字符串值的错误

SSE 内在函数优化

java关键字