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

Dil*_*rix 21 arrays fortran fortran90

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

例如

real, dimension(:) :: arr
Run Code Online (Sandbox Code Playgroud)

real               :: arr(*)
Run Code Online (Sandbox Code Playgroud)

Hig*_*ark 44

表格

real, dimension(:) :: arr
Run Code Online (Sandbox Code Playgroud)

在表单中声明一个假定形状的数组

real :: arr(*)
Run Code Online (Sandbox Code Playgroud)

声明一个假定大小的数组.

并且,是的,他们的使用之间存在差异.差异的产生是因为,大约编译器"知道"假定形状数组的形状而不是假设大小数组的形状.编译器可用的额外信息意味着,假设形状数组可以在整个数组表达式中使用.假定大小的数组只能在整个数组表达式中使用,因为它是过程引用中不需要数组形状的实际参数.哦,也是对内lbound在的呼唤 - 但不是对内在的呼唤ubound.还有其他微妙的,不那么微妙的差异,你仔细阅读标准或好的Fortran书将会揭示.

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

  • 应该注意的是,现代假设的形状`(:)`形式需要一个明确的界面.如果您正在使用外部子例程处理旧代码,则必须使用`*`或提供接口. (6认同)

fra*_*lus 14

高绩效马克的答案解释了两个陈述之间的区别 - 简而言之:是的,有区别; 只有一个声明一个假定大小的数组 - 以及含义.

但是,正如dimension(:)提到的那样,看似不反对dimension(*),我会添加一件事.

real, dimension(:) :: arr1
real, dimension(*) :: arr2
Run Code Online (Sandbox Code Playgroud)

相当于

real :: arr1(:)
real :: arr2(*)
Run Code Online (Sandbox Code Playgroud)

甚至使用dimension陈述.[我不想鼓励这样做,所以我不会写出这个例子.]

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

也许假设大小伪参数有一些混淆?这是一个虚拟的论据,这种选择最常见.