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数组是连续的)。谢谢!我想我对这个话题有点清楚。我正在写一个小例子来验证我的理解。我假设同样的原理也适用于“一维数组”。我说的对吗?当然,对他们来说更简单。