假定大小的数组:冒号与星号 - DIMENSION(:) arr 与 arr(*)

Posted

技术标签:

【中文标题】假定大小的数组:冒号与星号 - DIMENSION(:) arr 与 arr(*)【英文标题】:Assumed size arrays: Colon vs. asterisk - DIMENSION(:) arr vs. arr(*) 【发布时间】:2014-08-23 23:09:46 【问题描述】:

这两种声明假定大小数组的方法有什么区别吗?

例如

real, dimension(:) :: arr

real               :: arr(*)

【问题讨论】:

【参考方案1】:

形式

real, dimension(:) :: arr

声明一个assumed-shape数组,而表单

real :: arr(*)

声明一个 假定大小 数组。

而且,是的,它们的用途之间存在差异。之所以出现差异,是因为编译器大致“知道”假定形状数组的形状,但不知道假定大小数组的形状。编译器可用的额外信息意味着,除其他外,假定形状的数组可用于整个数组表达式。假定大小的数组只能在不需要数组形状的过程引用中的实际参数时用于整个数组表达式。哦,还有对内在 lbound 的调用——但不是在对内在 ubound 的调用中。仔细阅读标准或一本好的 Fortran 书籍,您会发现其他一些微妙且不那么微妙的差异。

对于新 Fortran 程序员的一些建议是尽可能使用假定形状的数组。它们在 Fortran 90 之前不可用,因此您会在旧代码中看到许多假定大小的数组。假定形状的数组在新代码中更好,因为shapesize 函数可用于查询它们的大小以避免越界错误和allocate 数组,其尺寸取决于输入数组的尺寸.

【讨论】:

应该注意现代假定形状(:) 形式需要显式接口。如果您正在处理带有外部子程序的旧代码,则必须使用* 或提供接口。 @agentp:为了明确编码,最好尽可能提供接口而不是*。更好的是,如果合适的话,将例程放在模块中,因为使用模块时不需要接口。【参考方案2】:

High Performance Mark's answer 解释了这两个语句之间的区别——简而言之:是的,有区别;只有一个声明了一个假定大小的数组 - 及其含义。

不过,正如dimension(:)所提到的,貌似反对不是dimension(*),我再补充一点。

real, dimension(:) :: arr1
real, dimension(*) :: arr2

等价于

real :: arr1(:)
real :: arr2(*)

甚至使用dimension 语句。 [我不想鼓励这样做,所以我不会写出例子。]

问题的重要区别在于*: 的使用,而不是dimension

也许有一些 assumed-sizedummy argument 混为一谈?在这种选择最常见的地方,它作为一个虚拟参数。

【讨论】:

以上是关于假定大小的数组:冒号与星号 - DIMENSION(:) arr 与 arr(*)的主要内容,如果未能解决你的问题,请参考以下文章

*::(星号双冒号)在Ruby中做了啥?

`:_*`(冒号下划线星号)在 Scala 中有啥作用?

与不同大小数据类型的 MPI 通信

一个星号后跟一个定义数组的类名? c++ [关闭]

使用Dimension类和Point类设置窗体大小和显示位置

排序算法 -- 选择排序(java)