ALLOCATABLE属性
copyright

green dotALLOCATABLE属性

ALLOCATABLE属性は、宣言された変数が割付け配列であることを指定する。
1つの配列に、ALLOCATABLE属性とPOINTER属性は、 両方を指定することはできない。
また、ALLOCATABLE属性は、仮引数や関数結果に指定できない。
[例]
配列aは、宣言時には配列の大きさが決まっていない。
大きさをREAD文で読み込み、ALLOCATE文で記憶割付けを行う。
    INTEGER,DIMENSION(:),ALLOCATABLE ::a
    READ(*,*) n
    ALLOCATE(a(n))

green dot割付け配列

配列の大きさを実行時に(動的に)決めるのがALLOCATE文で、配列が 不要になった場合に解放するのがDEALLOCATE文である。
このように動的に大きさを決める配列は、ALLOCATABLE属性を 使って宣言する必要がある。

  型指定子,DIMENSION(:),ALLOCATABLE :: 配列名,…
  ALLOCATE(配列名(配列の大きさ),…)
  DEALLOCATE(配列名,…)  

[例]
mとnの値を入力し、a(m,n)の整数型配列aを割付け、 使用後に配列aを解放する。

    INTEGER,DIMENSION(:,:),ALLOCATABLE :: a
    INTEGER :: m,n
    READ(*,*) m,n
    ALLOCATE(a(m,n))
        :
    DEALLOCATE(a)

green dotポインタ指示先の割付け

ポインタに対するALLOCATE文の実行を行うとポインタは指示先と結合し、 その指示先の引用および確定に使用できるようになる。ポインタの 割付けは、TARGET属性を暗黙的にもつ実体と結合する。このポインタ指示先 または、その一部にポインタ代入文によって別のポインタを結合してもよい。
この場合、ポインタの属性およびALLOCATE文に指定した配列 上下限によって要求されるポインタ指示先が新たに生成される。

  ALLOCATE(ポインタ,…)

[例]
以下の ALLOCATE文は次の(1)(2)を行う。

   (1) list構造をもつ領域を確保する。
   (2) rootは確保された領域の先頭のアドレスを指す。


 
    TYPE list
       INTEGER :: num
       TYPE(list),POINTER :: next
    END TYPE list
    TYPE(list),POINTER :: root,prt
    ALLOCATE(root)

green dot配列の別名の定義(窓の定義)

POINTER属性とTARGET属性を組み合わせることによって、配列の部分 列を別名として定義することができる。
別名として定義する変数はPOINTER属性を指定し、参照される変数は TARGET属性を指定する。別名は添字の 上下限を与えて定義し、 上下限の値を変えて再定義することができる。
2次元の配列の一部を別名として定義することもできる。

[例1]
10個の配列arrayの部分列を配列windowとして定義する。

    PROGRAM sample1
       INTEGER,DIMENSION(10),TARGET :: array
       INTEGER,DIMENSION(:),POINTER :: window
       INTEGER :: n,m
       array=(/1,2,3,4,5,6,7,8,9,10/)
       n=2; m=5
       window=>array(n:m)     !窓の作成
       WRITE(*,*) window      !2 3 4 5が出力される
       n=3; m=9
       window=>array(n:m)     !窓の作成
       WRITE(*,*) window      !3 4 5 6 7 8 9が出力される
    END PROGRAM sample1
[例2]
配列array(5,6)の一部を配列window(2,3)とし、定義すると以下のようになる。

    PROGRAM sample2
       INTEGER,DIMENSION(5,6),TARGET  :: array
       INTEGER,DIMENSION(:,:),POINTER :: window
       INTEGER :: i,j
       DO i=1,5
          DO j=1,6
             array(i,j)=i*10+j
          END DO
       END DO
       window=>array(2:3,2:4)     !窓の作成
       DO i=1,2
          WRITE(*,*) window(i,:)  ! 22 23 24
       END DO                     ! 32 33 34 の出力
    END PROGRAM sample2
line-end