割り当てステートメントは、式の計算結果に基づいて、変数を定義または再定義する実行可能ステートメントです。
定義済みの割り当ては、組み込みではなく、サブルーチンおよびインターフェース・ブロックによって定義されます。 定義済み割り当てを参照してください。
組み込み割り当ての一般的な形式は、次のとおりです。
>>-variable-- = --expression----------------------------------->< |
variable と expression の形状は、整合性がとれていなければなりません。
expression が配列であれば、variable も配列でなければなりません (配列にかかわる式を参照してください)。 expression がスカラーで variable が配列の場合、その expression は、すべての配列エレメントが expression のスカラー値と同じ値を持つ variable と同じ形状の配列として扱われます。 variable は「多対 1」配列セクションにしてはなりません (詳細は ベクトル添え字を参照してください)。また、variable も expression も、想定サイズ配列にはできません。
variable と expression のタイプは、次に示すように整合性がとれていなければなりません。
variable のタイプ | expression のタイプ |
---|---|
数値 | 数値 |
論理 | 論理 |
文字 | 文字 |
派生型 | 派生型 (variable と同様) |
数値割り当てステートメントでは、variable および expression で、異なる数値タイプと異なる kind 型付きパラメーターを指定できます。論理割り当てステートメントの場合、kind 型付きパラメーターは異なってもかまいません。文字割り当てステートメントの場合、length 型付きパラメーターは異なってもかまいません。
文字変数が文字式よりも長い場合、その文字式は、文字変数と長さが等しくなるまで、ブランクによって右側方向に拡張されます。文字変数が文字式より短い場合、その文字式は、文字変数と長さが文字変数の長さに位置するように、文字式の右側が切り捨てられます。
variable がポインターである場合、その variable は、expression と整合性がとれたタイプ、型付きパラメーター、および形状を持つ定義可能なターゲットに関連させなければなりません。そこで、expression の値は、variable に関連したターゲットに割り当てられます。
variable および expression の両方に、variable のどの部分に対する参照も含めることができます。
割り当てステートメントによって、expression および割り当て前の variable 内のすべての式の計算、必要に応じて variable のタイプや型付きパラメーターに対する expression の変換、および結果値による variable の定義が行われます。長さがゼロの文字オブジェクトまたはサイズがゼロの配列の場合、variable に対して値は割り当てられません。
派生型のオブジェクトに対してアクセス可能な定義済み割り当てがない場合、その派生型割り当てステートメントは、組み込み割り当てステートメントになります。派生型の式は、変数と同じ派生型でなければなりません。 (2 つの構造体が同じ派生型の構造体であるかどうかを判別する規則については、派生型のタイプの決め方を参照してください。) 式の各コンポーネントが対応する変数のコンポーネントに割り当てられているかのように、割り当て (またはポインターの割り当て) が行われます。ポインターの割り当ては、ポインターのコンポーネントに対して実行され、組み込み割り当ては、ポインター以外の 割り当て可能でないコンポーネントに対して実行されます。割り当て可能なコンポーネントの場合は、以下の操作の順序が適用されます。
それから、expression のコンポーネントの値が、組み込み割り当てを使用して、対応する variable のコンポーネントに割り当てられます。
variable がサブオブジェクトである場合、割り当ては、定義状況やオブジェクトの他の部分の値に影響しません。
数値組み込み割り当ての場合、expression の値は、以下の表に指定したように、variable のタイプおよび kind 型付きパラメーターに変換されることがあります。
variable のタイプ | 割り当てられる値 |
---|---|
整数 | INT(expression,KIND=KIND(variable)) |
実数 | REAL(expression,KIND=KIND(variable)) |
複素数 | CMPLX(expression,KIND=KIND(variable)) |
+----------------------------------IBM 拡張----------------------------------+
+--------------------------------IBM 拡張の終り-------------------------------+
文字変数を定義するのに必要となる数の文字式だけが計算されます。たとえば、次のようになります。
CHARACTER SCOTT*4, DICK*8 SCOTT = DICK
SCOTT に DICK を割り当てるには、事前にサブストリング DICK(1:4) を定義しておく必要のみあります。 DICK (DICK(5:8)) の残りの部分を事前に定義しておく必要はありません。
+----------------------------------IBM 拡張----------------------------------+
expression が算術式である場合は、算術割り当てを使用します。同様に、expression が文字タイプである場合は文字割り当てを使用し、expression が論理タイプである場合は論理割り当てを使用します。式の右辺が BYTE タイプの場合は、算術割り当てを使用します。
+--------------------------------IBM 拡張の終り-------------------------------+
INTEGER I(10) LOGICAL INSIDE REAL R,RMIN,RMAX REAL :: A=2.3,B=4.5,C=6.7 TYPE PERSON INTEGER(4) P_AGE CHARACTER(20) P_NAME END TYPE TYPE (PERSON) EMP1, EMP2 CHARACTER(10) :: CH = 'ABCDEFGHIJ' I = 5 ! All elements of I assigned value of 5 RMIN = 28.5 ; RMAX = 29.5 R = (-B + SQRT(B**2 - 4.0*A*C))/(2.0*A) INSIDE = (R .GE. RMIN) .AND. (R .LE. RMAX) CH(2:4) = CH(3:5) ! CH is now 'ACDEEFGHIJ' EMP1 = PERSON(45, 'Frank Jones') EMP2 = EMP1 ! EMP2%P_AGE is assigned EMP1%P_AGE using arithmetic assignment ! EMP2%P_NAME is assigned EMP1%P_NAME using character assignment END