Fortran Coder

标题: 求助!!子函数变量是数组时,如何声明数组的大小?? [打印本页]

作者: zxbballack    时间: 2019-11-11 22:38
标题: 求助!!子函数变量是数组时,如何声明数组的大小??
      COMPLEX FUNCTION FILON(CFUN,CEX,ARG,N,FAC)
      COMPLEX AI,CSUM,CFUN(1),CEX(1),DFUN,DEX,DARG,DPROD
      DIMENSION ARG(1)
      AI=CMPLX(0.,1E0)
      CSUM=0E0
      DO 10 I=1,N-1
      DARG=-AI/(ARG(I+1)-ARG(I))
      DFUN=CFUN(I+1)-CFUN(I)
      DEX=CEX(I+1)-CEX(I)
      DPROD=CFUN(I+1)*CEX(I+1)-CFUN(I)*CEX(I)
      CSUM=CSUM+DARG*(DPROD-DARG*DFUN*DEX)
  10  CONTINUE
      FILON=FAC*CSUM
      RETURN
      END

请问上述子函数中,变量CFUN,CEX以及ARG的数组大小为N,为什么声明的时候用CFUN(1),CEX(1)和ARG(1)呢?


作者: necrohan    时间: 2019-11-12 10:06
这应该是一种不严禁而且过时的用法。
我感觉可以这么理解,传递给函数的变量是数组时,实际传递进来的是数组的地址,比如DIMENSION ARG(1)就是为了告诉函数ARG是个数组,使用时按地址考虑。
实际使用时ARG(1)表示第一个元素的地址,ARG(2)表示第二个,以此类推。
声明的类型不一样,地址增加的字节不一样,因此变量声明不能少。
用这种方法必须对数组元素的个数非常清楚,否则容易出现数组越界。
这个函数传递进参数N是为了控制数组访问的地址,防止越界的。
作者: fcode    时间: 2019-11-12 11:11
是的,这种传递数组的方式非常古老,并且早就淘汰了。

你可以看本站的文章:http://passarray.w.fcode.cn/
作者: zxbballack    时间: 2019-11-12 11:16
necrohan 发表于 2019-11-12 10:06
这应该是一种不严禁而且过时的用法。
我感觉可以这么理解,传递给函数的变量是数组时,实际传递进来的是数 ...

非常感谢您的回答,这个问题困扰了我好久
作者: zxbballack    时间: 2019-11-12 11:17
fcode 发表于 2019-11-12 11:11
是的,这种传递数组的方式非常古老,并且早就淘汰了。

你可以看本站的文章:http://passarray.w.fcode.cn/ ...

这里真是学fortran的天堂啊,困扰了我一天的问题,瞬间解决了!万分感谢
作者: zxbballack    时间: 2019-11-13 10:00
necrohan 发表于 2019-11-12 10:06
这应该是一种不严禁而且过时的用法。
我感觉可以这么理解,传递给函数的变量是数组时,实际传递进来的是数 ...

请问声明的时候用CFUN(N),CEX(N)和ARG(N)是不是正确呢?
作者: vvt    时间: 2019-11-13 10:37
zxbballack 发表于 2019-11-13 10:00
请问声明的时候用CFUN(N),CEX(N)和ARG(N)是不是正确呢?

这种叫“自动”数组,是可以的。




欢迎光临 Fortran Coder (http://bbs.fcode.cn/) Powered by Discuz! X3.2