Fortran Coder

查看: 1922|回复: 1

[子程序] 函数参数PV(NCM,*)问题

[复制链接]

13

帖子

6

主题

0

精华

入门

F 币
59 元
贡献
22 点
发表于 2023-3-19 10:34:13 | 显示全部楼层 |阅读模式
本帖最后由 kyra 于 2023-3-23 08:18 编辑

SUBROUTINE INTERP(BUF,T,NCF,NCM,NA,IFL,PV)
1, DOUBLE PRECISION BUF(NCF,NCM,*),PV(NCM,*)
这样的函数参数如果是数组,是需要在内部定义一下大小吗
如果是double 或者int这类就不需要
可以这样理解吗
2,INTERP(BUF(IPT(1,11)),T,IPT(2,11),3,IPT(3,11),2,PVSUN)
函数调用时是这样
BUF(IPT(1,11)) 这是什么意思呢
IPT(3,11),IPT(2,11)表示的意思是数组中【3,11】,【2,11】位置的数据嘛
救助大佬解答一下


259

帖子

0

主题

0

精华

版主

World Analyser

F 币
717 元
贡献
510 点

新人勋章美女勋章元老勋章热心勋章规矩勋章管理勋章

QQ
发表于 2023-3-19 17:54:02 | 显示全部楼层
本帖最后由 kyra 于 2023-3-19 17:57 编辑

1. 需要在函数里定义一下,给出第一第二维的大小,第三个维度可以不给出。DOUBLE PRECISION BUF(NCF,NCM,*),PV(NCM,*) 这句代码就是在做这个事情。
这种传递数组的方式叫“假定大小”,其最后一个维度的大小假定,说白了就是放任不管,数组越界了也不管。
这是非常危险的,不推荐采用这种方式。

和数据的类型(double或者int)无关,无论什么类型,都是同样的规律。

2. 是的。
但由于Fortran传递的是地址,所以尽管从IPT(1,11)开始传递,其后的数据,也可以被子程序interp访问到。
这种也是很危险的用法,现代Fortran代码是不会这样的。

现代代码,一般都用 Module + 假定形状传递数组。也就是类似 DOUBLE PRECISION BUF(:,:,:),PV(NCM,:) 这样的写法。
详情你可以看 http://fcode.cn/guide-103-1.html

您需要登录后才可以回帖 登录 | 极速注册

本版积分规则

捐赠本站|Archiver|关于我们 About Us|小黑屋|Fcode ( 京ICP备18005632-2号 )

GMT+8, 2024-10-11 11:25

Powered by Tencent X3.4

© 2013-2024 Tencent

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