Fortran Coder

查看: 99|回复: 7

[求助] 新人求助 FORTRAN77 变量(变量,变量)是什么意思

[复制链接]

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
21 点
发表于 2019-6-21 17:31:32 | 显示全部楼层 |阅读模式
本人刚开始学习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只截选了一部份)

回复

使用道具 举报

55

帖子

12

主题

1

精华

专家

F 币
529 元
贡献
325 点
发表于 2019-6-21 18:51:52 | 显示全部楼层
GASL是累加器,W是应该是权重,X是函数实参

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
21 点
 楼主| 发表于 2019-6-22 16:57:42 | 显示全部楼层
weixing1531 发表于 2019-6-21 18:51
GASL是累加器,W是应该是权重,X是函数实参

所以像FUNC(X(I),A,B,C) 这种是什么意思呢?我还是没太明白

691

帖子

0

主题

0

精华

大师

F 币
665 元
贡献
372 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2019-6-23 09:31:49 | 显示全部楼层
FlagArchitect 发表于 2019-6-22 16:57
所以像FUNC(X(I),A,B,C) 这种是什么意思呢?我还是没太明白

调用 FUNC 函数,这个函数需要4个参数
第一个是 X(I)
第二个是 A
第三个是 B
第四个是 C

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
21 点
 楼主| 发表于 2019-6-23 19:06:56 | 显示全部楼层
本帖最后由 FlagArchitect 于 2019-6-23 19:08 编辑
vvt 发表于 2019-6-23 09:31
调用 FUNC 函数,这个函数需要4个参数
第一个是 X(I)
第二个是 A

请问FUNC是内置函数吗?我把整段代码查找了一遍,除了这两个subroutine里面以外就再也没见过FUNC了,所以我一开始一直以为FUNC是个变量。如果不是内置函数的话又怎么能做到没有定义就能直接调用,而且能够成功编译的呢?

691

帖子

0

主题

0

精华

大师

F 币
665 元
贡献
372 点

规矩勋章元老勋章新人勋章水王勋章

QQ
发表于 2019-6-23 21:51:04 | 显示全部楼层
是外部传入的呀,在虚参里。

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

55

帖子

12

主题

1

精华

专家

F 币
529 元
贡献
325 点
发表于 2019-6-24 11:09:32 来自移动端 | 显示全部楼层
FUNC是不是静态链接库LIB函数?

6

帖子

2

主题

0

精华

入门

F 币
39 元
贡献
21 点
 楼主| 发表于 2019-6-24 23:44:01 | 显示全部楼层
vvt 发表于 2019-6-23 21:51
是外部传入的呀,在虚参里。

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

啊啊,原来如此,明白了,感谢!
您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

QQ|捐赠本站|Archiver|关于我们 About Us|群聊|Fcode

GMT+8, 2019-7-17 06:53

Powered by Discuz! X3.2

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表