假设大小数组:冒号 vs. 星号 - DIMENSION(:) arr vs. arr(*)。

35
这两种声明可变大小数组的方法有什么区别吗?
例如:
real, dimension(:) :: arr

real               :: arr(*)
2个回答

59

表单

real, dimension(:) :: arr
声明一个假设大小数组,而形式为
real :: arr(*)
声明一个“假定大小”数组。
是的,它们的使用存在差异。这些差异源于编译器“知道”假定形状数组的形状,但不知道假定大小数组的形状。编译器可用的额外信息意味着,假定形状数组可以在整个数组表达式中使用。只有当假定大小数组作为过程引用中不需要数组形状的实际参数时,才可以将其用于整个数组表达式中。哦,在调用内置函数lbound时也可以使用假定大小数组-但不能在调用内置函数ubound时使用。标准或良好的Fortran书籍的仔细阅读将揭示其他微妙和不太微妙的差异。
对于新的Fortran程序员的一些建议是尽可能使用假定形状数组。它们在Fortran 90之前不可用,因此您会在旧代码中看到很多假定大小数组。假定形状数组在新代码中更好,因为可以使用shape和size函数查询它们的大小以避免越界错误,并且可以分配依赖于输入数组维数的数组。

7
需要注意的是,现代假定形式“(:)”需要显式接口。如果您正在处理具有外部子程序的旧代码,则必须使用“*”或提供接口。 - agentp
@agentp:为了明确编码,尽可能提供接口而不是 * 更好。更好的做法是,如果合适的话,将例程放在一个模块中,因为在使用模块时不需要接口。 - jvriesem

19

High Performance Mark的答案解释了这两个语句之间的区别 - 简而言之:是的,它们有所不同;只有一个声明了一个假设大小的数组,并带来了一些影响。

然而,由于提到了dimension(:)而不是dimension(*),我想补充一点内容。

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

等价于

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

甚至可以使用 dimension 语句。[我不想鼓励这样做,所以我不会举例说明。]

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

也许有些混淆了假设大小虚拟参数?在作为虚拟参数时,这种选择最为常见。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接