数组性质规范等级和形状

对象上的 dimension 属性指定该对象是一个数组。在 Fortran 2008 中,有五个数组性质: 1

  • 明确的形状
  • 假设的形状
  • 假定大小
  • 延迟的形状
  • 隐含的形状

取三个 1 级阵列 2

integer a, b, c
dimension(5) a    ! Explicit shape (default lower bound 1), extent 5
dimension(:) b    ! Assumed or deferred shape
dimension(*) c    ! Assumed size or implied shape array

通过这些可以看出,需要进一步的上下文来完全确定阵列的性质。

明确的形状

显式形状数组始终是其声明的形状。除非将数组声明为子程序或 block 构造的局部,否则定义形状的边界必须是常量表达式。在其他情况下,显式形状数组可以是自动对象,使用范围可以在子程序或 block 的每次调用时变化。

subroutine sub(n)
  integer, intent(in) :: n
  integer a(5)   ! A local explicit shape array with constant bound
  integer b(n)   ! A local explicit shape array, automatic object
end subroutine

假设形状

假定的形状数组是没有 allocatablepointer 属性的伪参数。这样的数组从与之关联的实际参数中获取其形状。

integer a(5), b(10)
call sub(a)   ! In this call the dummy argument is like x(5)
call sub(b)   ! In this call the dummy argument is like x(10)

contains

  subroutine sub(x)
    integer x(:)    ! Assumed shape dummy argument
  end subroutine sub

end

当伪参数假定为形状时,引用该过程的作用域必须具有可用于该过程的显式接口。

假设大小

假定的大小数组是一个伪参数,其大小由其实际参数假定。

subroutine sub(x)
  integer x(*)   ! Assumed size array
end subroutine

假定的大小数组与假定的形状数组的行为非常不同,这些差异在别处记录。

延迟形状

延迟形状数组是具有 allocatablepointer 属性的数组。这种数组的形状由其分配或指针赋值决定。

integer, allocatable::a(:)
integer, pointer::b(:)

隐含的形状

隐含形状数组是一个命名常量,它从用于建立其值的表达式中获取其形状

integer, parameter::a(*) = [1,2,3,4]

这些数组声明对伪参数的含义将在别处记录。

1 扩展 Fortran 2008 的技术规范增加了第六种阵列性质:假设等级。这里没有涉及。

2 这些可以等同地写成

integer, dimension(5) :: a
integer, dimension(:) :: b
integer, dimension(*) :: c

要么

integer a(5)
integer b(:)
integer c(*)