Arrays 以数组元素作为参数的子例程

Arrays 以数组元素作为参数的子例程,arrays,fortran,fortran90,subroutine,Arrays,Fortran,Fortran90,Subroutine,在我的程序中,子程序stlstp将work(2,1)作为参数传递给stlfts(…)子程序work(2,1)将是该索引的两倍值,但如何将其转换为一维数组x(n) 当我在stlfts(…)子例程中打印x值时,它正在打印n大小的元素,例如: STLFTS....X,,, 0.0000000000000000 1.4964418382246345E-317 1.48978578 58438612E-317 1.4964339331743010E-317 1.496441

在我的程序中,子程序
stlstp
work(2,1)
作为参数传递给
stlfts(…)
子程序
work(2,1)
将是该索引的两倍值,但如何将其转换为一维数组
x(n)

当我在
stlfts(…)
子例程中打印
x
值时,它正在打印
n
大小的元素,例如:

 STLFTS....X,,,   0.0000000000000000        1.4964418382246345E-317   1.48978578
58438612E-317   1.4964339331743010E-317   1.4964418382246345E-317   4.3367611401 ....
我的理解是,除了第一个值,这个
x
中的所有其他值都是垃圾,但不确定这个赋值将如何影响原始引用?有人能帮我吗

subroutine stlstp(y,n,np,ns,nt,nl,isdeg,itdeg,ildeg,nsjump,ntjump,nljump,ni,userw,rw,season,trend,work)

!     implicit none
! Arg
      integer n,np,ns,nt,nl,isdeg,itdeg,ildeg,nsjump,ntjump,nljump,ni
      logical userw
      double precision y(n),rw(n),season(n),trend(n),work(20,5)
! Var
      integer i,j

     do 80 j = 1,1
         do 1 i = 1,n
              work(i,1) = y(i)-trend(i)
 1       continue
         call stlss(y,n,np,ns,isdeg,nsjump,userw,rw,season)

         PRINT *, 'WORK 1,2 ....',work(1,2)
         PRINT *, 'WORK ....',work
         call stlfts(work(1,2),n+2*np,np,work(1,3),work(1,1))
现在
stlfts
子程序代码是:

  subroutine stlfts(x,n,np,trend,work)
    integer n, np
    double precision x(n), trend(n), work(n)
    PRINT *, 'STLFTS....X,,,',x 
    call stlma(x,    n,      np, trend)
  end

感谢IanH对标准的指导(Fortran 2008 12.5.2.11(1)),关于标准一致性的声明中的答案是错误的:

如果是数组,则实际参数表示元素序列 表达式,数组元素指示符,,默认字符标量, 或C字符类型的标量字符(15.2.2)。如果 实际参数是一个数组表达式,即元素序列 按数组元素顺序由元素组成如果实际 参数是数组元素指示符,元素序列由 数组中该数组元素及其后面的每个元素的 元素顺序。

这意味着这种做法符合标准,这是一种合法的方法,可以从某个元素开始传递数组的一部分

这种情况可以向C程序员解释为子例程
stlstp
传递原始数组中实际点的地址


子例程
stlfts
然后将地址解释为原始长度数组
n
的一部分的地址。它将是列主顺序中的第一个
n
元素,从元素
(1,2)
开始。通过这种方式,它可以访问原始数组的其他元素
WORK
,并且结果不会是垃圾。

谢谢!是的,这是一段非常古老的代码,我正在尝试对其进行反向工程。你能给我举一些互联网上的例子来了解更多关于“它将是列中的前n个元素,主要顺序从元素(1,2)开始”的信息吗?一个实际的例子将帮助我快速理解这个概念。否则,只需将其理解为在C中传递
&work[2][1]
并期望
double x[n]
double*x
(前提是
work
与旧Fortran数组是连续的)。谢谢!我想我对这个话题有点清楚。我正在写一个小例子来验证我的理解。我假设同样的原理也适用于“一维数组”。我说的对吗?当然,对他们来说更简单。