陣列性質規範等級和形狀

物件上的 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(*)