数组性质规范等级和形状
对象上的 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
假设形状
假定的形状数组是没有 allocatable
或 pointer
属性的伪参数。这样的数组从与之关联的实际参数中获取其形状。
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
假定的大小数组与假定的形状数组的行为非常不同,这些差异在别处记录。
延迟形状
延迟形状数组是具有 allocatable
或 pointer
属性的数组。这种数组的形状由其分配或指针赋值决定。
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(*)