Fortran Coder

标题: 新人求助 FORTRAN77 变量(变量,变量)是什么意思 [打印本页]

作者: FlagArchitect    时间: 2019-6-21 17:31
标题: 新人求助 FORTRAN77 变量(变量,变量)是什么意思
本人刚开始学习Fortran,对于语法也是一知半解。由于研究需要阅读大量FORTRAN77的代码。
[Fortran] 纯文本查看 复制代码
     SUBROUTINE GLM20D(FUNC,A,B,C,GASL)                                00009580
      DOUBLE PRECISION FUNC,GASL,X(20),W(20),A,B,C                      00009590
      DATA X/  7.05398896919887533667D-02 , 3.72126818001611443794D-01 ,00009600
     *         9.16582102483273564668D-01 , 1.70730653102834388069D 00 ,00009610
     *         2.74919925530943212965D 00 , 4.04892531385088692237D 00 ,00009620
     *         5.61517497086161651410D 00 , 7.45901745367106330977D 00 ,00009630
     *         9.59439286958109677247D 00 , 1.20388025469643163096D 01 ,00009640
     *         1.48142934426307399785D 01 , 1.79488955205193760174D 01 ,00009650
     *         2.14787882402850109757D 01 , 2.54517027931869055035D 01 ,00009660
     *         2.99325546317006120067D 01 , 3.50134342404790000063D 01 ,00009670
     *         4.08330570567285710620D 01 , 4.76199940473465021399D 01 ,00009680
     *         5.58107957500638988908D 01 , 6.65244165256157538186D 01 /00009690
      DATA W/  1.68746801851113862149D-01 , 2.91254362006068281717D-01 ,00009700
     *         2.66686102867001288550D-01 , 1.66002453269506840031D-01 ,00009710
     *         7.48260646687923705401D-02 , 2.49644173092832210728D-02 ,00009720
     *         6.20255084457223684745D-03 , 1.14496238647690824204D-03 ,00009730
     *         1.55741773027811974780D-04 , 1.54014408652249156894D-05 ,00009740
     *         1.08648636651798235148D-06 , 5.33012090955671475093D-08 ,00009750
     *         1.75798117905058200358D-09 , 3.72550240251232087263D-11 ,00009760
     *         4.76752925157819052449D-13 , 3.37284424336243841237D-15 ,00009770
     *         1.15501433950039883096D-17 , 1.53952214058234355346D-20 ,00009780
     *         5.28644272556915782880D-24 , 1.65645661249902329591D-28 /00009790
      GASL=0.0D 00                                                      00009800
      DO 20 I=1,20                                                      00009810
   20 GASL=GASL+W(I)*FUNC(X(I),A,B,C)                                   00009820
      RETURN                                                            00009830
      END                                                               00009840

[Fortran] 纯文本查看 复制代码
SUBROUTINE DNOLBR(X,N,FUNC,EPS,M,Q,F,Y,W1,W2,ICON)                00013120
      IMPLICIT DOUBLE PRECISION (A-H,O-Z)                               00013130
      DIMENSION X(N),F(N),Y(N),W1(N),W2(N),Q(N,N)                       00013140
      ICON=0                                                            00013150
      MMAX=M                                                            00013160
      M=0                                                               00013170
      IC2=0                                                             00013180
      EPS=EPS**2                                                        00013190
      DO 10 I=1,N                                                       00013200
   10 F(I)=FUNC(X,I)                                                    00013210
      FNORM=0D0                                                         00013220
      DO 11 I=1,N                                                       00013230
   11 FNORM=FNORM+F(I)**2                                               00013240
      IF (FNORM.LT.EPS) RETURN                                          00013250
   34 M=M+1                                                             00013260
      DO 15 I=1,N                                                       00013270
   15 Y(I)=X(I)                                                         00013280
      DO 50 I=1,N                                                       00013290
      DO 50 J=1,N                                                       00013300
      Q(I,J)=0D0                                                        00013310
      IF (I.EQ.J) Q(I,J)=Q(I,J)+1                                       00013320
   50 CONTINUE                                                          00013330

请问这两个subroutine中的FUNC括号里面加变量是什么意思啊?例如:"GASL=GASL+W(I)*FUNC(X(I),A,B,C) "和"W2(I)=FUNC(W1,I)"。
求各位大神解答。(由于长度限制第二段subroutine只截选了一部份)


作者: weixing1531    时间: 2019-6-21 18:51
GASL是累加器,W是应该是权重,X是函数实参
作者: FlagArchitect    时间: 2019-6-22 16:57
weixing1531 发表于 2019-6-21 18:51
GASL是累加器,W是应该是权重,X是函数实参

所以像FUNC(X(I),A,B,C) 这种是什么意思呢?我还是没太明白
作者: vvt    时间: 2019-6-23 09:31
FlagArchitect 发表于 2019-6-22 16:57
所以像FUNC(X(I),A,B,C) 这种是什么意思呢?我还是没太明白

调用 FUNC 函数,这个函数需要4个参数
第一个是 X(I)
第二个是 A
第三个是 B
第四个是 C
作者: FlagArchitect    时间: 2019-6-23 19:06
本帖最后由 FlagArchitect 于 2019-6-23 19:08 编辑
vvt 发表于 2019-6-23 09:31
调用 FUNC 函数,这个函数需要4个参数
第一个是 X(I)
第二个是 A

请问FUNC是内置函数吗?我把整段代码查找了一遍,除了这两个subroutine里面以外就再也没见过FUNC了,所以我一开始一直以为FUNC是个变量。如果不是内置函数的话又怎么能做到没有定义就能直接调用,而且能够成功编译的呢?
作者: vvt    时间: 2019-6-23 21:51
是外部传入的呀,在虚参里。

这是“函数(子程序)作为虚参”的用法。
作者: weixing1531    时间: 2019-6-24 11:09
FUNC是不是静态链接库LIB函数?
作者: FlagArchitect    时间: 2019-6-24 23:44
vvt 发表于 2019-6-23 21:51
是外部传入的呀,在虚参里。

这是“函数(子程序)作为虚参”的用法。

啊啊,原来如此,明白了,感谢!




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