使用数组元素作为参数的子例程

时间:2014-07-28 16:58:42

标签: arrays fortran fortran90 subroutine

在我的程序子例程stlstp中将work(2,1)作为参数传递给stlfts(...)子例程。 work(2,1)在该索引处将是double值,但子例程如何将其转换为单维数组x(n)

当我在x子例程中打印stlfts(...)值时,它会打印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

1 个答案:

答案 0 :(得分:3)

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

  

实际参数表示元素序列(如果它是数组)   表达式,一个数组元素指示符,一个默认的字符标量,   或带有C字符种类的字符标量(15.2.2)。如果   实际参数是一个数组表达式,即元素序列   由数组元素顺序中的元素组成。 如果实际   argument是一个数组元素指示符,元素序列由   该数组元素以及在数组中跟随它的每个元素   元素顺序。

这意味着这个实践符合标准,这是一种从一些元素开始传递数组的一部分的合法方法。

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

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