Windows用コンパイラ MAC用コンパイラ Linux/Unix用コンパイラ
 
ナビゲーション:前へ   上へ   次へ

10.4 データ実体の使用と計算 [大部分 5.3]

  • 構造体構築子内で、割付可能な成分の値は省略することができます。 省略するとNULL()を指定した事と同じ意味となります。
  • [6.0] ALLOCATE文で配列を割付ける際、SOURCE=もしくはMOLD=が指定されている場合で且つその式が配列の場合には式より形状を得る事ができます。 特に多次元配列においてはSIZEもしくはUBOUNDを用いるよりも簡潔に指定が可能です。

    例)

       SUBROUTINE s(x,mask)
          REAL x(:,:,:)
          LOGICAL mask(:,:,:)
          REAL,ALLOCATABLE :: y(:,:,:)
          ALLOCATE(y,MOLD=x)
          WHERE (mask)
            y = 1/x
          ELSEWHERE
            y = HUGE(x)
          END WHERE
          ! ...
       END SUBROUTINE
    
  • [6.2] SOURCE=句を伴うALLOCATE文は複数回の割付けが許されています。 source-exprは、この文で割付けられる全ての変数に代入されます。 例)
       PROGRAM multi_alloc
          INTEGER,ALLOCATABLE :: x(:),y(:,:)
          ALLOCATE(x(3),y(2,4),SOURCE=42)
          PRINT *,x,y
       END PROGRAM
    
    は値“42”を11回出力します。 (xの3個の成分及びyの8個の成分) source-exprが配列の場合、全ての割付けは同じ形状でなければなりません。
  • [6.1] COMPLEX実体の実数部と虚数部は特定子squote{%RE}及び‘%IM’でそれぞれ参照できます。 例えば
       COMPLEX,PARAMETER :: c = (1,2), ca(2) = [ (3,4),(5,6) ]
    
    code{c%re}とc%imはそれぞれ1と2の値を持ちます。 ca%reca%imはそれぞれ配列で[ 3,5 ][ 4,6 ]です。 変数の場合は実数部と複素数部に直接代入する事ができます。 例えば
       COMPLEX :: v, va(10)
    
    という変数で
       va%im = 0
    
    とするとvaのすべての成分の虚数部がゼロになります。(実数部は影響を受けない)
  • 一つ以上の変数のALLOCATE文でMOLD=句を用いて変数に式の型パラメタ(及びオプショナルで形状)及び動的型とを与えることが可能です。 MOLD=の式はそれぞれの割付け実体と型互換でなければなりません。式が変数の場合(例えばMOLD=X)変数が定義されている必要はありません。 MOLD=句は割付けられる変数の型、型パラメタ及び形状が変更可能でない場合も使用可能です。 例えば
       CLASS(*),POINTER :: a,b,c
       ALLOCATE(a,b,c,MOLD=125)
    
    は無限多相ポインタABCの型が(基本)整数型になるように割付けます。 SOURCE=とは異なり、ABCの値は未定義となります。
  • [5.3.1] 多相割付変数への代入が許されています。 変数が異なる動的な型もしくは型パラメータである場合、配列である場合、異なる形状である場合には、まず最初に解放されます。 割付されていない場合(もしくは上記で解放された場合)正しい型と形状で割付され、式の値が代入されます。 この機能の動作はALLOCATE(variable,SOURCE=expr)の動作に似ています。 例えば、
       CLASS(*),ALLOCATABLE :: x
    
    の場合代入文の実行は以下のようになります。
       x = 43
    
    その結果XXが解放済みであるか、あるいは他の型もしくは種別で割付け済みであるかに係らず (基整種別の)動的型整数となり、43の値を持ちます。
  • [6.1] 次元数再割当てポインタ代入は指示先の次元数が2以上で“単純連続”(コンパイル時に容易に判別可能な連続)の場合に許可されます。 例えば以下のポインタ代入では
       REAL,TARGET :: x(100,100)
       REAL,POINTER :: x1(:)
       x1(1:Size(x)) => x
    
    X1X全体の1次元別名にします。



Privacy Policy | Trademarks