在我的程序子例程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
答案 0 :(得分:3)
感谢IanH对标准的指导(Fortran 2008 12.5.2.11(1)),关于标准一致性的声明中的答案是错误的:
实际参数表示元素序列(如果它是数组) 表达式,一个数组元素指示符,一个默认的字符标量, 或带有C字符种类的字符标量(15.2.2)。如果 实际参数是一个数组表达式,即元素序列 由数组元素顺序中的元素组成。 如果实际 argument是一个数组元素指示符,元素序列由 该数组元素以及在数组中跟随它的每个元素 元素顺序。
这意味着这个实践符合标准,这是一种从一些元素开始传递数组的一部分的合法方法。
这种情况可以解释为C程序员作为子例程stlstp
传递原始数组中实际点的地址。
子程序stlfts
然后将地址解释为长度为n
的原始数组的一部分的地址。它将是从元素n
开始的列主要顺序中的第一个(1,2)
元素。这样它就可以访问原始数组WORK
的其他元素,结果不会是垃圾。