初始化参数序列和参数数组之间有区别吗?

Avr*_*ham 3 arrays fortran

如果我要使用嵌套括号计算多项式,那么单独声明每个常量并将它们声明为数组之间是否存在差异?

例如,两者之间是否存在差异

real(kind = c_double), parameter  :: &
            P0 =  .5,     &
            P1 =  .8,     &
            P2 = -.1,     &
            P3 = -.7,     &
            P4 = -.4,     &
            P5 = -.6, &
            P6 = -.2
Run Code Online (Sandbox Code Playgroud)

并计算

x = ((((((P6 * a + P5) * a + P4) * a + P3) * a + P2) * a + P1) * a + P0)
Run Code Online (Sandbox Code Playgroud)

要么

real(kind = c_double), parameter, dimension(7)  :: P = &
[.5, .8, -.1, -.7, -.4, -.6, -.2]
Run Code Online (Sandbox Code Playgroud)

并计算

x = ((((((P(7) * a + P(6)) * a + P(5)) * a + P(4)) * a + P(3)) * a + P(2)) * a + P(1))
Run Code Online (Sandbox Code Playgroud)

fra*_*lus 5

是的,存在差异,但这些差异并不是您在此处使用的重要区别.

差异来自于给出(与问题略有不同)声明的事实

real, parameter :: P1=0.1, P2=0.2, P(2)=[0.1,0.2]
Run Code Online (Sandbox Code Playgroud)

P1P2是常数,但P(1)P(2)没有. P是一个常数,但这不是一回事.所以,P1可能在某些情况下P(1)无法使用.

但是,在表达式中

((((((P6 * a + P5) * a + P4) * a + P3) * a + P2) * a + P1) * a + P0)
Run Code Online (Sandbox Code Playgroud)

恒定性质并不重要,P可以在那里轻松使用元素.

在诸如复数文字常量和(对于整数)文字常量中的种类参数的情况下会出现差异.此外,P(1)作为一个数组元素,它可以在某些方面使用,不适合P1.


我会注意到这个问题的一些特定内容:

  • 给定的P0被使用的,阵列可以从被索引0: real, parameter, dimension(0:6) :: P=[...];
  • 数组的一个优点是可以暗示元素的数量(在当前的Fortran,而不是F90中): real, parameter, dimension(0:*) :: P=[...]