>サイトトップへ >このカテゴリの一覧へ

目 次

ページ

序文

 1

1

一般的規定要素

 1

1.1

適用範囲

 1

1.2

処理系

 1

1.3

規定事項

 1

1.4

規定外事項

 1

1.5

規格合致性

 2

1.6

互換性

 3

1.6.1

Fortran 95

との互換性

 3

1.6.2

Fortran 90

との互換性

 3

1.6.3

F

ORTRAN

77

との互換性

 3

1.7

この規格での記述法

 4

1.7.1

補足要素

 4

1.7.2

構文規則

 4

1.7.3

制約

 5

1.7.4

暗黙の構文規則

 5

1.7.5

構文の約束 及び 特色

 5

1.7.6

文章記述の約束

 6

1.8

廃止事項 及び 廃止予定事項

 6

1.8.1

廃止事項の性質

 6

1.8.2

廃止予定事項の性質

 6

1.9

引用規格

 6

2

Fortran

の用語 及び 概念

 7

2.1

高水準構文

 7

2.2

プログラム単位の概念

 10

2.2.1

プログラム

 11

2.2.2

主プログラム

 11

2.2.3

手続

 11

2.2.4

モジュール

 12

2.3

実行の概念

 12

2.3.1

実行文 及び 非実行文

 12

2.3.2

文の順序

 12

2.3.3

END

 13

2.3.4

実行系列

 13

2.4

データの概念

 14

2.4.1

 14


ページ

2.4.2

データの値

 14

2.4.3

データ要素

 14

2.4.4

スカラ

 16

2.4.5

配列

 16

2.4.6

ポインタ

 16

2.4.7

記憶場所

 16

2.5

基本用語

 16

2.5.1

名前 及び 特定子

 17

2.5.2

キーワード

 17

2.5.3

結合

 17

2.5.4

宣言

 17

2.5.5

定義

 17

2.5.6

引用

 18

2.5.7

組込み

 18

2.5.8

演算子

 18

2.5.9

 18

2.5.10

連携処理系

 18

3

文字,構文素 及び プログラム形式

 19

3.1

処理系の文字集合

 19

3.1.1

英字

 19

3.1.2

数字

 19

3.1.3

下線

 20

3.1.4

特殊文字

 20

3.1.5

その他の文字

 20

3.2

低水準構文

 20

3.2.1

名前

 20

3.2.2

定数

 21

3.2.3

演算子

 21

3.2.4

文番号

 22

3.2.5

括弧類

 23

3.3

プログラム形式

 23

3.3.1

自由形式

 23

3.3.2

固定形式

 25

3.4

文字列の取込み

 25

4

 26

4.1

型の概念

 26

4.1.1

値の集合

 26

4.1.2

定数

 27

4.1.3

演算

 27

4.2

型パラメタ

 27


ページ

4.3

型 及び 値と実体との関連

 28

4.4

組込み型

 28

4.4.1

整数型

 29

4.4.2

実数型

 30

4.4.3

複素数型

 32

4.4.4

文字型

 33

4.4.5

論理型

 36

4.5

派生型

 36

4.5.1

派生型定義

 36

4.5.2

派生型パラメタ

 40

4.5.3

成分

 41

4.5.4

型束縛手続

 46

4.5.5

後始末サブルーチン

 48

4.5.6

型の拡張

 50

4.5.7

派生型の値

 52

4.5.8

派生型指定子

 52

4.5.9

派生型の値の構成

 53

4.5.10

派生型の演算 及び 代入

 55

4.6

列挙体 及び 列挙子

 55

4.7

配列値の構成

 56

5

データ実体の宣言 及び 指定

 58

5.1

型宣言文

 58

5.1.1

宣言型指定子

 61

5.1.2

属性

 62

5.2

属性宣言文

 71

5.2.1

参照許可宣言文

 71

5.2.2

ALLOCATABLE

 71

5.2.3

ASYNCHRONOUS

 71

5.2.4

BIND

 71

5.2.5

DATA

 72

5.2.6

DIMENSION

 74

5.2.7

INTENT

 74

5.2.8

OPTIONAL

 74

5.2.9

PARAMETER

 75

5.2.10

POINTER

 75

5.2.11

PROTECTED

 75

5.2.12

SAVE

 75

5.2.13

TARGET

 76

5.2.14

VALUE

 76

5.2.15

VOLATILE

 76


ページ

5.3

IMPLICIT

 76

5.4

NAMELIST

 79

5.5

データ実体の記憶列結合

 80

5.5.1

EQUIVALENCE

 80

5.5.2

COMMON

 82

6

データ実体の使用

 84

6.1

スカラ

 85

6.1.1

部分列

 85

6.1.2

構造体成分

 86

6.1.3

型パラメタ問合せ

 87

6.2

配列

 88

6.2.1

全体配列

 88

6.2.2

配列要素 及び 部分配列

 88

6.3

動的結合

 91

6.3.1

ALLOCATE

 92

6.3.2

NULLIFY

 95

6.3.3

DEALLOCATE

 95

7

式 及び 代入

 97

7.1

 97

7.1.1

式の形式

 97

7.1.2

組込み演算

 101

7.1.3

利用者定義演算

 102

7.1.4

式の型型パラメタ 及び 形状

 103

7.1.5

要素別処理演算の適合規則

 105

7.1.6

宣言式

 105

7.1.7

初期値式

 107

7.1.8

演算の評価

 108

7.2

組込み演算の解釈

 111

7.2.1

数値組込み演算

 112

7.2.2

文字組込み演算

 112

7.2.3

関係組込み演算

 113

7.2.4

論理組込み演算

 114

7.3

演算子の優先順位

 114

7.4

代入

 116

7.4.1

代入文

 116

7.4.2

ポインタ代入文

 120

7.4.3

配列選別代入 (WHERE)

 123

7.4.4

FORALL

 125

8

実行制御

 131


ページ

8.1

ブロックを含む実行構文

 131

8.1.1

ブロックに関する規則

 131

8.1.2

IF

構文

 132

8.1.3

CASE

構文

 133

8.1.4

ASSOCIATE

構文

 136

8.1.5

SELECT TYPE

構文

 137

8.1.6

DO

構文

 140

8.2

飛越し

 144

8.2.1

GO TO

 144

8.2.2

計算形 GO TO 

 144

8.2.3

算術 IF 

 145

8.3

CONTINUE

 145

8.4

STOP

 145

9

入出力文

 145

9.1

記録

 146

9.1.1

書式付き記録

 146

9.1.2

書式なし記録

 146

9.1.3

ファイル終了記録

 146

9.2

外部ファイル

 147

9.2.1

ファイルの存在

 147

9.2.2

ファイル探査

 147

9.2.3

ファイル位置

 149

9.2.4

ファイル記憶単位

 151

9.3

内部ファイル

 151

9.4

ファイルの接続

 152

9.4.1

接続モード

 152

9.4.2

装置の存在

 153

9.4.3

ファイルと装置との接続

 153

9.4.4

事前接続

 153

9.4.5

OPEN

 154

9.4.6

CLOSE

 158

9.5

データ転送文

 159

9.5.1

制御情報並び

 159

9.5.2

データ転送入出力項目並び

 163

9.5.3

データ転送入出力文の実行

 165

9.5.4

データ転送文の終了

 175

9.6

未了データ転送の待機

 176

9.6.1

WAIT

 176

9.6.2

待機操作

 177

9.7

ファイル位置付け文

 177


ページ

9.7.1

BACKSPACE

 178

9.7.2

ENDFILE

 178

9.7.3

REWIND

 178

9.8

FLUSH

 178

9.9

ファイル問合せ

 179

9.9.1

問合せ指定子

 180

9.9.2

問合せ指定子の制限

 185

9.9.3

出力並び INQUIRE 

 185

9.10

誤り条件記録終了条件 及び ファイル終了条件

 185

9.10.1

誤り条件 及び ERR 指定子

 185

9.10.2

ファイル終了条件 及び END 指定子

 186

9.10.3

記録終了条件 及び EOR 指定子

 186

9.10.4

IOSTAT

指定子

 186

9.10.5

IOMSG

指定子

 187

9.11

入出力文の制限

 187

10

入出力編集

 188

10.1

書式仕様の書き方

 188

10.1.1

FORMAT

 188

10.1.2

文字書式仕様

 188

10.2

書式項目並びの形

 189

10.2.1

編集記述子

 189

10.2.2

 191

10.3

入出力項目並びと書式との対応

 191

10.4

書式制御による位置付け

 192

10.5

小数点記号

 192

10.6

データ編集記述子

 192

10.6.1

数値編集

 193

10.6.2

論理型の編集

 197

10.6.3

文字型の編集

 198

10.6.4

G

形編集

 198

10.6.5

使用者定義派生型の編集

 199

10.7

制御編集記述子

 200

10.7.1

位置付け編集

 200

10.7.2

斜線編集

 201

10.7.3

コロン編集

 201

10.7.4

SS

形編集, SP 形編集 及び 形編集

 201

10.7.5

P

形編集

 201

10.7.6

BN

形編集 及び BZ 形編集

 202

10.7.7

RU

形編集,RD 形編集,RZ 形編集,RN 形編集,RC 形編集 及び RP 形編集

 202

10.7.8

DC

形編集 及び DP 形編集

 202


ページ

10.8

文字列編集記述子

 202

10.9

並び書式

 203

10.9.1

並び入力

 203

10.9.2

並び出力

 205

10.10

変数群書式

 206

10.10.1

変数群入力

 206

10.10.2

変数群出力

 209

11

プログラム単位

 210

11.1

主プログラム

 211

11.2

モジュール

 211

11.2.1

USE

文 及び 参照結合

 212

11.3

初期値設定プログラム単位

 215

12

手続

 216

12.1

手続の分類

 216

12.1.1

引用の形による手続の分類

 216

12.1.2

定義の方法による手続の分類

 217

12.2

手続の特性

 217

12.2.1

仮引数の特性

 217

12.2.2

関数結果の特性

 218

12.3

手続引用仕様

 218

12.3.1

暗黙的引用仕様 及び 明示的引用仕様

 218

12.3.2

手続引用仕様の指定

 219

12.4

手続引用

 227

12.4.1

実引数,仮引数 及び 引数結合

 229

12.4.2

関数引用

 236

12.4.3

サブルーチン引用

 236

12.4.4

名前付き手続引用の解決

 236

12.4.5

型束縛手続引用の解決

 239

12.5

手続定義

 239

12.5.1

組込み手続の定義

 239

12.5.2

副プログラムによって定義される手続

 239

12.5.3

Fortran

以外の手段による手続定義 及び 手続呼出し

 244

12.5.4

文関数

 245

12.6

純粋手続

 245

12.7

要素別処理手続

 247

12.7.1

要素別処理手続宣言 及び 引用仕様

 247

12.7.2

要素別処理関数の実引数 及び 結果

 247

12.7.3

要素別処理サブルーチンの実引数

 248

13

組込み手続 及び 組込みモジュール

 248


ページ

13.1

組込み手続類

 248

13.2

組込み手続の引数

 248

13.2.1

配列引数の形状

 249

13.2.2

選別引数

 249

13.3

ビットの数体系

 249

13.4

数値の数体系

 250

13.5

標準総称組込み関数

 250

13.5.1

数値関数

 251

13.5.2

数学関数

 251

13.5.3

文字関数

 251

13.5.4

種別関数

 252

13.5.5

種々の型変換関数

 252

13.5.6

数値問合せ関数

 252

13.5.7

配列問合せ関数

 252

13.5.8

その他の問合せ関数

 252

13.5.9

ビット操作手続

 253

13.5.10

浮動小数点数操作関数

 253

13.5.11

ベクトル 及び 行列の乗算関数

 253

13.5.12

配列集計関数

 253

13.5.13

配列構成関数

 254

13.5.14

配列内位置関数

 254

13.5.15

NULL

関数

 254

13.5.16

割付け転送手続

 254

13.5.17

乱数手続

 254

13.5.18

システム環境手続

 254

13.6

標準組込み関数の個別名

 254

13.7

標準組込み手続の宣言

 256

13.8

標準組込みモジュール

 308

13.8.1

IEEE

モジュール

 308

13.8.2

組込みモジュール ISO FORTRAN ENV

 308

13.8.3

モジュール ISO C BINDING

 308

14

例外 及び IEEE 算術

 308

14.1

モジュール中で定義されている派生型 及び 定数

 310

14.2

例外

 310

14.3

丸めモード

 312

14.4

下位けたあふれモード

 312

14.5

停止

 313

14.6

浮動小数点数状態

 313

14.7

例外値

 313

14.8

IEEE

算術

 313


ページ

14.9

手続の表

 314

14.9.1

問合せ関数

 314

14.9.2

要素別処理関数

 314

14.9.3

種別関数

 315

14.9.4

要素処理サブルーチン

 315

14.9.5

非要素処理サブルーチン

 315

14.10

手続の要求事項

 315

14.11

 328

15

C

との相互利用可能性

 331

15.1

組込みモジュール ISO C BINDING

 332

15.1.1

モジュールにおける名前付き定数 及び 派生型

 332

15.1.2

モジュールにおける手続

 333

15.2

Fortran

と言語 との言語要素間の相互利用可能性

 336

15.2.1

組込み型の相互利用可能性

 336

15.2.2

C

ポインタ型の相互利用可能性

 338

15.2.3

派生型と言語 の構造体型との相互利用可能性

 338

15.2.4

スカラ変数の相互利用可能性

 339

15.2.5

配列変数の相互利用可能性

 339

15.2.6

手続と手続引用仕様との相互利用可能性

 340

15.3

言語 の大域変数との相互利用可能性

 341

15.3.1

共通ブロック 及び 変数に対する束縛ラベル

 342

15.4

言語 の関数との相互利用可能性

 342

15.4.1

手続に対する束縛ラベル

 343

15.4.2

例外 及び IEEE 算術手続

 343

16

有効範囲,結合 及び 定義状態

 343

16.1

大域識別子の有効範囲

 344

16.2

局所識別子の有効範囲

 344

16.2.1

共通ブロック名と同じ名前の局所識別子

 345

16.2.2

関数結果

 345

16.2.3

総称宣言における制限

 346

16.2.4

成分,型パラメタ 及び 束縛

 347

16.2.5

引数キーワード

 347

16.3

文内要素 及び 構文内要素

 347

16.4

結合

 348

16.4.1

名前結合

 348

16.4.2

ポインタ結合

 352

16.4.3

記憶列結合

 354

16.4.4

継承結合

 356

16.4.5

結合の確立

 356

16.5

変数を確定 又は 不定にする動作

 357


ページ

16.5.1

実体 及び 部分実体の確定

 357

16.5.2

常に確定である変数

 357

16.5.3

初期確定である変数

 357

16.5.4

初期不定である変数

 357

16.5.5

変数が確定になる条件

 357

16.5.6

変数が不定になる条件

 359

16.5.7

変数定義文脈

 360

附属書 A(参考) 用語集

 362

附属書 B(参考) 廃止事項 及び 廃止予定事項

 372

B.1

廃止事項

 372

B.2

廃止予定事項

 372

B.2.1

選択戻り

 373

B.2.2

計算形 GO TO 

 373

B.2.3

文関数

 373

B.2.4

実行文の間の DATA 

 373

B.2.5

文字長引継ぎ文字関数

 373

B.2.6

固定形式

 374

B.2.7

CHARACTER*

の形の文字型宣言

 374

附属書 C(参考) 箇条の注記

 375

C.1

箇条 の注記

 375

C.1.1

組込み型 及び 派生型

 375

C.1.2

近似方法の選択

 376

C.1.3

型の拡張 及び 成分の参照許可属性

 376

C.1.4

抽象型

 377

C.1.5

ポインタ

 377

C.1.6

構造体構成子 及び 総称名

 378

C.1.7

総称型束縛手続

 380

C.1.8

後始末サブルーチン

 381

C.2

箇条 の注記

 382

C.2.1

POINTER

属性

 382

C.2.2

TARGET

属性

 383

C.2.3

VOLATILE

属性

 383

C.3

箇条 の注記

 384

C.3.1

構造体成分

 384

C.3.2

実行時の型を伴う割付け(6.3.1 参照)

 385

C.3.3

ポインタ割付け 及び ポインタ結合

 385

C.4

箇条 の注記

 386

C.4.1

文字代入文

 386


ページ

C.4.2

関数引用の評価

 386

C.4.3

式中のポインタ

 386

C.4.4

代入文の左辺に置かれたポインタ

 386

C.4.5

WHERE

構文を含む FORALL 構文の例

 387

C.4.6

単純 FORALL 文の例

 388

C.5

箇条 の注記

 388

C.5.1

ループ制御

 388

C.5.2

CASE

構文

 389

C.5.3

DO

構文の例

 389

C.5.4

誤った DO 構文の例

 390

C.6

箇条 の注記

 390

C.6.1

外部ファイル

 391

C.6.2

停留入出力

 391

C.6.3

非同期入出力

 393

C.6.4

OPEN

 394

C.6.5

接続属性

 395

C.6.6

CLOSE

 395

C.7

箇条 10 の注記

 396

C.7.1

記録の個数

 396

C.7.2

並び入力

 396

C.8

箇条 11 の注記

 396

C.8.1

主プログラム 及び 初期値設定プログラム単位

 396

C.8.2

依存翻訳

 397

C.8.3

モジュールの使用例

 399

C.9

箇条 12 の注記

 404

C.9.1

外部手続の可搬性の問題

 404

C.9.2

Fortran

以外の手段で定義された手続

 404

C.9.3

手続引用仕様

 404

C.9.4

抽象引用仕様

 405

C.9.5

引数の結合 及び 評価

 406

C.9.6

引数としてのポインタ 及び 指示先

 407

C.9.7

多相的引数結合

 408

C.10

箇条 15 の注記

 409

C.10.1

実行環境

 409

C.10.2

Fortran

と言語 の関数との相互利用可能性の例

 409

C.11

箇条 16 の注記

 413

C.11.1

親子結合の例

 413

C.11.2

明白な総称を保証する規則

 414

C.12

配列機能の注記

 418


ページ

C.12.1

機能のまとめ

 418

C.12.2

 419

C.12.3

数式の翻訳 及び 配列処理

 422

C.12.4

残差平方和

 423

C.12.5

ベクトルのノルム(無限大ノルム 及び 1 ノルム)

 423

C.12.6

行列のノルム(無限大ノルム 及び 1 ノルム)

 424

C.12.7

論理問合せ

 424

C.12.8

並列計算

 424

C.12.9

配列要素ごとの計算の例

 424

C.12.10

ビット操作手続 及び ビット問合せ関数

 425

附属書 D(参考) 構文規則

 426

D.1

全構文規則の抽出

 426

D.2

構文規則の相互参照

 472

附属書 E(参考) 索引

 473

 496


まえがき

この規格は,工業標準化法第 14 条によって準用する第 12 条第 1 項の規定に基づき,社団法人 情報処理学会 (IPSJ)

及び 財団法人 日本規格協会 (JSA) から,工業標準原案を具して日本工業規格を改正すべきとの申出があり,日本工

業標準調査会の審議を経て,経済産業大臣が改正した日本工業規格である。

これによって,JIS X 3001-1 :

1998

は改正され,この規格に置き換えられた。

この規格は,著作権法で保護対象となっている著作物である。

この規格の一部が,特許権,出願公開後の特許出願,実用新案権 又は 出願公開後の実用新案登録出願に抵触する

可能性があることに注意を喚起する。経済産業大臣 及び 日本工業標準調査会は,このような特許権,出願公開後の

特許出願,実用新案権 及び 出願公開後の実用新案登録出願にかかわる確認について,責任はもたない。

JIS X 3001

の規格群には,次に示す部編成がある。

JIS X 3001-1 :

2009

プログラム言語 Fortran — 第 1 部:基底言語

JIS X 3001-2 :

2002

プログラム言語 Fortran — 第 2 部:可変長文字列

JIS X 3001-3 :

2000

プログラム言語 Fortran — 第 3 部:条件付き翻訳


日 本 工 業 規 格

JIS

X 3001-1

: 2009

(ISO/IEC 1539-1

: 2004

)

プ ロ グ ラ ム 言 語

Fortran —

1

部 : 基 底 言 語

Programming languages — Fortran —

Part 1: Base language

序文

この規格は,2004 年に発行された ISO/IEC 1539-1 を基に,技術的内容 及び 構成を変更することなく作成した

日本工業規格である。この規格は,複数の部からなる Fortran の規格の第 1 部である。この部によって規定された言

語は,非公式に Fortran 2003 として知られている。

なお,下線を施してある用語は,この規格で定義する用語である。側線を施してある参考事項は,対応国際規格に

はない事項である。文字を小さくしてある箇所は,廃止予定事項である。

1

一般的規定要素

1.1

適用範囲

JIS X 3001

は,複数の部からなる規格とし,各部は別々に制定する。第 1 部であるこの規格は,Fortran 基底言語

で表現するプログラムの形を規定し,その解釈を与える。この規格は,Fortran プログラムを種々の計算機システム上

で使用する場合の可搬性,信頼性,保守性 及び 実行効率を高めることを目的とする。第 2 部である JIS X 3001-2

は,可変長文字列の操作に関する追加機能を規定する。第 3 部である JIS X 3001-3 は,Fortran で用いられる条件

付き翻訳の機能を規定する。JIS X 3001-1 に合致する処理系は,必ずしも JIS X 3001-2 又は JIS X 3001-3 

合致していなくてもよいが,JIS X 3001-2 又は JIS X 3001-3 に合致する処理系はこの規格に合致していること

を前提とする。

注記

この規格の対応国際規格及びその対応の程度を表す記号を,次に示す。

ISO/IEC 1539-1 : 2004, Information technology — Programming languages — Fortran —

Part 1: Base language (IDT)

 なお,対応の程度を示す記号 (IDT) は,ISO/IEC Guide 21 に基づき,一致していることを示す。

1.2

処理系

この規格では,計算機システムとそこで用いるためにプログラムを変換する機構とを合わせたものを 処理系 (processor)

という。

1.3

規定事項

この規格は,次の事項を規定する。

(1) Fortran

で書かれたプログラムの形。

(2)

プログラム 及び そのデータの意味を解釈する規則。

(3)

プログラムによって処理される入力データの形。

(4)

プログラムを使用した結果生成される出力データの形。

1.4

規定外事項

この規格は,次の事項を規定しない。

(1)

計算機システム上で使用するためにプログラムを変換する機構。

1


2

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

(2)

計算機システム上でプログラムを使用するときの準備 及び 制御のために必要な操作。

(3)

プログラム 及び その入出力データを記憶媒体へ 又は 記憶媒体から転記する方法。

(4)

この規格の規則では解釈を与えられないプログラム 及び 処理系の動作。ただし,1.5 (2)∼(8) では,処理系の

検出能力 及び 報告能力が規定されている。

(5)

特定の計算機システムの容量 又は 特定の処理系の能力を超えるプログラム 及び そのデータの大きさ 又は 複

雑さ。

(6)

特定の処理系における量の表現の物理的性質 及び 数値の丸め,近似 又は 計算の方法。

(7)

入出力の記録,ファイル 及び 装置の物理的性質。

(8)

記憶の物理的性質 及び 実現法。

1.5

規格合致性

プログラム (2.2.1) は,ここに規定されている形 及び 関係だけを用いて書かれ,かつ それがこの規格に従った解

釈をもつとき,規格合致プログラム (standard-conforming program) という。プログラム単位 (2.2) は,それを含む

プログラムが規格合致となるとき,この規格に規格合致しているという。

処理系は,次の能力をすべてもつとき,この規格に規格合致する。

(1)

ここで規定したとおりの解釈を満たすやり方で,あらゆる規格合致プログラムを実行する。ただし,処理系は,

プログラムの大きさ 又は 複雑さに制限を加えてもよい。

(2)

廃止予定事項 (1.8.2) として規定された形を使用しているプログラム単位について,識別番号の付いた構文規則

及び 制約を引用して検出できるとき,その使用を検出し報告する能力をもつ。

(3)

識別番号の付いた構文規則 及び 制約によって認められていない拡張された形 又は 関係[

附属書 で規定する

廃止事項 (1.8.1) を含む。]を使用しているプログラム単位について,その使用を検出し報告する能力をもつ。

(4)

処理系が実装していない種別型パラメタ値をもつ組込み型 (4.4) を使用しているプログラム単位について,その

使用を検出し報告する能力をもつ。

(5)

箇条 で認められていないプログラム形式 又は 文字を使用しているプログラム単位について,その使用を検出

し報告する能力をもつ。

(6)

箇条 16 での名前,文番号,演算子 及び 代入記号の有効範囲の規則に反する形で名前を使用しているプログラ

ムについて,その使用を検出し報告する能力をもつ。

(7)

箇条 13 で名前が定義されていない組込み手続を使用しているプログラム単位について,その使用を検出し報告

する能力をもつ。

(8)

プログラムを受理しない理由を検出し報告する能力をもつ。

ただし,FORMAT 文 (10.1.1) の一部をなさない書式仕様において,処理系は,廃止事項 又は 廃止予定事項を使

用していること,及び 拡張された形 又は 関係を使用していることは,検出し報告しなくてもよい。

規格合致処理系は,拡張された形 及び 関係を許してもよいが,それらが規格で定められている形 及び 関係と矛

盾してはならない。ただし,規格合致プログラム中の手続の名前と矛盾する組込み手続は,追加してもよい。このよ

うな矛盾が起こった場合,処理系は,その名前が同じ有効域内で EXTERNAL 属性 (5.1.2.6) を与えられていない限

り,その組込み手続を用いる(箇条 16 参照)。規格合致プログラムは,処理系によって拡張された非標準組込み手

続 又は 非標準組込みモジュール を用いてはならない。

規格合致プログラムは,この規格の適用範囲外の事項を処理系に対して要求してもよく,また Fortran 以外の手段

で定義された外部手続のような可搬性のない書き方を含むこともできるので,この規格における規格合致性は,プロ

グラムがすべての 又は 任意の規格合致処理系の上で同じように実行されることを保証するものではない。

この規格は,この規格で完全には規定していない機能の提供を許している。これらの機能は 処理系依存 (processor

dependent)

と呼ばれ,提供する場合には,その方法 又は 意味を処理系が定めなければならない。


3

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





注記 1.1

処理系には,次の 3 点についての文書が附属しているのが望ましい。

(1)

処理系の定めるプログラムの大きさ 及び 複雑さに関する制約,並びに その制約を超過した場

合に報告する方法

(2)

処理系が許す拡張された形 及び 関係

(3)

拡張された形 及び 関係の使用 並びに 廃止事項 又は 廃止予定事項の使用を報告する方法 (こ

の場合,廃止事項の使用は,拡張された形の使用に当たる。)

処理系には,処理系依存の方法 又は 意味を定義する文書が附属しているのが望ましい。





1.6

互換性

JIS X 3001-1982

及び ISO 1539 : 1980(非公式に F

ORTRAN

77

と呼ばれている。)以降のそれぞれの Fortran の

規格では,それ以前の規格よりも多くの組込み手続を定義している。したがって,より古い規格に合致した Fortran

のプログラムが,新しい組込み手続と同じ名前の手続を呼んでいる場合,新しい規格とは異なった解釈となる。ただ

し,手続が EXTERNAL 属性をもつと指定してある場合は,同じ解釈となる。

1.6.1 Fortran 95

との互換性

次に示す点を除いて,この規格は,従来の Fortran の規格 JIS X 3001-1 : 1998 及び ISO/IEC 1539-1 : 1997

(Fortran 95)の上位互換拡張になっている。Fortran 95 の規格合致プログラムは,この規格に規格合致する。Fortran

95

にあった次の機能は,この規格とは異なった解釈となる。

(1)

従来の Fortran の規格には,処理系依存の外部ファイル集合(空でもよい。)に対して,書式付き出力の 1 けた

目が特別な意味をもつという印字の概念があった。その集合を検出したり指定したりする手段は,規定されてい

なかった。最初のけたの解釈は,この規格では規定しない。

(2)

この規格は,並び出力 及び 変数群出力に出てくる実数 0 に対して,異なった出力形式を規定する。

(3)

この規格は,処理系が正の実数 0 と負の実数 0 とを区別できるとき,次の場合に異なった結果の値を要求する。

(a) 0

かつ Y の値が 0 で符号が負のときの ATAN2(Y,X)

(b) X

が REAL(X) 0 となる複素数であって X の虚部が 0 で符号が負のときの LOG(X) 及び SQRT(X)

1.6.2 Fortran 90

との互換性

附属書 B.1 に示す廃止事項 及び次に示す点を除いて,この規格は,JIS X 3001-1994 及び ISO 1539 : 1991

(Fortran 90)の上位互換拡張になっている。Fortran 90 の規格合致プログラムは,廃止事項のいずれをも使用してい

ない限り,この規格に規格合致する。

この規格では,INQUIRE 文の PAD 指定子は,指定したファイルが装置に接続されていない 又は 書式なし入出力

に対して接続されている場合,UNDEFINED を返す。Fortran 90 では YES を返す。

Fortran 90

では,MOD 又は MODULO の第 2 引数が 0 のとき,結果は処理系依存である。この規格では,第 2 引数が

0

であってはならないと規定している。

1.6.3 F

ORTRAN

77

との互換性

附属書 B.1 に示す廃止事項 及び次に示す点を除いて,この規格は,JIS X 3001-1982 及び ISO 1539 : 1980

(F

ORTRAN

77

)の上位互換拡張になっている。

附属書 B.1 に示す廃止事項を使用していず,次に示す解釈の異な

る事項にも依存していない限り,F

ORTRAN

77

の規格合致プログラムは,この規格に規格合致する。この規格では,

F

ORTRAN

77

においては処理系依存であった幾つかの事項に対して制限を設ける。したがって,F

ORTRAN

77

の規格

合致プログラムが,これらの処理系依存事項を使用している場合,この規格では異なった解釈になりうるが,それで

もそのプログラムは,この規格に規格合致する。この規格において F

ORTRAN

77

とは解釈の異なる事項を,次に示す。

(1) F

ORTRAN

77

では,DATA 文において倍精度実数型データの初期値として使われる定数が実数型の定数として表

現されている場合,処理系は,実数型データで表現できるよりも高い精度のデータを提供することが可能になっ


4

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

ていた。この規格では,それを認めていない。

(2)

共通ブロック中にない名前付き変数が DATA 文で初期化され,その変数が SAVE 属性をもたない場合,その

SAVE

属性の扱いは,F

ORTRAN

77

では処理系依存となっていた。この規格では,この名前付き変数は SAVE 属

性をもつ(5.2.5 参照)。

(3) F

ORTRAN

77

では,入力項目並びによって要求される文字の個数は,書式付き入力における記録中の文字の個数

を超えてはならなかった。この規格では,入力記録中の文字の個数が足りない場合,適切な OPEN 文 及び READ

文で値が ’NO’ である PAD 指定子が指定されていない限り,その入力記録に論理的に空白を補う(9.5.3.4.2

参照)。

(4)

書式付き出力文中の出力項目の値がゼロであるとき,幾つかの G 形編集記述子では異なった形に編集される。更

に,この規格では値の丸めが出力欄の形にどのように作用するかを規定しているが,F

ORTRAN

77

ではこの点を

規定していなかった。したがって,値と G 形編集記述子とのある種の組合せに対して,ある F

ORTRAN

77

の処

理系は,Fortran 2003 の処理系と異なる出力をするかもしれない。

(5)

処理系が正の実数 0 と負の実数 0 とを区別できる場合,組込み関数 SIGN の第 2 引数が負の実数 0 であるときの

振る舞いがこの規格では変更されている。

1.7

この規格での記述法

この規格では,“しなければならない” は要求事項と解釈し,“してはならない” は禁止事項と解釈する。特に断り

がない限り,この要求事項 及び 禁止事項は処理系にではなくプログラムに適用される。

1.7.1

補足要素

説明,根拠,例などのための補足要素がこの規格に混在している。これらの補足要素は,注記 又は 例として番号

付けされた四角い枠の中に明記されており,規定事項ではない。

1.7.2

構文規則

構文規則 (syntax rule) は,Fortran の構文素,文 及び 構造構文の形を規定する。構文規則は,次の約束 及び 記

号による超言語を用いて記述する。

注記

この超言語は,Backus-Naur 記法 (BNF) を変形したものである。

(1) Fortran

文字集合 (3.1) 中の文字は,特に断りがない限り,示されているとおりに解釈される。

(2)

英大文字,英小文字,日本語の文字 及び それらからなる語は,一般的な構文概念を示し,実際の文中ではそれ

が表す特定の構文要素で置き換えなければならない。構文概念の例を次に示す。

引数

属性

宣言

定義

記述子

整数

演算子

指定子

(3)

構文超記号の用法は,次による。

is

は,構文概念の定義を示す。

or

は,構文概念の代替を示す。

角括弧 [ ] は,省略可能な要素を示す。

角括弧に続く省略記号 [ ] ... は,角括弧中の要素が 0 回以上引き続いて現れてもよいことを示す。

黒四角

は,構文規則が続くことを示す。

(4)

各構文規則は,Rsnn の形をした一意の識別番号をもつ。ここで,は 1 けた 又は 2 けたの数字からなる箇条番

号とし,nn は箇条内の 2 けたの順序番号とする。構文規則は,本文の中では分散して配置されており,必要に

応じて識別番号によって参照される。箇条 及び の幾つかの規則は,完全な規定が後続の箇条にある。その


5

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

場合には,箇条番号 は,規則が繰り返されている後続の箇条のものにしてある。

(5)

構文規則は,Fortran の完全かつ正確な構文記述ではないので,構文解析系を自動生成するために使用すること

はできない。構文規則が不完全な箇所では,それらの規則は関連した制約 及び 本文によって制限される。





例 1.2

構文規則の記述の例を次に示す。

数字列

is

数字 [ 数字 ] ...

この規則で許される数字列の形の例を次に示す。

数字

数字 数字

数字 数字 数字 数字

数字 数字 数字 数字 数字 数字 数字 数字

数字” が特定の要素に置き換わったときの実際の数字列は,次のようになる。

4

67

1999

10243852





1.7.3

制約

各制約は,Csnn の形をした一意の識別番号をもつ。ここで,は 1 けた 又は 2 けたの数字からなる箇条番号とし,

nn

は箇条内の 2 けたの順序番号とする。

制約は通常,特定の構文規則と関連している。関連している場合,関連する構文規則の番号を括弧内に示す。構文

規則と関連している制約は,その規則によって定義された構文要素の定義の一部を構成する。これは,その構文要素

が現れるすべての場合に適用される。

幾つかの制約は,特定の構文規則と関連していない。そのような制約の効果は,処理系が制約の違反を検出し報告

する機能が要求されること (1.5) を除いて,本文で指定された制限の効果と同等とする。広義の要求事項は本文中で

規定し,その要求事項の一部は制約としても規定することがある。その場合,規格合致プログラムは,広義の要求事

項を満たしていなければならないが,規格合致している処理系は制約の違反を診断する機能をもつだけでよい。

1.7.4

暗黙の構文規則

構文規則 及び 制約の個数を最小に抑えるために,すべての構文概念 “XYZ ” に対して明示的な構文規則がない限

り,次の暗黙の規則を想定する。

R101

XYZ

並び

is

XYZ [ , XYZ ] ...

R102

XYZ

is

名前

R103

スカラXYZ

is

XYZ

C101

(R103)

スカラ XYZ は,スカラでなければならない。

1.7.5

構文の約束 及び 特色

(1) 

文” で終わる任意の構文要素名は,プログラム形式の文の規則に従う。つまり,行の終了 又は セミコロンで区

切らなければならない。(IF 文 又は WHERE 文のような)他の文の一部を形成する場合を除いて,文番号を付

けてもよい。逆に,プログラム形式の文とみなされるすべてのものは,構文規則において,終わりが “文” となっ

ている。

(2)

文の順序に対する規則は,プログラム単位 (R202) の定義中で厳密に規定する。式の階層は,式 (R722) の定義中

で厳密に規定する。


6

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

(3)

接尾辞 “指定” は,通常,入出力文などの指定子として使う。更に,型宣言の属性(例えば,R510 の “配列形状

指定”)としても使い,その他にも使うことがある。

(4)

括弧でくくられていて型パラメタを指すときは,接尾辞 “選択子” を使う。例として,“文字長パラメタ選択

子”(R425) 及び “種別型パラメタ選択子”(R404) がある。

(5)

用語 “添字”(例えば,R618, R619 及び R620)は,一貫して配列定義中で使う。

1.7.6

文章記述の約束

通常の本文においては,構文規則の用語と必ずしも同一ではない通常の単語を使うことがある。個々の文,個々の

属性,個々の指定子などは,例えば “END 文” のように英大文字で示す。用語が特定の意味で最初に定義される箇所

では,下線を引き,英語を添えて示す。廃止予定事項は,文字を小さくして示す。





例 1.3

これが廃止予定事項で使われる文字の大きさである。





1.8

廃止事項 及び 廃止予定事項

この規格は,五つの廃止事項を除き Fortran 90 の処理系依存ではない言語要素をすべて含むことによって,利用

者の財産である既存のソフトウェアを保護する。この規格は,時代遅れの事項を二つの区分で表現する。第 1 の区分

は,廃止事項 (deleted feature) といい,F

ORTRAN

77

において冗長だとみなされており,Fortran 90 においてはほと

んど使われていない事項であり,この規格には五つある。第 2 の区分は,廃止予定事項 (obsolescent feature) といい,

Fortran 90

及び Fortran 95 において冗長だとみなされているが,まだ頻繁に使われているものである。

1.8.1

廃止事項の性質

(1) F

ORTRAN

77

により良い方法が存在した。

(2)

この区分に属する事項は,Fortran 95 及び Fortran 2003 に含まれていない。

1.8.2

廃止予定事項の性質

(1) Fortran 90

及び Fortran 95 により良い方法が存在した。

(2)

プログラマは,新しいプログラム中ではより良い方法を使用し,既存のコードではそれらの方法で元のコードを

置き換えるのがよい。

(3)

廃止予定事項は,この規格の本文中で,小さい文字によって表現する(1.7.6 参照)。

(4) Fortran

プログラムにおけるこれらの事項の使用が重要でなくなったら,Fortran の改正原案作成委員会が次の

改正時にその事項の廃止を検討するのが望ましい。

(5)

次の Fortran の改正原案作成委員会は,廃止予定事項に指定されている言語事項だけの廃止を検討するのが望ま

しい。

(6) Fortran

の処理系は,廃止予定事項が Fortran プログラムで広く使われている間は,それを実装するのが望ましい。

1.9

引用規格

次に掲げる規格は,この規格に引用されることによって,この規格の規定の一部を構成する。これらの引用規格は,

記載の年の版を適用し,その後の改正版(追補を含む。)は適用しない。

JIS X 0201-1997

情報交換用符号

注記 対応国際規格: ISO/IEC 646 : 1991, Information technology — ISO 7-bit coded character set for

information interchange (MOD)

JIS X 0301-1992

日付及び時刻の表記

注記 対応国際規格: ISO 8601 : 1988, Data elements and interchange formats — Information interchange

— Representation of dates and times (MOD)

JIS X 3010 : 2003

プログラム言語 C

注記 対応国際規格: ISO/IEC 9899 : 1999, Programming Languages — C (IDT)


7

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

JIS X 0221-1 : 2001

国際符号化文字集合 — 第 1 部:体系及び基本多言語面

注記

対応国際規格: ISO/IEC 10646-1 : 2000, Information technology — Universal multiple-octet

coded character set (UCS) — Part 1: Architecture and basic multilingual plane (IDT)

これらの規格は廃止され,JIS X 0221 : 2007 及び ISO/IEC 10646 : 2003 が制定されている。

IEC 60559 (1989-01), Binary floating-point arithmetic for microprocessor systems.

ISO/IEC 646 : 1991

は国際規格であり,ASCII として知られている ANSI X3.4-1986 と一致している。

この規格は,JIS X 3010 : 2003 を引用するとき,それと一致する ISO/IEC 9899 : 1999 にちなんで,それを

言語 C の国際規格” と呼ぶ。

IEC 60559 (1989-01)

の内容は,IEEE 754 -1985 (Standard for binary floating-point arithmetic) と技術的に同

一であり,この名前で広く知られているので,この規格では “IEEE 国際規格” と呼ぶ。

2 Fortran

の用語 及び 概念

2.1

高水準構文

2.1

では,構造構文,文 及び 式の水準より高位の Fortran の概念に関連する構文,すなわちプログラム単位その他

を規定し,それらの関係を示す。この規格での記述法は,1.7 による。





注記 2.1

R2

以外で始まる構文規則に関する制約 及び その他の情報は,適切な箇条に書く。





R201

プログラム

is

プログラム単位

[

プログラム単位 ] ...

一つのプログラムは,主プログラムを一つだけプログラム単位として含むか,又は Fortran 以外の手段で定義され

た主プログラムを一つだけ含んでいなければならない。ただし,これらの両方を含んでいてはならない。

R202

プログラム単位

is

主プログラム

or

外部副プログラム

or

モジュール

or

初期値設定プログラム単位

R1101

主プログラム

is

[ PROGRAM

文 ]

[

宣言部 ]

[

実行部 ]

[

内部副プログラム部 ]

END PROGRAM

R203

外部副プログラム

is

関数副プログラム

or

サブルーチン副プログラム

R1223

関数副プログラム

is

FUNCTION

[

宣言部 ]

[

実行部 ]

[

内部副プログラム部 ]

END FUNCTION

R1231

サブルーチン副プログラム

is

SUBROUTINE

[

宣言部 ]


8

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

[

実行部 ]

[

内部副プログラム部 ]

END SUBROUTINE

R1104

モジュール

is

MODULE

[

宣言部 ]

[

モジュール副プログラム部 ]

END MODULE

R1116

初期値設定プログラム単位

is

BLOCK DATA

[

宣言部 ]

END BLOCK DATA

R204

宣言部

is

[ USE

文 ] ...

[ IMPORT

文 ] ...

[

暗黙型宣言部 ]

[

宣言構文 ] ...

R205

暗黙型宣言部

is

[

暗黙型宣言部文 ] ...

IMPLICIT

R206

暗黙型宣言部文

is

IMPLICIT

or

PARAMETER

or

FORMAT

or

ENTRY

R207

宣言構文

is

派生型定義

or

ENTRY

or

列挙体定義

or

FORMAT

or

引用仕様宣言

or

PARAMETER

or

手続宣言文

or

単純宣言文

or

型宣言文

or

文関数定義文

R208

実行部

is

実行構文

[

実行部構文 ] ...

R209

実行部構文

is

実行構文

or

FORMAT

or

ENTRY

or

DATA

R210

内部副プログラム部

is

CONTAINS

内部副プログラム


9

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

[

内部副プログラム ] ...

R211

内部副プログラム

is

関数副プログラム

or

サブルーチン副プログラム

R1107

モジュール副プログラム部

is

CONTAINS

モジュール副プログラム

[

モジュール副プログラム ] ...

R1108

モジュール副プログラム

is

関数副プログラム

or

サブルーチン副プログラム

R212

単純宣言文

is

参照許可宣言文

or

ALLOCATABLE

or

ASYNCHRONOUS

or

BIND

or

COMMON

or

DATA

or

DIMENSION

or

EQUIVALENCE

or

EXTERNAL

or

INTENT

or

INTRINSIC

or

NAMELIST

or

OPTIONAL

or

POINTER

or

PROTECTED

or

SAVE

or

TARGET

or

VOLATILE

or

VALUE

R213

実行構文

is

単純実行文

or

ASSOCIATE

構文

or

CASE

構文

or

DO

構文

or

FORALL

構文

or

IF

構文

or

SELECT TYPE

構文

or

WHERE

構文

R214

単純実行文

is

ALLOCATE

or

代入文

or

BACKSPACE

or

CALL


10

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

or

CLOSE

or

CONTINUE

or

CYCLE

or

DEALLOCATE

or

ENDFILE

or

END FUNCTION

or

END PROGRAM

or

END SUBROUTINE

or

EXIT

or

FLUSH

or

FORALL

or

GO TO

or

IF

or

INQUIRE

or

NULLIFY

or

OPEN

or

ポインタ代入文

or

PRINT

or

READ

or

RETURN

or

REWIND

or

STOP

or

WAIT

or

単純 WHERE 文

or

WRITE

or

算術

IF

or

計算形

GO TO

C201

(R208)

実行部は,END FUNCTION 文,END PROGRAM 文 及び END SUBROUTINE 文を含んで

はならない。

2.2

プログラム単位の概念

プログラム単位は,Fortran プログラムの基本的な構成要素とする。プログラム単位 (program unit) は,主プログ

ラム,外部副プログラム,モジュール 又は 初期値設定プログラム単位のいずれかとする。副プログラムは,関数副プ

ログラム 又は サブルーチン副プログラムのいずれかとする。モジュールは,他のプログラム単位から参照可能とす

べき定義を含む。初期値設定プログラム単位は,名前付き共通ブロック中のデータ実体に初期値を指定するために用

いる。それぞれの種類のプログラム単位は,箇条 11 及び 12 による。外部副プログラム (external subprogram) は,

主プログラムにもモジュールにも他の副プログラムにも含まれない副プログラムとする。内部副プログラム (internal

subprogram)

は,主プログラムに含まれるか,又は 他の副プログラムに含まれる副プログラムとする。モジュール副

プログラム (module subprogram) は,モジュールに含まれていて内部副プログラムではない副プログラムとする。

プログラム単位は,重なりのない有効域の集合からなる。一つの 有効域 (scoping unit) は,次のいずれかとする。

(1)

一つのプログラム単位 又は 副プログラムから,その中に含まれる有効域を除いた部分。


11

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

(2)

一つの派生型定義(4.5.1 参照)。

(3)

一つの引用仕様本体から,その中に含まれる有効域を除いた部分。

他の有効域を直接に包む有効域を,親有効域 (host scoping unit) [又は 親プログラム (host)]と呼ぶ。

2.2.1

プログラム

プログラム (program) は,一つの主プログラム,任意個(0 個でもよい。)の他の種類のプログラム単位,並びに

Fortran

以外の手段で定義された任意個(0 個でもよい。)の外部手続 及び 他の言語要素からなる。





注記 2.2

二つ以上の名前なし初期値設定プログラム単位があってはならない(11.3 参照)。

この規格では,一つのプログラムを構成するプログラム単位の順序については何も要求しないが,モ

ジュール引用を処理する時にはモジュールの公開部分は利用可能になっていなければならない(11.2.1

参照)ので,処理系は,プログラム単位の処理に特別の順序を要求してもよい。





2.2.2

主プログラム

Fortran

の主プログラムは,11.1 による。

2.2.3

手続

手続 (procedure) は,任意の処理の列をまとめたものであり,プログラムの実行中に直接呼び出すことができる。

手続は,関数 又は サブルーチンのいずれかとする。関数 (function) は,式の中で呼び出される手続とする。関数が

呼び出されると,値が計算され,その値が式の評価に使われる。関数の値を返す変数を,結果変数 (result variable)

と呼ぶ。サブルーチン (subroutine) は,CALL 文で,利用者定義代入文によって 又は 派生型要素に幾つかの操作を

することによって呼び出される手続とする。サブルーチンは,純粋手続でないとき,そのサブルーチンで参照可能な

データ実体の値を変更することによって,プログラムの状態を変更することができる。関数も,純粋手続でないとき,

関数値を計算するだけでなく,同様にしてプログラムの状態を変更することができる。

手続は,箇条 12 で更に規定する。

2.2.3.1

外部手続

外部手続 (external procedure) は,外部副プログラムによって 又は Fortran 以外の手段によって定義された手続と

する。外部手続は,主プログラムから 又は プログラムの任意の手続から呼び出すことができる。

2.2.3.2

モジュール手続

モジュール手続 (module procedure) は,モジュール副プログラム (R1108) によって定義された手続とする。その

副プログラムを含むモジュールを,そのモジュール手続の親有効域とする。

2.2.3.3

内部手続

内部手続 (internal procedure) は,内部副プログラム (R211) によって定義された手続とする。その内部副プログラ

ムを含む主プログラム 又は 副プログラムを,その内部手続の親有効域とする。内部手続は,親プログラムの有効域

及び 親プログラムの他のすべての内部手続の有効域の内部からは参照できるが,その他の場所からは参照できない。

この意味で,内部手続は,その親プログラムに対して局所的である。

2.2.3.4

引用仕様宣言

引用仕様本体 (interface body) は,抽象引用仕様 又は 仮手続,外部手続,手続ポインタ 及び 型束縛手続の引用仕

様を定義する。

引用仕様宣言 (interface block) は,個別引用仕様宣言,抽象引用仕様宣言 又は 総称引用仕様宣言とする。個別引

用仕様宣言は,引用仕様本体の集合とする。総称引用仕様宣言は,次のいずれかによって手続が起動されることを指

定するのにも使われる。

(1)

総称名の使用

(2)

利用者定義演算子の使用


12

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

(3)

利用者定義代入の使用

(4)

派生型入出力

2.2.4

モジュール

モジュール (module) は,他のプログラム単位に参照させるべき定義を含むか,又は そのような定義を他のモジュー

ルから参照してくる。これらの定義には,データ実体宣言,型定義,手続定義 及び 引用仕様宣言がある。他のプロ

グラム単位中の有効域から,モジュールの中にある定義を参照することができる。モジュールは,箇条 11 で更に規

定する。

2.3

実行の概念

Fortran

のそれぞれの文は,実行文 (executable statement) 又は 非実行文 (nonexecutable statement) のいずれか

に分類される。プログラム単位中に書く文の順序には制限があり,すべての実行文をすべての構文に書くことができ

るわけではない。

2.3.1

実行文 及び 非実行文

プログラムの実行は,動作の時系列とする。一つの実行文は,一つ以上のこれらの動作を実行 又は 制御する一つ

の命令とする。したがって,一つのプログラム単位中の実行文は,そのプログラム単位の振る舞いを決定する。実行

文は,実行構文という構文概念を構成しうるすべての文とする。

注記

ただし,

DATA

文 及び

FORMAT

文は,実行構文中に混在しうるが,実行文ではない。

非実行文は,動作を指定するのではなく,動作が行われるときのプログラム環境を指定するために用いる。非実行

文は,実行文として分類されないすべての文とする。

2.3.2

文の順序

2.1

の構文規則は,プログラム単位 及び 副プログラムの中での文の順序を指定する。これらの規則を,

表 2.1 及び

表 2.2 で説明する。表 2.1 は,文の順序の規則を示し,すべてのプログラム単位,副プログラム 及び 引用仕様本体に

適用する。縦線は,混在できる文の種類を区切り,横線は,混在できない文の種類を区切る。内部副プログラム 又は

モジュール副プログラムは,CONTAINS 文の後に書かなければならない。副プログラム中の USE 文と CONTAINS

文との間では,非実行文は,一般に実行文より前に書く。ただし,ENTRY 文,FORMAT 文

及び

DATA

は,実行文

の間に書いてもよい。

表 2.2 は,有効域中で許される文を示す。

表 2.1―文の順序

PROGRAM

文,FUNCTION 文,SUBROUTINE 文,

MODULE

文 又は BLOCK DATA 文

USE

IMPORT

FORMAT

IMPLICIT NONE

及び

PARAMETER

IMPLICIT

ENTRY

PARAMETER

派生型定義,引用仕様宣言,型宣言文,

及び

列挙体定義,手続宣言,単純宣言文

DATA

及び 文関数定義文

DATA

実行構文

CONTAINS

内部副プログラム 又は モジュール副プログラム

END


13

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

表 2.2―有効域中で許される文

有効域の種類

主プロ

モジュ

初期値設定プ

外部副プ

モジュール副

内部副プ

引用仕

グラム

ール

b)

ログラム単位

ログラム

プログラム

ログラム

様本体

USE

IMPORT

×

×

×

×

×

×

ENTRY

×

×

×

×

×

FORMAT

×

×

×

その他の宣言

a)

DATA

×

派生型定義

引用仕様宣言

×

実行文

×

×

×

CONTAINS

×

×

×

文関数定義文

×

×

×

a)

 ここで,その他の宣言とは,PARAMETER 文,IMPLICIT 文,型宣言文,列挙体定義,手続

宣言文 及び 単純宣言文とする。

b)

 モジュールに含まれるモジュール副プログラムは,そのモジュールの有効域には含まれない。

2.3.3 END

END PROGRAM

文,END FUNCTION 文,END SUBROUTINE 文,END MODULE 文 及び END BLOCK

DATA

文を,END 文 (END statement) という。それぞれのプログラム単位,モジュール副プログラム 及び 内部副

プログラムは,ちょうど一つの END 文をもたなければならない。END PROGRAM 文,END FUNCTION 文 及び

END SUBROUTINE

文は,実行文とし,飛び先文になりうる(8.2 参照)。END PROGRAM 文を実行すると,プロ

グラムの実行が終了する。END FUNCTION 文 又は END SUBROUTINE 文の実行は,

スカラ整数式をもたない

RETURN

文の実行と等価とする。

END MODULE

文 及び END BLOCK DATA 文は,非実行文とする。

2.3.4

実行系列

プログラムが一つの Fortran 主プログラムを含むとき,そのプログラムの実行は,主プログラムの最初の実行構文

から始まる。主プログラム 又は 副プログラムの実行は,その有効域中の実行構文の実行を意味する。手続が呼び出さ

れたときは,呼び出された入口点に続く最初の実行構文から実行が始まる。次の例外を除いて,実行の効果は,STOP

文,RETURN 文 又は END 文が実行されるまで,実行構文が主プログラム 又は 副プログラムに書かれている順序

に従って実行されることとする。例外は,次のとおりとする。

(1)

飛越し文(8.2 参照)の実行は,実行系列を変更する。飛越し文は,実行系列の新しい開始位置を明示的に指定

する。

(2) CASE

構文,DO 構文,IF 構文 及び SELECT TYPE 構文は,内部的な文構造を含み,これらの構造構文の実

行は,暗黙的に内部的な飛越しを伴う。これらのそれぞれの構造構文の詳細な意味規則は,箇条 による。

(3) END

指定子,ERR 指定子 及び EOR 指定子は,飛越しを起こすことがある。

(4)

選択戻り指定子は,飛越しを起こすことがある。

内部副プログラムを主プログラム 又は 副プログラムの END 文の前に書くことができる。そのような内部副プロ

グラムの定義は,親プログラムの実行系列には含まれない。


14

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

プログラムの実行は,STOP 文 又は END PROGRAM 文が実行されることによって正常終了する。また,連携処

理系(言語 C の国際規格 5.1.2.2.3 及び 7.20.4.3 参照)で定義された手続の実行中に正常終了することもある。正

常終了が Fortran のプログラム単位の中で発生し,かつ そのプログラムが連携処理系で定義された手続を組み込んで

いるとき,実行終了の処理は C の関数 exit()(言語 C の国際規格 7.20.4.3 参照)を実行する効果をもつ。

2.4

データの概念

データ環境の特性を指定するために,非実行文を用いる。データ環境の特性の指定には,変数の型を指定すること,

配列を宣言すること 及び 新しい型を定義することが含まれる。

2.4.1

型 (type) は,データの分類に名前を付けたものであり,値の集合,その値を記述する構文,及び その値を解釈し

操作する演算の集合で特性付けられる。この中心的な概念は,4.1 による。

型は,パラメタ付けすることができ,パラメタ付けした場合には,データ値の集合,それらの値を記述する構文 及

び 演算の集合は,一つ以上のパラメタの値に依存する。そのようなパラメタを,型パラメタ (type parameter) と呼

ぶ(4.2 参照)。

型は,組込み型 及び 派生型の二つに大別される。

2.4.1.1

組込み型

組込み型 (intrinsic type) は,演算とともにこの言語で定義されている型とし,いつでも参照できる。組込み型は,

整数型 (INTEGER),実数型 (REAL),複素数型 (COMPLEX),文字型 (CHARACTER) 及び 論理型 (LOGICAL) とする。組込

み型の性質は,4.4 による。組込み型の型パラメタは,種別型パラメタ (KIND) 及び 文字長パラメタ (LEN) とする。

種別型パラメタ (kind type parameter) は,整数型では 10 進指数範囲を示し(4.4.1 参照),実数型 及び 複素数型

では 10 進精度 及び 10 進指数範囲を示し(4.4.2 及び 4.4.3 参照),文字型 及び 論理型では表現方法を示す(4.4.4

及び 4.4.5 参照)。文字長パラメタ (character length parameter) は,文字型における文字の個数を指定する。

2.4.1.2

派生型

派生型 (derived type) は,この言語では定義されていない型とし,その成分を宣言するために型定義を必要とする。

そのような派生型のスカラ実体を 構造体 (structure) と呼ぶ(5.1.1.1 参照)。派生型は,パラメタ付けすることがで

きる。構造体の代入は,組込みとして規定しているが(7.4.1.3 参照),構造体のための組込み演算は規定しない。そ

れぞれの派生型では,構造体構成子によって値を用意することができる(4.5.9 参照)。更に,派生型のデータ実体は,

手続の引数 及び 関数の結果として使用することができ,入出力項目並び中に書くこともできる。派生型のための演

算を追加する場合には,手続の定義として与えなければならない。

派生型は,4.5 で更に規定する。

2.4.2

データの値

それぞれの組込み型は,その型パラメタの値に応じて,その型のデータがもつことのできる値の集合と関連付けら

れている。それぞれの組込み型の値は,4.4 による。派生型の実体がとることのできる値は,その型定義,型パラメ

タ値 及び その成分の値の集合によって決定される。

2.4.3

データ要素

データ要素 (data entity) は,データ実体,式の評価の結果 及び 関数引用の実行の結果(関数結果と呼ぶ。)とす

る。データ要素は,型 及び 型パラメタをもち,不定の変数でなければデータの値をもつ。すべてのデータ要素は,次

元数をもち,したがってスカラ 又は 配列とする。

2.4.3.1

データ実体

データ実体 (data object) は,定数(4.1.2 参照),変数(箇条 参照)及び 部分定数とし,省略して 実体 (object)

と呼ぶことがある。名前付きデータ実体の型 及び 型パラメタは,明示的に(5.1 参照)又は 暗黙的に(5.3 参照)指

定することができる。


15

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

部分実体 (subobject) は,名前付き実体の一部分とし,他の部分とは独立に引用することができ,変数の場合には

他の部分とは独立に確定することもできる。部分実体には,配列の一部分すなわち配列要素 及び 部分配列,文字列

の一部分すなわち部分列,複素数実体の一部分すなわち実部 及び 虚部,並びに 構造体の一部分すなわち成分が含ま

れる。部分実体はそれ自体もデータ実体とするが,部分実体は実体特定子 及び 組込み関数によってだけ参照される。

変数の部分実体は,変数とする。部分実体は,箇条 による。

名前によって参照される実体は,次のとおりとする。

名前付きスカラ

(スカラ実体)

名前付き配列

(配列実体)

部分実体特定子によって参照される部分実体は,次のとおりとする。

配列要素

(スカラ部分実体)

部分配列

(配列部分実体)

構造体成分

(スカラ部分実体 又は 配列部分実体)

部分列

(スカラ部分実体)

複素数実体の部分実体は,組込み関数によっても参照することができる。

2.4.3.1.1

変数

変数 (variable) は,値をもつことができ,プログラムの実行の間に,確定したり再確定したりすることができる。

モジュール,主プログラム 及び 副プログラムの有効域にある名前付き局所変数 (local variable) は,その有効域

の局所要素である名前付き変数とする。その名前付き局所変数は,仮引数ではなく,COMMON 文の中にも現れず,

BIND

属性ももたず,参照結合 及び 親子結合で参照されることもない。名前付き局所変数の部分実体も,局所変数

とする。

2.4.3.1.2

定数

定数 (constant) は,値をもち,プログラムの実行の間に確定したり再確定したり不定にしたりすることはできな

い。名前をもつ定数は,名前付き定数 (named constant) と呼び,PARAMETER 属性をもつ(5.1.2.10 参照)。名前

をもたない定数は,定数表現 (literal constant) と呼ぶ(4.4 参照)。

2.4.3.1.3

部分定数

部分定数 (subobject of a constant) は,定数の一部分とする。引用される部分は,変数の値に依存してもよい。





例 2.3

変数の値に依存する部分定数

CHARACTER (LEN = 10), PARAMETER :: DIGITS = ’0123456789’

CHARACTER (LEN = 1)

:: DIGIT

INTEGER :: I

...

DIGIT = DIGITS (I:I)

DIGITS

は名前付き定数であり,DIGITS(I:I) は DIGITS の部分定数を特定する。





2.4.3.2

式 (expression) は,評価されるとデータ要素を生成する(7.1 参照)。式は,データ引用 又は 計算処理を表現する

ものであり,演算対象,演算子 及び 括弧からなる。式の結果の型,型パラメタ,値 及び 次元数は,箇条 の規則

による。

2.4.3.3

関数引用

関数引用 (function reference) は,式の評価の間に関数を実行してデータ要素を生成する(12.4.2 参照)。関数結果

の型,型パラメタ 及び 次元数は,その関数の引用仕様によって決定される(12.2.2 参照)。関数結果の値は,その


16

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

関数の実行によって決定される。

2.4.4

スカラ

スカラ (scalar) は,配列でないデータとする。スカラは,いかなる組込み型 又は 派生型でもありうる。スカラの

次元数 (rank) は,ゼロとする。スカラの形状は,大きさゼロの 1 次元配列によって表現される。





注記 2.4

構造体は,成分として配列をもっていてもスカラとする。





2.4.5

配列

配列 (array) は,すべてが同じ型 及び 同じ型パラメタをもつスカラデータの集合とし,それらの要素を四角い形に

配置したものとする。配列要素 (array element) は,配列中の個々の要素の一つとし,スカラとする。部分配列 (array

section)

は,配列の一部の要素からなる部分集合とし,それ自体も配列とする。

配列は,7 次元までの次元をもつことができ,どの次元も任意の 寸法 (extent),すなわち要素の個数をもつことが

できる。配列の 次元数 (rank) は,次元の個数とする。配列の 大きさ (size) は,要素の総数とし,寸法の積に等しい。

配列は,大きさがゼロであってもよい。配列の 形状 (shape) は,その次元数 及び 各次元の寸法によって決定され,そ

れらの寸法を要素とする 1 次元配列として表現することができる。名前付き配列はすべて宣言しなければならず,名

前付き配列の次元数はその宣言で指定される。名前付き配列の次元数は,いったん宣言されると一定であるが,寸法

は一定であってもよいし,実行中に変化してもよい。

二つの配列は,同じ形状をもつとき,形状適合 (conformable) であるという。スカラは,任意の配列に形状適合し

ているとみなす。スカラ実体に対して定義されている組込み演算は,形状適合する実体間にも適用できる。そのよう

な演算は,要素同士に実行することによって,演算対象の配列に形状適合する配列の結果を生成する。要素同士の演

算とは,演算対象の配列中の対応する要素同士がスカラ演算されて結果の配列中の対応する要素を生成し,そのよう

な要素ごとの演算がいかなる順序で実行されても同時に実行されてもよいことを意味する。このような演算を要素別

処理演算 (elemental operation) という。

1

次元配列は,スカラ 及び 他の配列から構成することができ,許されるどのような形状の配列にも変形すること

ができる(4.7 参照)。

配列は,いかなる組込み型 又は 派生型でもありうる。配列は,6.2 で更に規定する。

2.4.6

ポインタ

データポインタ (data pointer) は,POINTER 属性をもつデータ要素とする。手続ポインタ (procedure pointer)

は,POINTER 属性をもつ手続要素とする。ポインタ (pointer) は,データポインタ 又は 手続ポインタのいずれか

とする。

ポインタは,ポインタ代入(7.4.2 参照)によって 指示先 (target) と結合されて 指示状態 (pointer associated) に

なる。データポインタは,割付け(6.3.1 参照)によって指示先と結合されて指示状態になってもよい。ポインタは,

NULLIFY

文の実行の結果として,空状態のポインタとのポインタ代入の結果として,暗黙的初期値指定によって,

又は 明示的初期値指定によって 空状態 (disassociated) になる。データポインタは,DEALLOCATE 文の実行によっ

ても, 空状態 (disassociated) になることがある。空状態のポインタは,指示先と結合していない(16.4.2 参照)。

結合していないポインタは,引用も確定もしてはならない。

データポインタが配列であるときは,次元数は宣言されるが,寸法はそのポインタが指示先と結合した時に決まる。

2.4.7

記憶場所

この規格で定める多くの機能は,データ実体の記憶場所の物理的な特性を何も想定していない。しかし,記憶列結

合に依存する事項を含むプログラム単位は,16.4.3 で規定する記憶域の制約を守らなければならない。

2.5

基本用語

この規格の目的のために,この箇条で用語を定義する。


17

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

2.5.1

名前 及び 特定子

名前 (name) は,プログラム単位,名前付き変数,名前付き定数,仮引数,派生型などの,プログラムの構成要素

を識別するために用いる。名前の構成を規定する規則は,3.2.1 による。特定子 (designator) は,ゼロ個以上の成分

選択子,部分配列選択子,配列要素選択子 又は 部分列選択子を続けたものとする。

実体特定子 (object designator) は,データ実体に対する特定子とする。手続特定子 (procedure designator) は,手

続に対する特定子とする。





注記 2.5

実体名は,実体特定子の特別な場合である。





2.5.2

キーワード

キーワード (keyword) という用語は,次の 2 通りに用いる。

(1)

文の構文規則に現れる単語をつづるために用いる。それらのキーワードは,予約語ではない。すなわち,同じつ

づりをもった名前が許される。構文規則では,そのようなキーワードをつづりどおりに書く。規格中で,この意味

の用語は,修飾語を付けずに “キーワード” と書く。キーワードの例としては,IF,READ,UNIT,KIND,INTEGER

などがある。

(2)

並びにある項目を名前で識別するために用いる。それらの項目は,実引数並び,型パラメタ並び 及び 構造体構

成子の中で,並び中の位置による代わりに,先行する “キーワード=” によって識別してよい。引数キーワード

(argument keyword)

は,引用される手続の引用仕様内の仮引数名とする。型パラメタキーワード (type parameter

keyword)

は,指定される型の型パラメタ名とする。成分キーワード (component keyword) は,構造体構成子の

成分名とする。

R215

キーワード

is

名前





注記 2.6

並びの中で位置によって項目を識別するよりも,キーワードを使用したほうが読みやすく,並び

中の順序を変えることもできる。これによって,並びの宣言の一部の項目を省略することもできる。





2.5.3

結合

結合 (association) は,名前結合(16.4.1 参照),ポインタ結合(16.4.2 参照),記憶列結合(16.4.3 参照)又は

継承結合(16.4.4 参照)のいずれかとする。名前結合は,引数結合,親子結合,参照結合,他言語結合 又は 構文結

合のいずれかとする。

記憶列結合は,異なる要素に同じ記憶場所を使用させる。どの結合も,一つの要素を,同じ有効域内での異なる名

前によって識別したり,異なる有効域内での同じ名前 又は 異なる名前によって識別したりできるようにする。

2.5.4

宣言

宣言 (declaration) という用語は,いろいろな言語要素の属性の指定に対して用いる。多くの場合,これは,名前付

きデータ実体の型を指定するか,又は 名前付き配列実体の形状を指定する。

2.5.5

定義

定義 (definition) という用語は,次の 2 通りに用いる。

(1)

派生型の宣言 及び 手続の宣言を意味する。

(2)

プログラムの実行中に有効な値が実体に与えられることとし,このときその実体は 確定 (defined) になるという。

これは,しばしば代入文 又は 入力文の実行によってなされる。変数が想定できるような値をもたないとき,そ

のような変数は,不定 (undefined) であるという。同様に,ポインタが指示先と結合するか,又は 空状態になる

とき,そのポインタの結合状態は 確定 (defined) になるという。ポインタの結合状態が想定できない状態のとき,

そのポインタの結合状態は不定 (undefined) であるという。


18

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

変数が確定になったり不定になったりする要因は,箇条 16 による。

2.5.6

引用

データ実体引用 (data object reference) とは,実行中のその時点での値を要求する形でデータ実体特定子を書くこ

ととする。

手続引用 (procedure reference) とは,その時点での手続の実行を要求する形で手続特定子,演算子記号 又は 代入

記号を書くこととする。利用者定義の派生型入出力(10.6.5 参照)又は 利用者定義の派生型後始末(4.5.5.1 参照)

が行われることも,手続引用とする。

データ実体特定子 又は 手続特定子を実引数並び中に書いても,それは,その実引数の指定を完全にするために引

用が必要な場合を除いて,そのデータ実体 又は その手続の引用とはみなさない。

モジュール引用 (module reference) とは,USE 文にモジュール名を書くこととする(11.2.1 参照)。

2.5.7

組込み

組込み (intrinsic) という修飾語は,次の 2 通りの意味をもつ。

(1)

修飾された用語の表す言語要素がこの規格中で定義されていることを意味する。“組込み” は,型,手続,代入

及び 演算子を修飾する。すべての組込み型,組込み手続,組込み代入 及び 組込み演算子は,どの有効域におい

ても何らの定義も指定もなしに使用することができる。組込みモジュールは,参照結合によって参照できる。こ

の規格中で定義されている組込み手続 及び 組込みモジュールは,それぞれ標準組込み手続 及び 標準組込みモ

ジュールと呼ばれる。

(2)

処理系が提供するが,この規格中で定義されていない手続 又は モジュールを修飾する(箇条 1314 及び 15.1

参照)。そのような手続 及び モジュールは,それぞれ非標準組込み手続 及び 非標準組込みモジュールと呼ぶ。

2.5.8

演算子

演算子 (operator) は,一つ(単項演算子の場合)又は 二つ(2 項演算子の場合)のデータ値すなわち演算対象

(operand)

に対する計算処理を指定する。この規格は,幾つかの組込み演算子(例えば,数値演算対象に対する算術

演算子 +,-,*,/ 及び **,論理演算対象に対する論理演算子 .AND.,.OR. など)を指定する。プログラム中で,演

算子を追加して定義することもできる(7.1.3 参照)。

2.5.9

列 (sequence) は,番号 12, . . . , n と 1 対 1 に対応させて順序付けられた集合とする。ここで,は,列の要素の

個数とする。列は,空であってもよい。空の列には,要素がない。

空でない列の要素を,1 番目の要素,2 番目の要素,… という。を列の要素の個数とするとき,番目の要素を

最後の要素という。空の列には,1 番目の要素も最後の要素もない。

2.5.10

連携処理系

処理系は,一つ以上の連携処理系をもつ。連携処理系 (companion processor) は,大域的なデータ 及び 手続を引

用したり確定したりできる,処理系依存の機構とする。連携処理系は,Fortran 以外の手段(12.5.3 参照)によって,

そのような言語要素を引用 及び 確定する機構であってもよい。その処理系は,その Fortran 処理系自体であっても,

他の Fortran 処理系であってもよい。二つ以上の連携処理系がある場合,Fortran 処理系がそれらの中から選択する

手段は,処理系依存とする。

手続が,その Fortran 処理系自体ではない連携処理系によって定義される場合,この規格は,その手続を定義する

C

関数を引用する。ただし,手続を言語 C によって定義する必要はない。





注記 2.7

連携処理系は,言語 C の国際規格に合致する機構であってもなくてもよい。

例えば,処理系は,言語 C の国際規格の 6.7.5.3 で規定している C 原型で記述することができる

限り,Fortran 及び C 以外の言語で定義された手続を呼び出してもよい。






19

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

3

文字,構文素 及び プログラム形式

箇条 では,Fortran 文字集合,及び 名前,演算子などの様々な構文素を規定する。更に,Fortran プログラムの

形式の規則についても規定する。

3.1

処理系の文字集合

処理系の文字集合は,処理系依存とする。処理系の文字集合の構成は,次のとおりとする。

(1)

制御文字 (control character)

(2)

図形文字 (graphic character)

(a)

英字(3.1.1 参照)

(b)

数字(3.1.2 参照)

(c)

下線(3.1.3 参照)

(d)

特殊文字(3.1.4 参照)

(e)

その他の文字(3.1.5 参照)

Fortran

文字集合 (Fortran character set) は,英字,数字,下線 及び 特殊文字からなる。

R301

文字

is

英数字下線

or

特殊文字

R302

英数字下線

is

英字

or

数字

or

下線

文字として使用する図形は,通貨記号を除いて,3.1.13.1.23.1.3 及び 3.1.4 で規定してあるものでなければ

ならない。しかし,図形の様式は,定義しない。

基本文字型は,Fortran 文字集合を包含する文字集合を提供しなければならない。処理系は,基本文字型でない文

字型を提供することによって,追加の文字集合を提供してもよい。ASCII 及び ISO 10646 文字集合で利用可能な文

字は,それぞれ JIS X 0201-1997 及び JIS X 0221-1 : 2001 UCS-4 で規定されている。他の基本文字型でない文

字型で利用可能な文字については,この規格では規定しない。ただし,基本文字型でない文字型においても,処理系

は,空白詰めのための空白文字として一つの文字を特定しておかなければならない。

3.1.1

英字

26

個の 英字 (letter) は,次のとおりとする。

A B C D E F G H I J K L M N O P Q R S T U V W X Y Z

英字の集合は,構文概念としての英字を定義する。処理系の文字集合には,英小文字 及び 英大文字を含まなけれ

ばならない。英小文字は,プログラム中の文字文脈(3.3 参照)の中を除いて,対応する英大文字と等価とする。





注記 3.1

次に示す文は等価である。

CALL BIG_COMPLEX_OPERATION (NDATE)

call big_complex_operation (ndate)

Call Big_Complex_Operation (NDate)





3.1.2

数字

10

個の 数字 (digit) は,次のとおりとする。

0 1 2 3 4 5 6 7 8 9

これらは,構文概念としての数字を定義する。


20

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

3.1.3

下線

下線は,名前において意味のある文字として使用することができる。

R303

下線

is

3.1.4

特殊文字

特殊文字 (special character) は,

表 3.1 のとおりとする。

表 3.1―特殊文字

文字

文字の名称

文字

文字の名称

空白

;

セミコロン

=

等号

!

感嘆符

+

正符号

"

引用符

-

負符号

%

パーセント記号

*

星印

&

アンド記号

/

斜線

~

チルド

\

逆斜線

<

小記号

(

左括弧

>

大記号

)

右括弧

?

疑問符

[

左角括弧

アポストロフィ

]

右角括弧

低アクセント

{

左波括弧

^

山記号

}

右波括弧

|

縦線

,

コンマ

$

通貨記号

.

小数点 又は ピリオド

#

番号記号

:

コロン

@

単価記号

特殊文字は,構文概念として特殊文字を定義する。特殊文字の幾つかは,演算子,括弧類,他の構文素の区切り記

号などとして使用する。

3.1.5

その他の文字

処理系によっては,その他の文字が表現可能であってもよいが,注釈 (3.3.1.13.3.2.1),文字定数 (4.4.4),入出

力記録 (9.1.1) 及び 文字列編集記述子 (10.2.1) にだけ指定することができる。

3.2

低水準構文

低水準構文 (low-level syntax) は,プログラム単位の基本的な構文素を規定する。構文素 (lexical token) は,プロ

グラムを構成する要素としての文字の列とする。構文素は,キーワード,名前,複素定数表現以外の定数表現,演算

子,文番号,括弧類,コンマ,=,=>,:,::,; 及び % とする。

3.2.1

名前

名前 (name) は,変数,プログラム単位,仮引数,名前付き定数,派生型などの各種の言語要素に使用する。

R304

名前

is

英字 [ 英数字下線 ] ...

C301

(R304)

名前の最大の長さは,63 文字とする。


21

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 3.2

名前の例

A1

NAME_LENGTH

(一つの下線)

S_P_R_E_A_D__O_U_T

(二つの連続する下線)

TRAILER_

(最後の下線)





注記 3.3

名前” という用語は,いつもこの特定の構文形式を示している。“識別子” という用語は,言語

要素が他の構文形式 又は 値によって識別される箇所で使う。その特定の意味は,使われる文脈に依

存する。





3.2.2

定数

R305

定数

is

定数表現

or

名前付き定数

R306

定数表現

is

整定数表現

or

実定数表現

or

複素定数表現

or

論理定数表現

or

文字定数表現

or

非 10 進定数表現

R307

名前付き定数

is

名前

R308

整定数

is

定数

C302

(R308)

整定数は,整数型でなければならない。

R309

文字定数

is

定数

C303

(R309)

文字定数は,文字型でなければならない。

3.2.3

演算子

R310

組込み演算子

is

べき乗演算子

or

乗除演算子

or

加減演算子

or

連結演算子

or

関係演算子

or

否定演算子

or

論理積演算子

or

論理和演算子

or

論理等否演算子

R707

べき乗演算子

is

**

R708

乗除演算子

is

*

or

/

R709

加減演算子

is

+


22

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

or

-

R711

連結演算子

is

//

R713

関係演算子

is

.EQ.

or

.NE.

or

.LT.

or

.LE.

or

.GT.

or

.GE.

or

==

or

/=

or

<

or

<=

or

>

or

>=

R718

否定演算子

is

.NOT.

R719

論理積演算子

is

.AND.

R720

論理和演算子

is

.OR.

R721

論理等否演算子

is

.EQV.

or

.NEQV.

R311

利用者定義演算子

is

利用者定義単項演算子

or

利用者定義 2 項演算子

or

拡張組込み演算子

R703

利用者定義単項演算子

is

.

英字 [ 英字 ] ... .

R723

利用者定義 2 項演算子

is

.

英字 [ 英字 ] ... .

R312

拡張組込み演算子

is

組込み演算子

3.2.4

文番号

文番号は,個々の文を参照する手段を与える。

R313

文番号

is

数字 [ 数字 [ 数字 [ 数字 [ 数字 ] ] ] ]

C304

(R313)

文番号の少なくとも一つの数字は,0 以外でなければならない。

文が文番号をもつとき,その文は,空白以外の文字を含まなければならない。一つの有効域中の二つ以上の文に対

して,同じ文番号を与えてはならない。先行する数字 0 は,文番号を区別する上では意味がない。


23

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 3.4

次の三つの文番号のうち,後の二つは等価になる。

99999

10

010

文番号は 99999 種類あり,処理系は,それらのいずれをも文番号として受け入れなければならない。

しかし,処理系は,一つのプログラム単位中の異なる文番号の個数について,実装上の制限をもって

もよい。





幾つかの文は,文番号をもつ。文番号は,次の場合にだけ利用できる。

(1)

飛び先文(8.2 参照)の文番号は,その文が分岐可能な飛び先であることを識別するために用いる。

(2) FORMAT

文(10.1.1 参照)の文番号は,その文がデータ転送文(9.5 参照)に対する書式仕様であることを識

別するために用いる。

(3) DO

構文(8.1.6 参照)の幾つかの形において,DO 構文の範囲は,その範囲内にある最後の文の文番号によって

識別される。

3.2.5

括弧類

括弧類 (delimiter) は,構文並びをくくるために使用する。次の組は,括弧類とする。

(

…… )

/

…… /

[

…… ]

(/

…… /)

3.3

プログラム形式

プログラム単位は,Fortran の文,注釈 及び INCLUDE 行から構成される一つ以上の行の列とする。文 (statement)

は,一つ以上の完全な行 又は 部分的な行の列とする。行 (line) は,任意の文字の列とする。プログラム単位の END

文に続く行は,そのプログラム単位に含まれない。

文字文脈 (character context) とは,文字定数表現 (4.4.4) 又は 文字列編集記述子 (10.2.1) の中の文字とする。

注釈は,任意の文字文脈に指定できる任意の文字を含んでもよい。

自由形式

及び 固定形式の二つ

の プログラム形式 (source form) を定める。

自由形式 及び 固定形式は,一つのプログラム単位中で混在させ

てはならない。プログラム単位のプログラム形式を指定する方法は,処理系依存とする。

3.3.1

自由形式

自由形式 (free source form) では,一つの文(又は 文の一部)は,一つの行中のどこに書いてもよい。一つの行に,

文字を一つも含まなくてもよい。一つの行が基本文字型の文字 (4.4.4) だけで構成されるとき,その行には最大 132

個の文字を含むことができる。一つの行に基本文字型でない文字を含むとき,その行に書くことができる最大の文字

数は,処理系依存とする。

文字文脈 及び 書式仕様中を除き,一つの構文素の途中に空白文字を書いてはならない。空白は,読みやすくする

ために,構文素の間に自由に挿入できる。例えば,複素定数表現を形成する構文素の間に空白を挿入してもよい。文

字文脈以外での空白列は,一つの空白文字と等価とする。

名前,定数 又は 文番号を,隣接するキーワード,名前,定数 又は 文番号から分離するために,これらの間には空

白を挿入しなければならない。


24

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 3.5

次の REAL,READ,30 及び DO の後ろに空白が必要である。

REAL X

READ 10

30 DO K=1,3





隣接するキーワードの間には,一つ以上の空白を用いなければならない。ただし,次の場合は空白が省略できる。

分離のための空白が省略できるキーワード

BLOCK DATA

DOUBLE PRECISION

ELSE IF

ELSE WHERE

END ASSOCIATE

END BLOCK DATA

END DO

END ENUM

END FILE

END FORALL

END FUNCTION

END IF

END INTERFACE

END MODULE

END PROGRAM

END SELECT

END SUBROUTINE

END TYPE

END WHERE

GO TO

IN OUT

SELECT CASE

SELECT TYPE

3.3.1.1

自由形式での注釈

文字 “!” は,それが文字文脈中に指定される場合を除いて,注釈 (comment) の開始とする。注釈は,行の終わり

までとする。行の空白でない最初の文字が “!” であるとき,その行は,注釈行とする。空白だけの行 及び 文字を含

まない行も,注釈行とする。注釈は,プログラム単位中の任意の場所にあってもよく,プログラム単位の最初の文よ

り前にあってもよいし,プログラム単位の最後の文より後ろにあってもよい。注釈は,プログラム単位の解釈に影響

を与えない。





注記 3.6

連続する注釈行の行数に制限はない。





3.3.1.2

自由形式での文の継続

文字 “&” は,現在の行を注釈行でない次の行に継続することを示す。注釈行は,継続することができない。つまり,

注釈の中の “&” は,効果をもたない。継続された文(前の行)の中に注釈を書いてもよい。“&” は,継続として使用

するとき,文の一部ではない。空白でない文字が一つの “&” だけの行,又は 注釈の開始を示す “!” の前の空白でな

い文字が一つの “&” だけの行を書くことはできない。

文字文脈でない部分を継続する場合,“&” は,その行の空白でない最後の文字であるか,又は “!” の前の空白でな

い最後の文字であるかのいずれかでなければならない。このとき,注釈行でない後続の行がなければならず,文はそ

の後続の行に継続する。その行の空白でない最初の文字が “&” のとき,文はその “&” に続く次の文字位置に継続し,

それ以外のとき,その行の最初のけたに継続する。

構文素が行の終わりで分断されるとき,注釈行でない次の行の空白でない最初の文字は,“&” でなければならず,そ

の直後に分断された構文素の続きの文字を書かなければならない。

文字文脈を継続する場合,“&” は,その行の空白でない最後の文字でなければならず,注釈を続けてはならない。

このとき,注釈行でない後続の行がなければならず,その後続の行の空白でない最初の文字は,“&” でなければなら

ない。また,その文は,その “&” に続く文字に継続する。


25

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

3.3.1.3

自由形式での文の終了

文が継続しない場合,注釈 又は 行の終わりで,その文は終了する。

文は,文字文脈の中 又は 注釈の中以外に現れる文字 “;” で終了してもよい。その “;” は,文の一部ではない。文

末記号 “;” の後に,他の文が同じ行に現れてもよいし,その行で始まって継続してもよい。文末記号 “;” は,行中の

空白でない最初の文字であってはならない。文末記号 “;” の後ろに 0 個以上の空白 及び 1 個以上の “;” が続く場合,

順序にかかわらず,それらは一つの文末記号 “;” と等価とする。

3.3.1.4

自由形式での文

文番号は,他の文の部分とならない任意の文の前に付けることができる。





注記 3.7

数字で始まる Fortran の文はない。





文は,255 行を超える継続行をもってはならない。

3.3.2

固定形式

固定形式

(fixed source form)

では,一つの行の中で一つの文を書くことのできる位置には制約がある。一つの行が基本文字型の文字だけを含むとき,それはちょ

うど

72

文字でなければならない。それ以外のとき,文字の最大数は,処理系依存とする。

文字文脈以外では,空白は,意味をもたず,プログラム内のあらゆるところで自由に使用してよい。

3.3.2.1

固定形式での注釈

文字

“!”

は,文字文脈の中 又は 第

6

けたに現れる場合を除いて,注釈

(comment)

の開始とする。注釈は,その行の終わりまでとする。行の空白でない最初の

文字が,第

6

けた以外の任意のけたに現れた

“!”

であるとき,その行は注釈行とする。 第

1

けたが

“C”

又は

“*”

で始まる行 及び 空白だけからなる行も,注釈行

とする。注釈は,プログラム単位の任意の場所に現れてもよく,プログラム単位の最初の文の前又は 最後の文の後ろに現れてもよい。注釈は,プログラム単位の解釈

に影響を与えない。





注記 3.8

連続する注釈行の行数に制限はない。





3.3.2.2

固定形式での文の継続

注釈の中を除き,第

6

けたは,継続を示すために使用する。第

6

けたが空白 又は 数字

0

であるとき,その行は,第

7

けたから始まる新しい文の開始行とする。

6

けたが空白でもなく数字

0

でもないとき,その行の第

7

72

けたは,先行する注釈でない行の継続行とする。





注記 3.9

6

けたの

“!”

又は

“;”

は,第

1

けたの

“C”

若しくは

“*”

,又は 第

1

5

けたの

“!”

によって指示される注釈中に現れた場合以外

は,継続の指示として解釈する

)





注釈行は,継続することができない。注釈は,継続される文(前の行)の中に書いてもよい。

3.3.2.3

固定形式での文の終了

文が継続しない場合,注釈 又は 行の終わりで,その文は終了する。

文は,文字文脈の中,注釈の中 又は 第

6

けた以外に現れる文字

“;”

で終了してもよい。その

“;”

は,文の一部ではない。文末記号

“;”

の後に,他の文が同じ行

に現れてもよいし,その行で始まって継続してもよい。文末記号

“;”

は,第

6

けたに現れる場合を除いて,行中の空白でない最初の文字であってはならない。

0

個以

上の空白 及び

1

個以上の

“;”

が続く場合,順序にかかわらず,それらは一つの文末記号

“;”

と等価とする。

3.3.2.4

固定形式での文

文に文番号を付けるときは,文番号は,文の最初の行の第

1

5

けたに付けなければならない。付けないときは,第

1

5

けたは,空白でなければならない。空白

は,文番号の中のどこに挿入してもよい。一つの行の中で

“;”

に続く文は,文番号をもつことができない。すべての継続行の第

1

5

けたは,空白でなければならな

い。文は,

255

を超える継続行をもってはならない。プログラム単位の

END

文は,継続してはならない。文を継続することによって,プログラム単位の

END

文で

あるとみなせるような開始行を書いてはならない。

3.4

文字列の取込み


26

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

処理系の動作中に,プログラム単位の文字列の中に別の文字列を取り入れることができる。これは,次の形の INC

LUDE

行 (INCLUDE line) によって実現する。

INCLUDE

文字定数表現

文字定数表現には,名前付き定数である種別型パラメタ値を指定してはならない。

INCLUDE

行は,Fortran の文ではない。

INCLUDE

行は,文を置くことのできる場所に 1 行で書かなければならない。INCLUDE 行は,省略可能な後続の

注釈を除いて,その行の空白でないただ一つの文字列でなければならない。したがって,文番号を付けてはならない。

INCLUDE

行の効果は,プログラムの処理に先立って,参照された文字列がその INCLUDE 行を物理的に置き換え

たものと同じとする。取り込まれる文字列は,任意のものを含んでよく,更に INCLUDE 行を含んでいてもよい。その

ような入れ子になった INCLUDE 行は,指定した文字列で同様に置き換えられる。入れ子になったときの INCLUDE

行の入れ子の最大の深さは,処理系依存とする。INCLUDE 行によって引用される文字列は,すべての入れ子のレベ

ルにおいて,結果として同じ文字列を取り込んではならない。

INCLUDE

行が解決されるとき,取り込まれる最初の文の行は,継続行であってはならず,取り込まれる最後の文

の行は,継続してはならない。

文字定数表現の解釈は,処理系依存とする。解釈可能で有効な一つの例として,文字定数表現は,取り込まれる文

字列を含むファイルの名前とすることが考えられる。





注記 3.10

ある状況では,

INCLUDE

行で引用するファイル中に保持されているプログラム部分を,固定形式 又は 自由形式のいずれのプログラ

ム形式からも使用したいことがある。その場合,次の規則を守れば,そのプログラム部分はいずれの形式からも使用することができる。

(1)

文番号は,第

1

5

けたに書き,文は,第

7

72

けたに書く。

(2)

空白は,意味があるものとして扱う。

(3)

注釈の指示には,感嘆符

“!”

だけを使用する。しかも,第

6

けたで注釈を開始しない。

(4)

文が継続するときは,継続される行の第

73

けた 及び 継続する行の第

6

けたの両方にアンド記号

“&”

を書く。





4

Fortran

は,特定の物理的表現によらずにデータを分類する抽象的手段を提供する。この抽象的手段は,型 (type)

の概念とする。

組込み型は,この言語で定められている。組込み型は,整数型,実数型,複素数型,文字型 及び 論理型とする。

派生型は,派生型定義(4.5.1 参照)で定義される。

派生型は,その定義が参照可能な場所でだけ使用できる(4.5.1.1 参照)。組込み型は,どこででも参照可能とする。

型は,型指定子 (type specifier) によって,複数の文脈で指定される。

R401

型指定子

is

組込み型指定子

or

派生型指定子

C401

(R401)

派生型指定子には,抽象型(4.5.6 参照)を指定してはならない。

4.1

型の概念

型は,名前,有効な値の集合,その値の記述方法(定数),及び その値を操作する演算の集合をもつ。





注記 4.1

例えば,論理型は,二つの値からなる集合をもち,それらの値は構文素 .TRUE. 及び .FALSE.

で記述され,論理演算によって操作される。

より制限の少ない型の例として,整数型がある。整数型は,処理系依存の整数値の集合をもち,そ

れらの値は省略可能な符号に続く数字列で記述され,整数値の算術演算 及び 関係演算で操作される。





4.1.1

値の集合


27

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

それぞれの型は,有効な値の集合をもつ。有効な値の集合は,論理型のように完全に定義されるか 又は 整数型,文

字型 及び 実数型のように処理系依存の方法で定義される。複素数型のもつ有効な値の集合は,それぞれの成分の値

のすべての組合せの集合とする。派生型のもつ有効な値の集合は,4.5.7 で定める。

4.1.2

定数

それぞれの組込み型の定数表現の構文は,4.4 で規定する。

値を記述する構文は,その型,型パラメタ 及び 特定の値を示す。

定数値には,名前を付けることができる(5.1.2.10 及び 5.2.9 参照)。

派生型の定数値(4.5.9 参照)は,構造体構成子を用いて初期値式 (7.1.7) の適切な列から構成してもよい。この

ような定数値は,配列の成分をもっていてもスカラとみなす。

4.1.3

演算

それぞれの組込み型は,組込みとして定義されている演算 及び その演算に対応する演算子の集合をもつ。これらに

ついては,箇条 に定める。組込み演算 及び 組込み演算子の集合は,OPERATOR 引用仕様 (12.3.2.1) をもつ関数

によって定義される演算 及び 演算子を用いて拡張することができる。演算子の定義は,箇条 及び 12 で規定する。

派生型には,組込み演算は存在しない。派生型の演算は,プログラムで定義してもよい(4.5.10 参照)。

4.2

型パラメタ

型には,パラメタが指定できる。この場合,その型の値の集合,値を記述する構文 及び 値の演算の集合は,その

パラメタの値に依存する。

すべての組込み型には,パラメタが指定できる。派生型は,パラメタが指定できるように定義できる。

型パラメタは,種別型パラメタ 又は 長さ型パラメタのいずれかとする。

種別型パラメタは,派生型定義 (4.5.1) 内のその型に対する初期値式 及び 宣言式で使用できる。それは,総称の

解決 (16.2.3) に影響する。それぞれの組込み型は,KIND という名前の種別型パラメタをもつ。これによって,複数

の組込み型の表現を区別することができる。





注記 4.2

種別型パラメタの値は,翻訳時に分かる設計になっている。複数の表現形式を含んだパラメタ化

の幾つかは,実際の実装方法 及び 性能のために,翻訳時に区別できる必要がある。その例として,複

数の精度をもった組込み実数型 及び 実装可能な複数の文字集合をもった組込み文字型がある。

派生型の型パラメタは,種別型パラメタとして指定して,パラメタに基づいた総称の解決に用いて

もよい。つまり,仮引数の種別型パラメタ値によってだけ区別できる引用仕様をもつ二つの個別手続

への単一総称を許すことになる。総称は,翻訳時に解決されるように設計されている。





長さ型パラメタは,その型に対する派生型定義の中の宣言式で使用できるが,初期値式では使用してはならない。

組込み文字型は,文字列の長さを示す LEN という名前の長さ型パラメタをもつ。





注記 4.3

組込み文字型に関しては,長さを指定することが多いので,種別型パラメタ以外の型パラメタに

長さ” という単語を使う。しかし,長さ型パラメタを他の用途に使ってもよい。種別型パラメタとの

大きな違いは,長さ型パラメタの値は翻訳時に定まっている必要はなく,プログラム実行時に変わっ

てもよいということである。





型パラメタの値は,型定義 (4.4, 4.5.8) で指定できる。

R402

型パラメタ値

is

スカラ整数式

or

*

or

:


28

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C402

(R402)

種別型パラメタに対する型パラメタ値は,初期値式でなければならない。

C403

(R402)

型パラメタ値としての “:” は,POINTER 属性 又は ALLOCATABLE 属性をもつ要素 又は 成

分の宣言内でだけ使用できる。

無指定型パラメタは,プログラムの実行中にその値を変えることができる長さ型パラメタとする。型パラメタ値とし

ての “:” は,無指定型パラメタを指定する。

実体の無指定型パラメタの値は,ALLOCATE 文 (6.3.1) の実行,組込み代入文 (7.4.1.3) の実行,ポインタ代入

文 (7.4.2) の実行 又は 引数結合 (12.4.1.2) によって決定される。





注記 4.4

手続ポインタの場合も含め,関数の無指定型パラメタは,値をもたない。関数が割り付けられた

割付け関数結果 又は 結合ポインタの結果を返す場合,その関数の実行結果によって決定される。





引継ぎ型パラメタは,対応する実引数から型パラメタの値を引き継ぐ仮引数に対する長さ型パラメタとする。同様

に,対応する選択子から型パラメタの値を引き継ぐ SELECT TYPE 構成子内の結合名にも使われる。型パラメタ値

としての “*” は,引継ぎ型パラメタを指定する。

4.3

型 及び 値と実体との関連

型の名前は,型指定子として使われ,その型の実体を宣言するのに用いる。宣言では,名前付き実体の型を指定す

る。データ実体 は,明示的 又は 暗黙的に宣言できる。データ実体は,型のほかにも属性をもつことができる。箇条

5

では,データ実体を宣言する方法 並びに データ実体の型 及び その他の属性を指定する方法を定める。

任意の組込み型 又は 派生型のスカラデータは,四角い形に配置して,そのスカラデータと同じ型 及び 同じ型パ

ラメタをもつ配列を構成することができる。配列実体は,スカラ実体と同じ型 及び 同じ型パラメタをもつことがで

きる。

変数は,データ実体とする。変数の型 及び 型パラメタは,変数の取りうる値を定める。代入は,任意の型の変数の

値を確定 又は 再確定する。変数と変数に代入する値との,型,型パラメタ 及び 形状が同じ場合の代入は,すべての

型に対して組込み代入として定義されている。異なる組込み型,型パラメタ 又は 形状をもつ実体の間の代入は,箇

条 に定める。サブルーチン 及び 総称指定子が ASSIGNMENT(=) である総称引用仕様 (4.5.412.3.2.1) は,組込み

として定義されていない代入を定義するか,又は 派生型組込み代入 (7.4.1.4) を再定義する。





注記 4.5

例えば,整変数への実数値の代入は,組込みとして定義されている。





変数の型は,その変数を操作できる演算を決定する。

4.4

組込み型

組込み型は,次のとおりとする。

数値型:

整数型,実数型 及び 複素数型

非数値型: 文字型 及び 論理型

数値型 (numeric type) は,数値計算に用いることができる。数値型に対して,通常の算術演算である加算(+),減

算(-),乗算(*),除算(/),べき乗(**),同値(単項 +)及び 符号反転(単項 -)が,組込みとして定義され

ている。

R403

組込み型指定子

is

INTEGER [

種別型パラメタ選択子 ]

or

REAL [

種別型パラメタ選択子 ]

or

DOUBLE PRECISION

or

COMPLEX [

種別型パラメタ選択子 ]

or

CHARACTER [

文字選択子 ]


29

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

or

LOGICAL [

種別型パラメタ選択子 ]

R404

種別型パラメタ選択子

is

( [ KIND = ]

スカラ整数初期値式 )

C404

(R404)

スカラ整数初期値式の値は,負であってはならず,処理系に存在する表現方法を指定しなければ

ならない。

4.4.1

整数型

整数型 (integer type) のもつ値の集合は,数学的な整数の部分集合とする。処理系は,整数型データの値の集合を定

義する一つ以上の 表現方法 (representation method) を提供しなければならない。このような表現方法は,種別 (kind)

型パラメタと呼ばれる型パラメタの値によって特徴付けられる。種別型パラメタは,基本整数型とする。表現方法の

種別型パラメタは,問合せ組込み関数 KIND(13.7.59 参照)によって求めることができる。表現方法の 10 進指数範

囲は,組込み関数 RANGE(13.7.96 参照)で求めることができる。組込み関数 SELECTED INT KIND(13.7.105 参照)

は,指定された 10 進指数範囲に基づく種別値を返す。整数型は値ゼロをもつ。値ゼロは,正でも負でもない。符号

の付いたゼロの値は,符号のないゼロの値と同じとする。

整数型の型指定子は,キーワード INTEGER とする。

種別型パラメタの指定がない場合,暗黙の種別値は,KIND(0) とする。そのデータ要素の型は,基本整数型 (default

integer)

とする。

整数値は,任意符号付き整定数表現で表現する。

R405

任意符号付き整定数表現

is

[

符号 ] 整定数表現

R406

整定数表現

is

数字列 [

種別 ]

R407

種別

is

数字列

or

スカラ整定数名

R408

任意符号付き数字列

is

[

符号 ] 数字列

R409

数字列

is

数字 [ 数字 ] ...

R410

符号

is

+

or

-

C405

(R407)

スカラ整定数名は,整数型の名前付き定数でなければならない。

C406

(R407)

種別の値は,負であってはならない。

C407

(R407)

種別の値は,処理系に存在する表現方法を指定しなければならない。

整定数表現の数字列に続く省略可能の種別は,その整定数の種別型パラメタを指定する。種別を省略したとき,そ

の定数は,基本整数型とする。

整定数は,10 進数として解釈する。





例 4.6

任意符号付き整定数表現の例を示す。

473

+56

-101

21_2

21_SHORT

1976354279568241_8

ここで,SHORT はスカラ整定数名とする。






30

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

R411

非 10 進定数表現

is

2

進定数表現

or

8

進定数表現

or

16

進定数表現

R412

2

進定数表現

is

B’

数字 [ 数字 ] ...’

or

B"

数字 [ 数字 ] ..."

C408

(R412)

数字は,0 又は 1 のいずれかでなければならない。

R413

8

進定数表現

is

O’

数字 [ 数字 ] ...’

or

O"

数字 [ 数字 ] ..."

C409

(R413)

数字は,0∼7 のいずれかでなければならない。

R414

16

進定数表現

is

Z’16

進数字 [ 16 進数字 ] ...’

or

Z"16

進数字 [ 16 進数字 ] ..."

R415

16

進数字

is

数字

or

A

or

B

or

C

or

D

or

E

or

F

2

進定数表現,8 進定数表現 及び 16 進定数表現は,それぞれの記数法に従って解釈する。16 進数字 A∼ F は,そ

れぞれ 10∼15 を表し,英小文字で表してもよい。

C410

(R411)

非 10 進定数表現は,DATA 文の初期値定数として,数値組込み関数 DBLE,REAL 若しくは INT

の仮引数 A に結合する実引数として,又は 組込み関数 CMPLX の仮引数 X 若しくは Y と結合する実引数と

してだけ書くことができる。

4.4.2

実数型

実数型 (real type) は,数学的な実数値の近似値の集合をもつ。処理系は,実数型データの値の集合を定義する二つ以

上の 近似方法 (approximation method) を提供しなければならない。それぞれの近似方法は 表現方法 (representation

method)

をもち,種別 (kind) 型パラメタと呼ばれる型パラメタの値によって特徴付けられる。種別型パラメタは,基本

整数型とする。近似方法の種別型パラメタは,問合せ組込み関数 KIND (13.7.59) によって知ることができる。近似方

法の 10 進精度 及び 10 進指数範囲は,それぞれ組込み関数 PRECISION (13.7.90) 及び 組込み関数 RANGE (13.7.96)

で求めることができる。組込み関数 SELECTED REAL KIND (13.7.106) は,指定された 10 進精度 及び 10 進指数範囲

に基づく種別値を返す。





注記 4.7

近似方法の選択については,C.1.2 を参照。





実数型は値ゼロをもつ。正の値ゼロと負の値ゼロとを区別する処理系も,次の場合にはそれらを数学的に同値とし

て扱わなければならない。

(1)

関係演算式の中

(2)

負の値ゼロを区別して指定する手続を除く組込み手続への実引数

(3)

算術

IF

文中のスカラ数値式


31

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





注記 4.8

0.0

0.0 とを区別する処理系においては,次のとおりに評価する。

( X >= 0.0 )

は,X = 0.0 及び X =

0.0 のどちらに対しても .TRUE. とし,

( X < 0.0 )

は,X =

0.0 に対して .FALSE. である。

IF (X) 1,2,3

は,

X = 0.0

X =

0.0

のどちらの場合にも文番号

“2”

をもつ飛び先文に制御を移す。

0.0

0.0 を区別するためには,関数 SIGN を使うのがよい。SIGN(1.0,X) が 1.0 を返すのは,

0.0

のとき 及び 0.0 と

0.0 とを区別する処理系において X が値 0.0 をもつときである。





実数型の型指定子は,キーワード REAL とする。キーワード DOUBLE PRECISION は,実数型の一つの種別に対する

代替の型指定子とする。

型キーワード REAL が指定され,種別型パラメタの指定がない場合,暗黙の種別値は,KIND(0.0) とする。その指

定された型は,基本実数型 (default real) とする。型キーワード DOUBLE PRECISION を指定する場合,暗黙の種別値

は,KIND(0.0D0) とする。その指定された型は,倍精度実数型 (double precision real) とする。倍精度実数型の近似

方法の 10 進精度は,基本実数型の近似方法より精度が高くなければならない。

R416

任意符号付き実定数表現

is

[

符号 ] 実定数表現

R417

実定数表現

is

有効数字部 [ 指数部英字 指数部 ] [

種別 ]

or

数字列 指数部英字 指数部 [

種別 ]

R418

有効数字部

is

数字列 . [ 数字列 ]

or

.

数字列

R419

指数部英字

is

E

or

D

R420

指数部

is

任意符号付き数字列

C411

(R417)

種別 及び 指数部英字の両方の指定がある場合,指数部英字は E でなければならない。

C412

(R417)

種別の値は,処理系に存在する近似方法を指定しなければならない。

種別指定のない実定数表現は,指数部の指定がないか 又は 指数部英字が E の場合,基本実定数とする。指数部英

字が D の場合,倍精度実定数とする。種別型パラメタを指定して書いた実定数表現は,指定した種別型パラメタの実

定数とする。

指数部は,有効数字部 又は 数字列に乗じる 10 のべき乗を指定する。これらの定数の意味は,科学的 10 進表記法

による。

有効数字部に,実定数の値を近似するために処理系が使用する個数より多くの数字を書いてもよい。


32

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 4.9

任意符号付き実定数表現の例を示す。

-12.78

+1.6E3

2.1

-16.E4_8

0.45E-4

10.93E7_QUAD

.123

3E4

ここで QUAD は,スカラ整定数名とする。





4.4.3

複素数型

複素数型 (complex type) は,数学的な複素数値の近似値の集合をもつ。複素数型の値は,順序付けられた二つの

実数値の組とする。1 番目の実数値を 実部 (real part),2 番目の実数値を 虚部 (imaginary part) と呼ぶ。

複素数型のデータ要素の実部 及び 虚部のそれぞれに,実数型のデータ要素を表現する近似方法を適用する。種別

(kind)

型パラメタは,複素数型要素に指定してもよい。種別型パラメタは,実部 及び 虚部の両方に対してその種別

型パラメタの値によって定まる実数の近似方法を選択する。種別型パラメタは,基本整数型とする。近似方法の種別

型パラメタは,問合せ組込み関数 KIND (13.7.59) によって知ることができる。

複素数型の型指定子は,キーワード COMPLEX とする。倍精度複素数型を指定するキーワードは定めない。型キー

ワード COMPLEX が指定され,種別型パラメタの指定がない場合,暗黙の種別値は基本実数型の種別値と同じとし,実

部 及び 虚部の型は基本実数型とし,その指定された型は 基本複素数型 (default complex) とする。

R421

複素定数表現

is

(

実部 , 虚部 )

R422

実部

is

任意符号付き整定数表現

or

任意符号付き実定数表現

or

名前付き定数

R423

虚部

is

任意符号付き整定数表現

or

任意符号付き実定数表現

or

名前付き定数

C413

(R421)

複素定数表現中のそれぞれの名前付き定数は,整数型 又は 実数型でなければならない。

複素定数表現の実部 及び 虚部が両方とも任意符号付き実定数表現の場合,その複素定数の種別型パラメタ値は,10

進精度が高いほうの種別型パラメタ値とする。精度が同じ場合,どちらを選ぶかは処理系依存とする。選ばれた複素

定数の種別型パラメタと異なるほうの任意符号付き実定数表現は,選ばれた複素定数表現の近似方法によって変換さ

れる。

実部 及び 虚部が共に整定数表現の場合,それらは基本実数型の近似方法によって変換され,複素定数は基本複素

数型となる。一方だけが整定数表現の場合,その整定数表現はもう一方の実定数表現の近似方法によって変換され,

複素定数表現の種別型パラメタ値は,その実定数表現の種別型パラメタの値に等しくなる。


33

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 4.10

複素定数表現の例を示す。

(1.0, -1.0)

(3, 3.1E6)

(4.0_4, 3.6E7_8)

(0., PI)

ここで,PI はあらかじめ名前付き実数型定数として宣言されているものとする。





4.4.4

文字型

文字型 (character type) は,文字列からなる値の集合をもつ。文字列 (character string) は,文字の列とする。文字

列中の文字には,文字列の左から右に,1,2,3,... と文字の個数までの番号が付けられる。文字列の 長さ (length)

とは,文字列中の文字の個数とする。文字列の長さは型パラメタで指定し,その種別は処理系依存とし,その値は 0

以上とする。文字列は,長さが異なっていてもすべて文字型とする。

処理系は,文字型のデータの値の集合を定義する一つ以上の 表現方法 (representation method) を提供しなければ

ならない。それぞれの表現方法は,種別 (kind) 型パラメタと呼ばれる型パラメタの値によって特徴付けられる。種別

型パラメタは,基本整数型とする。ある表現方法の種別型パラメタは,問合せ組込み関数 KIND (13.7.59) によって

知ることができる。組込み関数 SELECTED CHAR KIND (13.7.104) は,文字型の名前に基づいた種別値を返す。処理系

で表現可能な特定の表現方法に属するどの文字も,その表現方法の文字列中に現れてよい。

JIS X 0201-1997

で定義される文字集合を,ASCII 文字集合 (ASCII character set) 又は ASCII 文字型 (ASCII

character type)

と呼ぶ。JIS X 0221-1 : 2001 UCS-4 で定義される文字集合を,ISO 10646 文字集合 (ISO 10646

character set)

又は ISO 10646 文字型 (ISO 10646 character type) と呼ぶ。

4.4.4.1

文字型指定子

文字型の型指定子は,キーワード CHARACTER とする。

種別型パラメタの指定がない場合,暗黙の種別値は KIND(’A’) とし,そのデータ要素の型は 基本文字型 (default

character)

とする。

R424

文字パラメタ選択子

is

文字長パラメタ選択子

or

( LEN =

型パラメタ値 , KIND = スカラ整数初期値式 )

or

(

型パラメタ値 , [ KIND = ] スカラ整数初期値式 )

or

( KIND =

スカラ整数初期値式 [ , LEN = 型パラメタ値 ] )

R425

文字長パラメタ選択子

is

( [ LEN = ]

型パラメタ値 )

or

*

文字長

[ , ]

R426

文字長

is

(

型パラメタ値 )

or

スカラ整定数表現

C414

(R424)

スカラ整数初期値式の値は,非負とし,処理系のもつ表現方法を指定しなければならない。

C415

(R426)

スカラ整定数表現は,種別の指定を含んではならない。

C416

(R424 R425 R426)

型パラメタ値 “*” は,次の用途の場合にだけ用いてよい。

(1)

仮引数を宣言する場合

(2)

名前付き定数を宣言する場合

(3)

ALLOCATE

文の型指定子中であって,それぞれの割付け実体が引継ぎ文字長をもつ文字型の仮

引数である場合

(3.5)

型保持文 (8.1.5) の型指定子 又は 派生型指定子中にある場合

(4)

外部関数において,関数結果の文字長パラメタを宣言する場合


34

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C417

関数名は,

その型が文字型であって,外部関数の結果の名前であるか 又は 仮引数の関数名である場合以外は,

型パラメタ値 “*” で宣

言してはならない。

C418

関数名は,その関数が配列関数,ポインタ関数,再帰的関数 又は 純粋関数であるとき,型パラメタ値

“*”

で宣言してはならない。

C419

(R425)

文字長パラメタ選択子中の省略可能なコンマは,その宣言型指定子が型宣言文中にある場合にだけ指定してよい。

C420

(R425)

文字長パラメタ選択子中の省略可能なコンマは,型宣言文中に区切りの

2

連コロンがない場合にだけ指定してよい。

C421

(R424)

文字値文関数 又は 文字型の文関数仮引数に対して指定する長さは,初期値式でなければならない。

組込み型指定子 CHARACTER 型中の文字パラメタ選択子 及び データ要素宣言中 又は 型定義の成分宣言中の

“*

文字長” は,文字長を指定する。データ要素宣言中 又は 成分宣言中の “* 文字長” は,文字パラメタ選択子で指定

された長さ(もしあれば)を上書きして,それぞれの長さを指定する。データ要素宣言 又は 成分宣言に “* 文字長”

を指定しないと,文字パラメタ選択子中の文字長パラメタ選択子 又は 型パラメタ値が,文字長となる。長さが文字

パラメタ選択子でも “* 文字長” でも指定されなければ,その長さは,1 とする。

文字長パラメタ値が負であるとき,宣言される文字型要素の長さは,ゼロとする。“:” の文字長パラメタ値は,無

指定型パラメタ (4.2) であることを示す。“*” の文字長パラメタ値は,次の意味をもつ。

(1)

手続の仮引数として宣言する場合は,仮引数は,結合した実引数の長さを引き継ぐ。

(2)

名前付き定数として宣言する場合は,その定数の値の長さとする。

(3) ALLOCATE

文の型指定子中で用いた場合は,それぞれの割付け実体は,結合した実引数の長さを引き継ぐ。

(3.5)

型保持文の型指定子として用いた場合は,結合している要素は選択子の長さを引き継ぐ。

(4)

関数結果の文字長パラメタ値として指定する場合は,その関数を呼び出している有効域では,

“*”

ではない文字長パラメタ値を付けてその関数名を宣言するか,

又は 親子結合 若しくは 参照結合によってそのような定義を参照しなければならない。その関数が呼び出された時に,関数内の結果変数の長さは,この型パラメ

タ値から引き継がれる。

4.4.4.2

文字定数表現

文字定数表現 (character literal constant) は,アポストロフィ 又は 引用符によって囲まれた文字の列で記述する。

R427

文字定数表現

is

[

種別 _ ] ’[ 表現可能文字 ] ... ’

or

[

種別 _ ] "[ 表現可能文字 ] ... "

C422

(R427)

種別の値は,処理系に存在する表現方法を指定しなければならない。

囲み記号の前にある省略可能な種別は,その文字定数の種別型パラメタを指定する。種別型パラメタの指定のない

定数の型は,基本文字型とする。

種別指定のある文字型 及び 種別指定のない基本文字型に対する 表現可能文字 (representable character) は,次の

うちの一つとする。
(1)

自由形式中の表現可能文字は,処理系依存の文字集合中の任意の図形文字とする。

(2)

固定形式中の表現可能文字は,処理系依存の文字集合中の任意の文字とする。処理系は,幾つかの 又は すべての制御文字の出現を禁止してもよい。





注記 4.11

F

ORTRAN

77

では,文字文脈中にどの文字が出現してもよかった。一方,この規格(Fortran

90

以降)では,プログラムが二つ以上の種別の文字を含んでもよく,処理系は,基本文字型でない

文字を制御文字[拡張文字 (escape) 又は シフト文字と呼ばれる。]の挿入によって識別してもよい。

それが,あるときは意図した意味をもつ制御文字として扱われ,あるときは意味をもたない文字とし

て扱われる状況では,ファイルの処理,編集 及び 印刷が(不可能ではないにしても)困難になる。

ほとんどすべての制御文字が用途 又は 効果をもつので,同様に文字文脈中で利用できない。これが,

自由形式で図形文字だけを表現可能な文字とした理由である。

それにもかかわらず,

FORTRAN 77

との互換性の

ため,固定形式では制御文字が許されている。





囲み記号のアポストロフィ 又は 引用符は,文字定数表現の値の一部ではない。

アポストロフィによって囲まれた文字定数中の文字としてのアポストロフィは,間に空白を置かない二つの連続す

るアポストロフィで表す。この場合,その 2 連アポストロフィは 1 文字と数える。同様に,引用符によって囲まれた


35

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

文字定数中の文字としての引用符は,間に空白を置かない二つの連続する引用符で表し,その 2 連引用符は 1 文字と

数える。

長さゼロの文字定数表現は,文字文脈の外で,間に空白のない 2 連アポストロフィ 又は 2 連引用符で表す。

連結 (concatenation) の組込み演算 (//) は,文字型の二つのデータ要素に対して定義されている(7.2.2 参照)。二

つのデータ要素の型は,同じ種別型パラメタをもつ文字型とする。





例 4.12

文字定数表現の例を次に示す。

"DON’T"

’DON’’T’

これらの二つの文字定数表現は,いずれも値 DON’T をもつ。

’’

は,値として長さゼロの文字列をもつ。





例 4.13

基本文字型でない文字定数表現の例を示す。ここで,処理系は対応する文字集合を用意している

ものとする。

NIHONGO_’

彼女なしでは何もできない。’

ここで,NIHONGO は日本語に対する種別型パラメタの値をもつ名前付き定数とする。





4.4.4.3

大小順序

文字種別によって定まる文字集合中の文字の大小順序は,処理系によって文字種別ごとに定義される。大小順序

(collating sequence)

は,文字を負でない整数値に 1 対 1 で対応付ける。文字は,すべて異なる負でない整数値に対応

付けられる。組込み関数 CHAR (13.7.19) 及び ICHAR (13.7.50) は,この対応付けに従って文字と整数との間の変換

をする。





注記 4.14

ICHAR(’X’)

は,処理系の定める大小順序に従って文字 ’X’ に対応する整数値を求める。





この規格では,基本文字型についての大小順序だけを次のとおり定める。

(1) 26

個の英大文字の大小順序は,ICHAR(’A’) ICHAR(’B’) <

· · · < ICHAR(’Z’) とする。

(2) 10

個の数字の大小順序は,ICHAR(’0’) ICHAR(’1’) <

· · · < ICHAR(’9’) とする。

(3) ICHAR(’ ’) ICHAR(’0’) ICHAR(’9’) ICHAR(’A’)

又は ICHAR(’ ’) ICHAR(’A’) ICHAR(’Z’) <

ICHAR(’0’)

とする。

(4) 26

個の英小文字の大小順序は,ICHAR(’a’) ICHAR(’b’) <

· · · < ICHAR(’z’) とする。

(5) ICHAR(’ ’) ICHAR(’0’) ICHAR(’9’) ICHAR(’a’)

又は ICHAR(’ ’) ICHAR(’a’) ICHAR(’z’) <

ICHAR(’0’)

とする。

この規格では,空白を除く特殊文字 及び 下線の大小順序 並びに 大文字と小文字との間の大小順序を定めない。

ASCII

の文字型の大小順序は,JIS X 0201-1997 で定義される。この規格では,その符号の順序を ASCII 大小順序

(ASCII collating sequence)

と呼ぶ。ISO 10646 の文字型の大小順序は,JIS X 0221-1 : 2001 で定義されている。





注記 4.15

組込み関数 ACHAR (13.7.2) 及び IACHAR (13.7.45) は,ASCII 大小順序に従ってこれらの文

字と整数値との間の変換をする。





組込み関数 LGE,LGT,LLE 及び LLT (13.7.6313.7.66) は,ASCII 大小順序に従って文字列を比較する。英字,

数字,下線 及び 特殊文字だけを使用していれば,国際的に移植性が保証される。


36

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

4.4.5

論理型

論理型 (logical type) は,真 (true) と偽 (false) を表す二つの値をもつ。

処理系は,論理型データに対して一つ以上の 表現方法 (representation method) を提供しなければならない。それ

ぞれの表現方法は,種別 (kind) 型パラメタと呼ばれる型パラメタの値によって特徴付けられている。種別型パラメ

タは,基本整数型とする。表現方法の種別型パラメタは,問合せ組込み関数 KIND (13.7.59) によって知ることがで

きる。

論理型の型指定子は,キーワード LOGICAL とする。

種別型パラメタの指定がない場合,暗黙の種別値は KIND(.FALSE.) とする。そのデータ要素の型は,基本論理型

(default logical)

とする。

R428

論理定数表現

is

.TRUE. [ _

種別 ]

or

.FALSE. [ _

種別 ]

C423

(R428)

種別の値は,処理系に存在する表現方法を指定しなければならない。

後ろの囲み記号に続く省略可能の種別型パラメタは,論理定数の種別型パラメタを指定する。種別型パラメタの指

定のない定数の型は,基本論理型とする。

論理型のデータ要素に対して定義された組込み演算は,7.2.4 で規定されているとおり,否定 (.NOT.),論理積

(.AND.)

,論理和 (.OR.),論理等価 (.EQV.) 及び 論理非等価 (.NEQV.) とする。他の型のデータ要素の値を比較し,

基本論理型の値を生じる関係演算の集合も組込みとして定義されている。関係演算については,7.2.3 に定める。

4.5

派生型

派生型は,組込み型 及び 他の派生型から構成する。

派生型の定義では,型の名前 並びに その成分 及び 型束縛手続の名前 及び 属性を定義しなければならない。

派生型には,複数の型パラメタが指定できる。それぞれの型パラメタは,種別型パラメタ 又は 長さ型パラメタと

し,暗黙値をもってもよい。

派生型の実体の 末端成分 (ultimate component) は,次のものとする。

(1)

組込み型である成分

(2) POINTER

属性 又は ALLOCATABLE 属性をもつ成分

(3)

派生型であって POINTER 属性も ALLOCATABLE 属性ももたない実体の成分の末端成分





例 4.16

次の例において,派生型の実体 kids の末端成分は,name,age 及び other kids である。

type :: person

character(len=20) :: name

integer :: age

end type person

type :: kids

type(person) :: oldest_child

type(person), allocatable, dimension(:) :: other_kids

end type kids





特に指定しなければ,成分の定義順序は記憶列の順序を意味しない。しかし,連続型 (4.5.1.2) では,記憶列の順

序を意味する。派生型が BIND 属性をもつ場合,記憶列の順序は,連携処理系 (2.5.1015.2.3) の要求に合わせる。

4.5.1

派生型定義

R429

派生型定義

is

TYPE

[

型パラメタ定義文 ] ...


37

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

[

型定義属性宣言文 ] ...

[

成分定義部 ]

[

型束縛手続部 ]

END TYPE

R430

TYPE

is

TYPE [ [ ,

型属性指定子並び ] :: ] 型名 [ ( 型パラメタ名並び ) ]  

R431

型属性指定子

is

参照許可指定子

or

EXTENDS (

親型名 )

or

ABSTRACT

or

BIND ( C )

C424

(R430)

派生型の型名は,DOUBLEPRECISION とも,この規格が規定するどの組込み型の名前とも同じで

あってはならない。

C425

(R430)

同じ型属性指定子は,一つの TYPE 文中に 2 回以上書いてはならない。

C426

(R431)

親型名は,それ以前に定義されている拡張可能型 (4.5.6) の名前でなければならない。

C427

(R429)

型定義が遅延束縛 (4.5.4) を含むか 又は 継承 (4.5.6.1) する場合は,ABSTRACT を指定しなけれ

ばならない。

C428

(R429) ABSTRACT

を指定する場合は,その型は拡張可能でなければならない。

C429

(R429) EXTENDS

を指定する場合は,SEQUENCE を指定してはならない。

R432

型定義属性宣言文

is

成分 PRIVATE 文

or

SEQUENCE

C430

(R429)

同じ型定義属性宣言文は,一つの派生型定義中に 2 回以上書いてはならない。

R433

END TYPE

is

END TYPE [

型名 ]

C431

(R433) END TYPE

に続いて型名の指定を書く場合,その型名は対応する TYPE 文の型名と同じでなけ

ればならない。

BIND

属性をもった派生型は,15.2.3 で示す制約にも従わなければならない。





例 4.17

派生型定義

TYPE PERSON

INTEGER AGE

CHARACTER (LEN = 50) NAME

END TYPE PERSON

型 PERSON の変数 CHAIRMAN の宣言

TYPE (PERSON) :: CHAIRMAN





4.5.1.1

参照許可属性

モジュール内で定義されるか 又は 参照結合によってそのモジュール内で参照可能となった型は,PUBLIC 属性 又

は PRIVATE 属性のいずれかをもたなければならない。モジュール内で参照許可指定子を明示的に宣言していない型

は,そのモジュール内で暗黙の参照許可属性をもつ。PRIVATE 文 (5.2.1) によって変更しない限り,モジュールの

暗黙の参照許可属性は公開 (PUBLIC) とする。モジュール内の PUBLIC 属性をもつ型だけが,参照結合によってそ

のモジュールから参照できる。

型の参照許可属性は,その成分 及び 束縛の参照許可属性に影響を与えず,影響を受けることもない。


38

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

型の定義が非公開である場合,型名 及び その型の構造体構成子 (4.5.9) は,その型定義を含むモジュールの中で

だけ参照可能とする。





例 4.18

非公開の型

TYPE, PRIVATE :: AUXILIARY

LOGICAL :: DIAGNOSTIC

CHARACTER (LEN = 20) :: MESSAGE

END TYPE AUXILIARY

このような型は,この型の定義のあるモジュール内でだけ参照可能である。





4.5.1.2

連続型

R434

SEQUENCE

is

SEQUENCE

C432

(R438) SEQUENCE

を指定する場合は,それぞれのデータ成分は,組込み型であるか 又は 連続した派生

型でなければならない。

C433

(R429) SEQUENCE

を指定する場合は,型束縛手続部を記述してはならない。

SEQUENCE

文 (SEQUENCE statement) の指定のある型は,連続型とする。この型の実体の記憶列は,連続型で

定義した成分の順序となる。型パラメタもポインタ成分も割付け成分ももたず,かつ すべての成分が基本整数型,基

本実数型,倍精度実数型,基本複素数型,基本論理型 又は 数値連続型である型は,数値連続型 (numeric sequence

type)

とする。型パラメタもポインタ成分も割付け成分ももたず,かつ すべての成分が基本文字型 又は 文字連続型

である型は,文字連続型 (character sequence type) とする。





例 4.19

数値連続型

TYPE NUMERIC_SEQ

SEQUENCE

INTEGER :: INT_VAL

REAL

:: REAL_VAL

LOGICAL :: LOG_VAL

END TYPE NUMERIC_SEQ





注記 4.20

構造体は,成分の列に分解される。構造体が SEQUENCE 文を含まないとき,成分が指定され

た順(又は 他のどんな順)で格納されているかわからない。連続した記憶列を使うという保証もな

い。定義を記述するときに必然的に成分を指定する順序があり,これが成分の列を定義するというだ

けのことである。派生型の実体の成分は,次の文脈を除いてはいつも成分名で参照されるので,成分

の順序はあまり重要ではない。

(1)

構造体構成子における式の列

(2)

組込み代入

(3)

変数群入力におけるデータ値

(4)

書式付きデータ転送の入出力項目並びにおける構造体

これらの場合は成分の順序に展開される。処理系は,これらの場合において定義された順序に従う

限り,連続型でない構造体に対する記憶列を,特定のアーキテクチャに最も適するように構成しても

よい。





4.5.1.3

派生型の決定

同じ型名をもつ派生型定義を,異なる有効域に書いた場合,それらは,独立の異なる型を表すときと同じ派生型を


39

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

表すときがある。

同じ派生型定義を参照して宣言された二つのデータ要素は,同じ型とする。型定義は,モジュール 又は 親有効域

から参照してくることもできる。異なる有効域内のデータ要素が異なる派生型定義を用いて宣言されていても,それ

らの派生型定義が同じ型名 及び SEQUENCE の指定 又は BIND 属性をもち,PRIVATE 属性をもたず,かつ 順序,名

前 及び 属性の一致する型パラメタ 及び 成分をもつ場合,それらのデータ要素は同じ型とする。そうでない場合,そ

れらのデータ要素は異なる派生型とする。SEQUENCE の指定 又は BIND 属性のある型を用いて宣言されたデータ要素

は,非公開の型 又は 非公開の成分をもつ型のデータ要素とは異なる型とする。





例 4.21

同じ派生型定義を参照する二つの要素の宣言

TYPE POINT

REAL

X,

Y

END TYPE POINT

TYPE (POINT) :: X1

CALL SUB (X1)

...

CONTAINS

SUBROUTINE SUB (A)

TYPE (POINT) :: A

...

END SUBROUTINE SUB

親子結合によって,サブルーチン SUB で派生型 POINT の定義が参照できる。X1 及び A の両方の宣

言は,同じ派生型定義を参照するので,X1 と A は同じ型をもつ。派生型をモジュールで定義し,そ

のモジュールをサブルーチン SUB 及び 外側のプログラム単位の両方で参照しても,X1 と A は同じ型

をもつ。






40

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 4.22

異なる有効域のデータ要素が同じ型をもつ場合

PROGRAM PGM

TYPE EMPLOYEE

SEQUENCE

INTEGER

ID_NUMBER

CHARACTER (50) NAME

END TYPE EMPLOYEE

TYPE (EMPLOYEE) PROGRAMMER

CALL SUB (PROGRAMMER)

...

END PROGRAM PGM

SUBROUTINE SUB (POSITION)

TYPE EMPLOYEE

SEQUENCE

INTEGER

ID_NUMBER

CHARACTER (50) NAME

END TYPE EMPLOYEE

TYPE (EMPLOYEE) POSITION

...

END SUBROUTINE SUB

実引数 PROGRAMMER 及び 仮引数 POSITION は,型の名前,SEQUENCE 文の指定,並びに 成分の

定義順,名前 及び 属性が一致する派生型定義を参照して宣言されているので,同じ型をもつ。

サブルーチン中の派生型の成分の名前が ID NUMBER でなく ID NUM であったとすると,すべての成

分の名前が主プログラムの派生型 EMPLOYEE の成分の名前と一致することにはならないので,実引数

PROGRAMMER

の型は,仮引数 POSITION の型と異なることになる。その場合,このプログラムは,規

格合致ではなくなる。





注記 4.23

二つの型が同じ名前をもつための条件は,それぞれの TYPE 文の型名に対して適用され,USE

文によって確立した局所名に対しては適用されない。





4.5.2

派生型パラメタ

R435

型パラメタ定義文

is

INTEGER [

種別型パラメタ選択子 ] , 型パラメタ属性指定子 ::

型パラメタ宣言並び

R436

型パラメタ宣言

is

型パラメタ名 [ = スカラ整数初期値式 ]

C434

(R435)

派生型定義の型パラメタ定義文における型パラメタ名は,その派生型定義の TYPE 文中の型パ

ラメタ名の一つでなければならない。

C435

(R435)

派生型定義の TYPE 文内のそれぞれの型パラメタ名は,その派生型定義の型パラメタ定義文中

の型パラメタ名として現れなければならない。

R437

型パラメタ属性指定子

is

KIND

or

LEN

派生型は,TYPE 文が型パラメタ名をもつ場合にパラメタ化できる。

それぞれの型パラメタ自体は整数型とする。種別型パラメタ選択子が省略された場合,種別型パラメタは基本整数

型とする。

型パラメタ属性指定子は,型パラメタが種別型パラメタであるか長さ型パラメタであるかを明示的に指定する。


41

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

型パラメタ宣言にスカラ整数初期値式がある場合,型パラメタは,その式によって指定された値を暗黙の値として

もつ。その値は,組込み代入 (7.4.1.3) の規則に従って,同じ種類の型パラメタの値に変換してもよい。

型パラメタは,派生型定義中の宣言式 (7.1.6) の一次式として使用してよい。種別型パラメタも,派生型定義中の

初期値式 (7.1.7) の一次式として使用してよい。





例 4.24

派生型パラメタの例

TYPE humongous_matrix(k, d)

INTEGER, KIND :: k = kind(0.0)

INTEGER(selected_int_kind(12)), LEN :: d

!-- d

に対して,暗黙の種別以外を指定する。

REAL(k) :: element(d,d)

END TYPE

次の例では,dim は種別型パラメタとして宣言されており,dim によってだけ区別可能な手続の総

称化が許される。

TYPE general_point(dim)

INTEGER, KIND :: dim

REAL :: coordinates(dim)

END TYPE





4.5.2.1

型パラメタ順序

型パラメタ順序 (type parameter order) は,派生型の型パラメタの順序とし,派生型指定子で用いる。

直接拡張型でない派生型の型パラメタ順序は,派生型定義の型パラメタ並びでの順序とする。直接拡張型の型パラ

メタ順序は,親型の型パラメタ順序に続けて,その直接拡張型の定義の型パラメタ並びにおける順序を追加したもの

とする。





例 4.25

型パラメタ順序

TYPE :: t1(k1,k2)

INTEGER,KIND :: k1,k2

REAL(k1) a(k2)

END TYPE

TYPE,EXTENDS(t1) :: t2(k3)

INTEGER,KIND :: k3

LOGICAL(k3) flag

END TYPE

t1

の型パラメタ順序は,k1,k2 である。t2 の型パラメタ順序は,k1,k2,続いて k3 となる。





4.5.3

成分

R438

成分定義部

is

[

成分定義文 ] ...

R439

成分定義文

is

データ成分定義文

or

手続成分定義文

R440

データ成分定義文

is

宣言型指定子 [ [ , 成分属性指定子並び ] :: ] 成分宣言並び

R441

成分属性指定子

is

POINTER

or

DIMENSION (

成分配列形状指定 )

or

ALLOCATABLE

or

参照許可指定子


42

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

R442

成分宣言

is

成分名 [ ( 成分配列形状指定 ) ] [ * 文字長 ] [ 成分初期値指定 ]

R443

成分配列形状指定

is

明示上下限並び

or

無指定上下限並び

R444

成分初期値指定

is

=

初期値式

or

=>

空初期化

C436

(R440)

同じ成分属性指定子は,一つの成分定義文中に 2 回以上書いてはならない。

C437

(R440)

キーワード CLASS (5.1.1.2) で宣言する成分は,ALLOCATABLE 属性 又は POINTER 属性を

もっていなければならない。

C438

(R440)

成分に POINTER 属性の指定がない場合,その成分定義文の宣言型指定子は,CLASS(*) であ

るか,又は 組込み型 若しくは それ以前に定義された派生型を指定しなければならない。

C439

(R440)

成分に POINTER 属性の指定がある場合,その成分定義文の宣言型指定子は,CLASS(*) である

か,又は 組込み型 若しくは 任意の参照可能な派生型(その型自体を含む。)を指定しなければならない。

C440

(R440) POINTER

属性 又は ALLOCATABLE 属性を指定する場合,成分配列形状指定は,無指定上下

限並びでなければならない。

C441

(R440) POINTER

属性の指定も ALLOCATABLE 属性の指定もない場合,成分配列形状指定は,明示

上下限並びでなければならない。

C442

(R443)

明示上下限の上下限は,初期値式であるか,又は 宣言関数の引用 及び 名前付き定数(その部分

実体も含む。)以外のいかなる実体特定子の引用も含まない宣言式でなければならない。

C443

(R440)

成分に ALLOCATABLE 属性と POINTER 属性の両方を指定してはならない。

C444

(R442) “*

文字長” は,型指定が文字型である場合にだけ指定してよい。

C445

(R439)

成分定義文の型パラメタ値は,コロンであるか,初期値式であるか,又は,宣言関数の引用も,

名前付き定数 及び その部分実体を除くいかなる実体特定子も含まない宣言式であるかのいずれかでなけ

ればならない。





注記 4.26

型パラメタは実体ではないので,型パラメタ値 又は 明示上下限の上下限は型パラメタ名を含

んでもよい。





C446

(R440)

成分初期値指定を書いたとき,その成分宣言並びの前の区切りの 2 連コロンを省略してはなら

ない

C447

(R440)

成分初期値指定に “=>” を書いたとき,実体は,POINTER 属性をもたなければならない。初期

値指定に “=” を書いたとき,実体は,POINTER 属性 又は ALLOCATABLE 属性をもってはならない。

C447a

(R440)

成分初期値指定を書いたとき,成分のそれぞれの型パラメタ 及び 配列上下限は,初期値式で

なければならない。

R445

手続成分定義文

is

PROCEDURE ( [

手続引用仕様 ] ),

手続成分属性指定子並び :: 手続宣言並び





注記 4.27

手続引用仕様 及び 手続宣言の定義は,12.3.2.3 を参照。





R446

手続成分属性指定子

is

POINTER

or

PASS [ (

引数名 ) ]

or

NOPASS

or

参照許可宣言


43

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C448

(R445)

同じ手続成分属性指定子は,一つの手続成分定義文中に 2 回以上書いてはならない。

C449

(R445)

手続成分属性指定子並びには,POINTER 属性を書かなければならない。

C450

(R445)

手続ポインタ成分が,暗黙の引用仕様をもつか 又は 引数をもたない場合は,NOPASS を指定し

なければならない。

C451

(R445) PASS(

引数名) を指定する場合は,引用仕様はその引数名を名前とする仮引数をもたなければな

らない。

C452

(R445)

同じ手続成分属性指定子並びに PASS 及び NOPASS を同時に指定してはならない。

4.5.3.1

配列成分

成分宣言が成分配列形状指定を含むか 又は データ成分定義文が DIMENSION 属性をもつ場合,そのデータ成分は

配列とする。成分宣言が成分配列形状指定を含む場合,成分配列形状指定は配列の次元数を指定し,更に配列が形状

明示配列 (5.1.2.5.1) であるときは,配列の上下限をも指定する。データ成分定義文が DIMENSION 属性をもつ場

合,その DIMENSION 属性の成分配列形状指定は配列の次元数を指定し,更に配列が形状明示配列であるときは配

列の上下限をも指定する。





例 4.28

配列成分をもつ型定義

TYPE LINE

REAL, DIMENSION (2, 2) :: COORD

! COORD(:,1)

の値は (/X1, Y1/)

! COORD(:,2)

の値は (/X2, Y2/)

REAL

:: WIDTH

!

線幅 (cm)

INTEGER

:: PATTERN

! 1:

実線,

2:

破線,

3:

点線

END TYPE LINE

型 LINE の変数 LINE SEGMENT の宣言

TYPE (LINE)

:: LINE_SEGMENT

スカラ変数 LINE SEGMENT は,配列である成分をもつ。この場合,その配列はスカラデータの部分実

体となる。COORD の定義では,“::” は指定しなければならない。WIDTH 及び PATTERN の定義では,

“::”

は省略可能である。





例 4.29

割付け成分をもつ型定義

TYPE STACK

INTEGER

:: INDEX

INTEGER, ALLOCATABLE :: CONTENTS (:)

END TYPE STACK

型 STACK のスカラ変数の成分 CONTENTS の形状は,ALLOCATE 文 若しくは 代入文の実行 又は 引

数結合によって決定される。





注記 4.30

形状明示配列成分の暗黙的初期値指定は,配列構成子 (4.7) による初期値式でもよく,

(各配列

要素の値になる)一つのスカラ初期値式でもよい。





4.5.3.2

ポインタ成分

成分属性指定子並びが POINTER 属性を書いた場合,成分はポインタ (2.4.6) とする。ポインタ成分は,データポ

インタであっても手続ポインタであってもよい。


44

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 4.31

ポインタの成分をもつ派生型 REFERENCE(文献情報)の定義

TYPE REFERENCE

INTEGER

:: VOLUME, YEAR, PAGE

CHARACTER (LEN = 50)

:: TITLE

CHARACTER, DIMENSION (:), POINTER :: SYNOPSIS

END TYPE REFERENCE

型 REFERENCE の実体は,ポインタでない四つの成分,VOLUME,YEAR,PAGE 及び TITLE,並びに 文

字配列へのポインタ SYNOPSIS からなる。この指示先の配列の大きさは,SYNOPSIS(概要)の文字数

に応じて後で決まる。指示先の領域は,割付け (6.3.1) をしてもよいし,ポインタ代入文 (7.4.2) で

ポインタ成分に指示先を結合してもよい。





4.5.3.3

当該実体仮引数

当該実体仮引数 (passed-object dummy argument) は,手続ポインタ成分 又は 型束縛手続の特別な仮引数とする。

当該実体仮引数は,手続の上書き (4.5.6.2) 及び 引数結合 (12.4.1.1) に影響を及ぼす。

NOPASS

が指定された場合,手続ポインタ成分 又は 型束縛手続は,当該実体仮引数をもたない。

PASS

及び NOPASS のいずれも指定されない場合 又は 引数名をもたない PASS が指定された場合,手続ポインタ成

分 又は 型束縛手続の最初の仮引数が,当該実体仮引数となる。

PASS(

引数名) が指定された場合,引数名をもった仮引数が,手続ポインタ成分 又は 型束縛手続の当該実体仮引数

となる。

C453

当該実体仮引数は,ポインタでもなく割付け実体でもないスカラ仮データ実体でなければならず,その宣

言時の型は確定する型と同じでなければならない。すべての長さ型パラメタは,引き継がれる。確定する

型が拡張可能型(4.5.6 参照)であるときに限り,多相的(5.1.1.2 参照)でなければならない。VALUE

属性をもってはならない。





注記 4.32

手続が型束縛手続として様々な型に束縛されている場合,文脈に応じて異なった仮引数が当該

実体仮引数となることもある。





4.5.3.4

暗黙的初期値指定をもつ成分

暗黙的初期値指定は,ポインタ成分を自動的に空状態に初期化し,ポインタでも割付け成分でもない成分を特定の

値で初期化する方法とする。割付け成分は,常に “割り付けられていない” で初期化される。

ポインタ成分に対して空初期化が指定された場合,その型のすべての実体中のその成分の結合状態は,空状態

(16.4.2.1)

であるか 又は 16.4.2.1.2 で示すとおりに空状態になる。

ポインタでない成分に対して初期値式の指定がある場合,その型のすべての実体中のその成分は,初期確定 (16.5.3)

となるか 又は 初期値式によって定まる値を用いて 16.5.5 に示すとおりに確定となる。必要ならば,その値は,組込

み代入の規則 (7.4.1.3) に従って型,型パラメタ 及び 形状がその成分に一致するように変換される。 成分宣言中の

初期値式による暗黙的初期値指定は,その型の成分がまた暗黙的初期値指定をもつ場合,その暗黙的初期値指定を上

書きする。ある初期値指定が別の初期値指定を上書き (override) した場合,それはあたかも上書きした初期値指定だ

けがあったかのようになる(

例 4.34 参照)。型宣言文 (5.1) における明示的初期値指定は,暗黙的初期値指定を上書

きする (

例 4.33 参照)。明示的初期値指定とは異なり,暗黙的初期値指定は,実体が SAVE 属性をもつことを意味す

るわけではない。

部分成分(6.1.2 参照)は,それを成分とする実体の型定義にその成分の暗黙的初期値指定がある場合,暗黙的初

期値設定されている (default-initialized) という。その部分成分は,暗黙的初期値設定されているか 又は 明示的初期

値指定されている実体の部分実体ではない。


45

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 4.33

派生型のすべての成分に暗黙的初期値指定をする必要はない。

TYPE DATE

INTEGER DAY

CHARACTER (LEN = 5) MONTH

INTEGER :: YEAR = 1994

!

部分的な暗黙的初期値指定

END TYPE DATE

TODAY

の成分 YEAR の暗黙的初期値指定は,型宣言文の明示的初期値指定によって上書きされる。

TYPE (DATE), PARAMETER :: TODAY = DATE (21, "Feb.", 1995)





例 4.34

派生型の成分の暗黙的初期値は(その成分に対して)型定義中で指定した暗黙的初期値指定によっ

て上書きすることができる。

例 4.33 からの続きとする。

TYPE SINGLE_SCORE

TYPE(DATE) :: PLAY_DAY = TODAY

INTEGER SCORE

TYPE(SINGLE_SCORE), POINTER :: NEXT => NULL ( )

END TYPE SINGLE_SCORE

TYPE(SINGLE_SCORE) SETUP

SETUP

の成分 PLAY DAY は,成分 YEAR の初期値指定を上書きした TODAY の初期値をとる。





例 4.35

構造体の配列は,要素の一部 又は すべての成分が暗黙的初期値指定をもつように宣言してもよ

い。

例 4.34 からの続きとする。

TYPE MEMBER (NAME_LEN)

INTEGER, LEN :: NAME_LEN

CHARACTER (LEN = NAME_LEN) NAME = ’’

INTEGER :: TEAM_NO, HANDICAP = 0

TYPE (SINGLE_SCORE), POINTER :: HISTORY => NULL ( )

END TYPE MEMBER

TYPE (MEMBER(9)) LEAGUE (36)

!

各配列要素が部分的に初期化される配列

TYPE (MEMBER(9)) :: ORGANIZER = MEMBER ("I. Manage",1,5,NULL ( ))

ORGANIZER

は,型 MEMBER の実体に対する暗黙的初期値指定を上書きする明示的初期値指定をもつ。

割付け実体も,一部 又は 全体を初期化してよい。

ALLOCATE (ORGANIZER % HISTORY)

!

型 SINGLE_SCORE である部分的に初期化された

!

実体が生成される





例 4.36

派生型のポインタ成分は,指示先としてその派生型の実体をもってもよい。型定義中の指定では,

その型の実体中のそのようなポインタを暗黙的に空状態として初期化してもよい。

TYPE NODE

INTEGER

:: VALUE = 0

TYPE (NODE), POINTER

:: NEXT_NODE => NULL ( )

END TYPE

このような型は,型 NODE の実体の線形リストを構成するのに用いることができる。使用例は,C.1.5

参照。





4.5.3.5

成分順序

成分順序 (component order) は,派生型の親でない成分の順序とする。成分順序は,組込み書式付き入出力 及び 構

造体構成子で用いられる(成分キーワードは使わない。)。親成分は,直接拡張型 (4.5.6) の成分順序には含まれない。


46

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

直接拡張型でない派生型の成分順序は,派生型定義での成分の宣言された順序とする。直接拡張型の成分順序は,

親型の成分順序に続けて,拡張された派生型定義での成分の宣言された順序をつなげたものとする。





例 4.37

例 4.25 の派生型定義において,型 t1 の成分順序は,a だけである(t1 には一つの成分だけしか

存在しない。)。型 t2 の成分順序は,a に続いて flag となる。親成分(t1)は成分順序には現れない。





4.5.3.6

成分の参照許可属性

R447

成分 PRIVATE 文

is

PRIVATE

C454

(R447)

成分 PRIVATE 文は,その型定義がモジュールの宣言部にある場合にだけ書くことができる。

型定義に成分 PRIVATE 文が存在する場合,派生型の成分定義部で宣言された成分の暗黙の参照許可属性は,非公

開とする。そうでない場合は,公開とする。参照許可指定子によって明示的に成分の参照許可属性の宣言をしてもよ

い。宣言をしない場合は,成分の参照許可属性は,型定義で宣言された暗黙の参照許可属性とする。

成分が非公開である場合,その成分名は,その型定義を含むモジュールの中でだけ参照可能とする。





注記 4.38

型パラメタは成分ではないので,その効果は常に公開となる。





注記 4.39

派生型の成分の参照許可属性 及び 派生型名の参照許可属性は互いに独立している。したがっ

て,次の四つの組合せがあり得る。

(1)

公開の成分をもった公開の型名

(2)

公開の成分をもった非公開の型名

(3)

非公開の成分をもった公開の型名

(4)

非公開の成分をもった非公開の型名





例 4.40

非公開の成分をもつ型

MODULE DEFINITIONS

TYPE POINT

PRIVATE

REAL :: X, Y

END TYPE POINT

END MODULE DEFINITIONS

このような型定義は,USE 文によってこのモジュールを参照している任意の有効域で参照可能である

が,成分 X 及び Y は,このモジュール内でだけ参照可能である。





例 4.41

各成分の参照許可指定子によって暗黙の参照許可属性を上書きする例

TYPE MIXED

PRIVATE

INTEGER :: I

INTEGER, PUBLIC :: J

END TYPE MIXED

TYPE (MIXED) :: M

成分 M%J は,M が参照可能な範囲ではどこでも参照可能である。成分 M%I は,型 MIXED が定義されて

いるモジュール内だけで参照可能である。





4.5.4

型束縛手続


47

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

R448

型束縛手続部

is

CONTAINS

[

束縛 PRIVATE 文 ]

手続束縛文 [ 手続束縛文 ] ...

R449

束縛 PRIVATE 文

is

PRIVATE

C455

(R448)

束縛 PRIVATE 文は,型定義がモジュールの宣言部にあるときだけ書くことができる。

R450

手続束縛文

is

個別束縛

or

総称束縛

or

後始末束縛

R451

個別束縛

is

PROCEDURE [ (

引用仕様名 ) ] [ [ , 束縛属性並び ] :: ]

束縛名 [ => 手続名 ]

C456

(R451) “=>

手続名” を書いたとき,区切りの 2 連コロンを省略してはならない。

C457

(R451) “=>

手続名” を書いたとき,引用仕様名を書いてはならない。

C458

(R451)

手続名は,参照可能なモジュール手続名か 又は 明示的引用仕様をもった外部手続名でなければ

ならない。

“=>

手続名” も引用仕様名も書かないとき,“=> 手続名” の手続名に束縛名が書かれたときと同じになる。

R452

総称束縛

is

GENERIC [ ,

参照許可属性 ] :: 総称指定 => 束縛名並び

C459

(R452)

モジュールの宣言部内で,それぞれの総称束縛は,その派生型において同じ総称指定をもつ他の

すべての総称束縛と同じ参照許可属性を,明示的 又は 暗黙的に指定しなければならない。

C460

(R452)

束縛名並びの束縛名は,その型の個別束縛の名前でなければならない。

C461

(R452)

総称指定が総称名でないとき,それぞれの個別束縛は,当該実体仮引数 (4.5.3.3) をもたなけれ

ばならない。

C462

(R452)

総称指定が OPERATOR(利用者定義演算子) であるとき,それぞれの束縛の引用仕様は 12.3.2.1.1

で示す指定方法に従っていなければならない。

C463

(R452)

総称指定が ASSIGNMENT(=) であるとき,それぞれの束縛の引用仕様は 12.3.2.1.2 で示す指定方

法に従っていなければならない。

C464

(R452)

総称指定が派生型入出力総称指定であるとき,それぞれ束縛の引用仕様は 9.5.3.7 で示す指定方

法に従っていなければならない。引数 dtv(9.5.3.7.2 参照)の型は,その派生型定義の型名でなければ

ならない。

R453

束縛属性

is

PASS [ (

引数名 ) ]

or

NOPASS

or

NON OVERRIDABLE

or

DEFERRED

or

参照許可指定子

C465

(R453)

同じ束縛属性は,一つの束縛属性並び中に 2 回以上書いてはならない。

C466

(R451)

束縛の引用仕様が定義している型の仮引数をもたないとき,NOPASS を書かなければならない。

C467

(R451) PASS(

引数名) を書いたとき,束縛の引用仕様には,引数名をもった仮引数を書かなければなら

ない。

C468

(R453)

一つの束縛属性並びに PASS と NOPASS を同時に書いてはならない。

C469

(R453)

一つの束縛属性並びに NON OVERRIDABLE と DEFERRED を同時に書いてはならない。


48

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C470

(R453)

引用仕様名を書いたときに限り DEFERRED を書かなければならない。DEFERRED を書いたときに

限り,引用仕様名を書かなければならない。

C471

(R451)

上書き束縛 (4.5.6.2) は,上書きするものの束縛が遅延するときだけ,DEFERRED 属性を指定

しなければならない。

C472

(R451) NON OVERRIDABLE

属性をもった継承束縛 (4.5.6.1) を上書きしてはならない。

手続束縛文での束縛は,型束縛手続 (type-bound procedure) を指定する。型束縛手続は,当該実体仮引数 (4.5.3.3)

をもってもよい。総称束縛は,その個別束縛に対して型束縛の総称引用仕様を指定する。DEFERRED 属性をもつ束

縛は,遅延束縛 (deferred binding) とする。遅延束縛は,抽象型 (4.5.6) の定義中にだけ書かなければならない。

型束縛手続は,型定義の有効範囲の中で束縛名 (binding name) で識別してもよい。この名前は,個別束縛に対し

ては束縛名とし,総称指定が総称名である総称束縛に対しては総称名とする。後始末束縛 又は 総称指定が総称名と

異なる総称束縛は,束縛名をもたない。

個別束縛の引用仕様は,手続名によって指定された手続の引用仕様 又は 引用仕様名によって指定された手続の引

用仕様とする。





例 4.42

型 及び 型束縛手続の例

TYPE POINT

REAL :: X, Y

CONTAINS

PROCEDURE, PASS :: LENGTH => POINT_LENGTH

END TYPE POINT

...

ここで,次の定義が同じモジュールのモジュール副プログラム部の中にあるとする。

REAL FUNCTION POINT_LENGTH (A, B)

CLASS (POINT), INTENT (IN) :: A, B

POINT_LENGTH = SQRT ( (A%X - B%X)**2 + (A%Y - B%Y)**2 )

END FUNCTION POINT_LENGTH





一つの派生型定義内の複数の総称束縛に,同じ総称指定を書いてもよい。同じ総称指定をもつ追加された総称束縛

は,総称引用仕様を拡張する。





注記 4.43

総称手続名の場合とは異なり,総称型束縛手続名は,それと同じ型をもつ個別型束縛手続名と

同じ名前であってはならない(16.2 参照)。





型定義が束縛 PRIVATE 文を含むとき,型の手続束縛の暗黙の参照許可属性は非公開とし,束縛 PRIVATE 文を含

まないとき,公開とする。手続束縛の参照許可属性は,参照許可指定子によって明示的に指定してもよい。明示的な

指定がない場合は,宣言された暗黙の型定義による参照許可属性とする。

公開の型束縛手続は,その型のすべての参照可能な型の実体から参照可能とする。非公開の型束縛手続は,その型

定義を含むモジュールの中でだけ参照可能とする。





注記 4.44

型束縛手続の参照許可属性は,成分定義部の PRIVATE 文の影響を受けない。データ成分の参

照許可属性は,型束縛手続部の PRIVATE 文の影響を受けない。





4.5.5

後始末サブルーチン

R454

後始末束縛

is

FINAL [ :: ]

後始末サブルーチン名並び

C473

(R454)

後始末サブルーチン名は,ちょうど一つの仮引数をもつモジュール手続の名前でなければなら


49

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

ない。その引数は,省略不可であり,定義しようとする派生型の,ポインタでもなく,割付け変数でもな

く,多相的でもない変数でなければならない。仮引数は,INTENT(OUT) であってはならない。

C474

(R454)

同じ型に対して,後始末サブルーチン名を 2 回以上指定してはならない。

C475

(R454)

同じ型に対して,同じ種別型パラメタ 及び 同じ次元数をもった仮引数をもつ後始末サブルーチ

ン名を 2 回以上指定してはならない。

キーワード FINAL は,後始末サブルーチン (final subroutine) の並びを指定する。後始末サブルーチンは,その型

のデータ要素が後始末されるときに実行される(4.5.5.1 参照)。

派生型が後始末可能 (finalizable) であるとは,後始末サブルーチンをもっているか,又は ポインタでもなく割付け

成分でもない,後始末可能である型の成分をもっている場合とする。ポインタでないデータ要素は,その型が後始末

可能であるとき,後始末可能とする。





注記 4.45

後始末サブルーチンは,結果的には常に参照可能である。その型の参照許可属性,他の型束縛

手続 又は サブルーチン名自体によらず,要素を後始末するために後始末サブルーチンが呼ばれる。





注記 4.46

後始末サブルーチンは,型拡張による継承も上書きもできない。親型の後始末サブルーチンは,

直接拡張型の後始末サブルーチンが呼ばれた後に呼ばれる。





4.5.5.1

後始末の処理

後始末可能な要素だけが,後始末できる。要素が後始末される (finalized) とき,次の手順が順番に実施される。

(1)

要素の実行時の型が後始末サブルーチンをもち,その仮引数が後始末される要素と同じ種別型パラメタ 及び 同

じ次元数をもつ場合,その要素を実引数として後始末サブルーチンが呼び出される。そうでなくて,仮引数が後

始末される要素と同じ種別型パラメタをもつ要素別後始末サブルーチンが存在する場合は,その要素を実引数と

して後始末サブルーチンが呼び出される。そうでもなければ,この時点でサブルーチンは呼び出されない。

(2)

型定義に書かれた後始末可能な成分が,後始末される。後始末されようとしている要素が配列のとき,要素の配

列要素の後始末可能な成分が,個別に後始末される。

(3)

要素が直接拡張型であって,その親型が後始末可能であるとき,親成分は,後始末される。

複数の要素が,4.5.5.2 で示す条件の結果として後始末されるとき,後始末される順序は,処理系依存とする。後

始末サブルーチンは,既に後始末されている実体を引用も確定もしてはならない。

実体が後始末されていないとき,定義された状態は保持され,不定になることはない。

4.5.5.2

後始末される時期

ポインタが解放されると,その指示先は後始末される。割付け要素が解放されると,その要素は後始末される。

仮引数でも関数結果でもない,ポインタでもなく割付け実体でもない実体は,RETURN 文 又は END 文の実行に

よって未定義になる(16.5.6 の (3) 参照)直前に後始末される。実体がモジュール内で定義され,かつ そのモジュー

ルを参照する活動状態にある手続が存在しないとき,その実体が後始末されるかどうかは,処理系依存とする。

実行可能な構造構文が関数を参照しているとき,関数結果は,その参照を含む最も内側の実行可能な構造構文の実

行後に後始末される。

実行可能な構造構文が構造体構成子 又は 配列構成子を参照しているとき,その構成子で生成された要素は,その

参照を含む最も内側の実行可能な構造構文の実行後に後始末される。

有効域内の宣言式が関数を参照しているとき,関数結果は,その有効域内の実行構文の実行の直前に後始末される。

有効域中の宣言式が構造体構成子 又は 配列構成子を引用しているとき,構成子によって生成された要素は,その

有効域の実行構文の実行の前に後始末される。


50

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

手続が呼び出されるとき,INTENT(OUT) 属性をもつ仮引数と結合する実引数であり,ポインタでもなく割付け

実体でもない実体は,後始末される。

組込み代入が実行されるとき,変数は,式の評価後 かつ その変数の確定前に後始末される。





注記 4.47

記憶域の管理のために後始末を使うときは,利用者定義代入と組み合わせて使うことが多い。





実体がポインタ割付けによって割り付けられ,その後,ポインタ結合の状態が変更されたためにその実体へのすべ

てのポインタが到達不可能になった場合,後始末されるかどうかは,処理系依存とする。後始末されるときに,後始

末サブルーチンがいつ呼び出されるかは,処理系依存とする。

4.5.5.3

後始末されない要素

誤り条件(例えば,割付け処理の失敗など)又は STOP 文 若しくは END PROGRAM 文の実行のいずれかによっ

てプログラムの実行が終了した場合,終了の直前に存在していた要素は,後始末されない。





注記 4.48

SAVE

属性をもつか 又は 主プログラムで生成された,ポインタでもなく割付け実体でもない

実体は,RETURN 文 又は END 文の実行の直接の結果で後始末されることはない。

モジュール内の変数は,その定義状態 及び 値を保持しているとき,そのモジュールを参照する活

動状態にある手続が存在しなくても,後始末されない。





4.5.6

型の拡張

拡張可能型 (extensible type) は,BIND 属性をもたない非連続の派生型とする。

基底型 (base type) は,EXTENDS 属性をもたない拡張可能型とする。直接拡張型 (extended type) は,EXTENDS

属性をもつ型とする。直接拡張型の親型 (parent type) は,EXTENDS 属性に指定する型名とする。





注記 4.49

親型の名前は,USE 文を使って変更した局所名でもよい。





基底型は,それ自体だけの拡張型 (extension type) とする。直接拡張型は,それ自体 及び その親型が拡張型であ

るすべての型の拡張型とする。

抽象型 (abstract type) は,ABSTRACT 属性をもつ型とする。





例 4.50

遅延束縛 (4.5.4) は,型束縛手続の実現をその型の拡張まで遅延する。遅延束縛は,抽象型のと

きだけ書くことができる。実体の実行時の型は抽象型にならないので,遅延束縛は呼び出されない。

遅延束縛がないときは,抽象型の拡張が抽象型である必要はない。抽象型の例を次に示す。

TYPE, ABSTRACT :: FILE_HANDLE

CONTAINS

PROCEDURE(OPEN_FILE), DEFERRED, PASS(HANDLE) :: OPEN

...

END TYPE

より詳細な例を,C.1.4 に示す。





4.5.6.1

継承

直接拡張型は,親型のすべての型パラメタ,すべての成分,及び 上書き (4.5.6.2) も後始末もしない手続束縛を含

む。これらは,親型から直接拡張型へ継承 (inherit) されるという。継承は,これらが親型においてもっていたすべて

の属性を保持する。直接拡張型の派生型定義によって,型パラメタ,成分 及び 手続束縛を加えることができる。


51

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





注記 4.51

親型の参照不可の成分 及び 束縛も継承される。しかし,これらは直接拡張型においても参照

不可のままである。拡張しようとする型が参照結合によって参照され,非公開の要素をもつとき,参

照不可の要素が発生する。





注記 4.52

基底型は,成分,束縛 又は パラメタをもつ必要はない。直接拡張型は,親型より多くの成分,

束縛 又は パラメタをもつ必要はない。





直接拡張型は,親型の型 及び 型パラメタをもつ,スカラであってポインタでも割付け成分でもない親成分 (parent

component)

をもつ。この成分の名前は,親型名とする。この成分は,親型の参照許可属性をもつ。親成分の成分は,

親型から継承された対応する成分と継承結合されている (inheritance associated) という(16.4.4 参照)。型の先祖成

分 (ancestor component) は,その型の親成分 又は 親成分の先祖成分とする。





注記 4.53

直接拡張型で宣言された成分 又は 型パラメタの名前は,親型の参照可能な成分 又は 型パラメ

タの名前と同じであってはならない。





例 4.54

直接拡張型の例

TYPE POINT

!

基底型

REAL :: X, Y

END TYPE POINT

TYPE, EXTENDS(POINT) :: COLOR_POINT

! TYPE(POINT)

の拡張

!

成分 X,Y 及び 成分名 POINT が親から継承されている。

INTEGER :: COLOR

END TYPE COLOR_POINT





4.5.6.2

型束縛手続の上書き

型定義で指定された総称束縛ではない束縛が,親型の束縛と同じ束縛名をもつとき,その型定義に指定した束縛が,

親型からの束縛を上書き (override) する。

上書きする束縛 及び 上書きされる束縛が満たすべき条件を,次に示す。

(1)

両方とも当該実体仮引数をもっているか,又は 両方とももっていないかでなければならない。

(2)

上書きされる束縛手続が純粋であるとき,上書きする束縛手続も純粋でなければならない。

(3)

両方とも要素別処理手続であるか,又は 両方とも要素別処理手続でないかでなければならない。

(4)

両方とも仮引数の個数が同じでなければならない。

(5)

当該実体仮引数が存在するとき,名前と位置が対応していなければならない。

(6)

位置が対応する仮引数は,当該実体仮引数の型を除いて,同じ名前 及び 特性をもたなければならない。

(7)

両方ともサブルーチンであるか 又は 同じ結果の特性 (12.2.2) をもった関数でなければならない。

(8)

上書き束縛される手続が PUBLIC 属性をもつとき,上書き束縛する手続は,PRIVATE 属性をもってはなら

ない。


52

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





注記 4.55

手続上書きの例。

例 4.42 を拡張している。

TYPE, EXTENDS (POINT) :: POINT_3D

REAL :: Z

CONTAINS

PROCEDURE, PASS :: LENGTH => POINT_3D_LENGTH

END TYPE POINT_3D

...

ここで,次の定義が同じモジュールのモジュール副プログラム部の中にあるとする。

REAL FUNCTION POINT_3D_LENGTH ( A, B )

CLASS (POINT_3D), INTENT (IN) :: A

CLASS (POINT), INTENT (IN) :: B

SELECT TYPE(B)

CLASS IS(POINT_3D)

POINT_3D_LENGTH = SQRT( (A%X-B%X)**2 + (A%Y-B%Y)**2 + (A%Z-B%Z)**2 )

RETURN

END SELECT

PRINT *, ’In POINT_3D_LENGTH, dynamic type of argument is incorrect.’

STOP

END FUNCTION POINT_3D_LENGTH





型定義で指定された総称束縛が,継承束縛と同じ総称指定をもつとき,総称引用仕様が拡張され,16.2.3 で示され

た要件を満足しなければならない。

型定義で指定された総称束縛が,親から継承されたのと同じ派生型入出力総称指定をもつとき,派生型入出力総称

指定に対する型束縛の総称引用仕様が拡張され,16.2.3 で示された要件を満足しなければならない。

後からの束縛が先の束縛と同じであるか,対応している束縛を上書きしているか,又は 対応している束縛を継承し

ているとき,型の束縛 及び その型の拡張の束縛は対応しているという。

4.5.7

派生型の値

成分値 (component value) とは,次のものとする。

(1)

ポインタ成分の成分値は,そのポインタ結合とする。

(2)

割付け成分の成分値は,その割付け状態とし,割り付けられたときは,加えてその実行時の型,型パラメタ,上

下限 及び 値とする。

(3)

ポインタ成分でもなく割付け成分でもない成分の成分値は,その成分の値とする。

特定の派生型の値の集合は,その派生型の定義に合った成分値のすべての可能な列からなる。

4.5.8

派生型指定子

派生型指定子は,特定の派生型 及び 型パラメタを指定するために複数の文脈で使われる。

R455

派生型指定子

is

型名 [ ( 型パラメタ指定並び ) ]

R456

型パラメタ指定

is

[

キーワード = ] 型パラメタ値

C476

(R455)

型名は,参照可能な派生型の名前でなければならない。

C477

(R455)

型パラメタ指定並びは,型がパラメタをもつときだけ書かなければならない。

C478

(R455)

その型の各パラメタに対応して,高々一つの型パラメタ指定が存在しなければならない。型パラ

メタが暗黙の値をもっていないとき,その型パラメタに対応する型パラメタ指定が存在しなければなら

ない。

C479

(R456)

型パラメタ指定並びの型パラメタ指定に先行する “キーワード=” を省略するときだけ,型パラメ

タ指定から “キーワード=” を省略できる。


53

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C480

(R456)

キーワードは,その型のパラメタ名でなければならない。

C481

(R456)

仮引数 若しくは 結合名の宣言 又は 仮引数の割付けのいずれかのときだけ,型パラメタ指定の

型パラメタ値として “*” を使うことができる。

型パラメタのキーワードで指定されていない型パラメタ値は,型パラメタ順序 (4.5.2.1) の型パラメタに対応する。

型パラメタのキーワードをもつとき,その値はキーワードによって名付けられる型パラメタに代入される。必要なら

ば,その値は,組込み代入の規則 (7.4.1.3) に従って,型パラメタと同じ種別の値に変換される。

型パラメタ値を指定しない型パラメタの値は,その暗黙の値とする。

4.5.9

派生型の値の構成

派生型の定義は,対応する 構造体構成子 (structure constructor) を暗黙的に定義し,これによってその派生型の値

を構成することができる。構成された値の型 及び 型パラメタは,派生型指定子によって指定される。

R457

構造体構成子

is

派生型指定子 ( [ 成分指定並び ] )

R458

成分指定

is

[

キーワード = ] 成分データ源

R459

成分データ源

is

or

データ指示先

or

手続指示先

C482

(R457)

派生型指定子には,抽象型 (4.5.6) を指定してはならない。

C483

(R457)

成分には,高々一つの成分指定を書くことができる。

C484

(R457)

成分が成分指定をもつとき,継承結合されたいかなる成分に対しても,成分指定を与えてはなら

ない。

C485

(R457)

成分は,暗黙の初期値設定をもたず,成分指定をもっているか暗黙の初期値設定をもっている他

の成分と継承結合していないとき,成分指定をもたなければならない。

C486

(R458)

その構成子中の先行する各成分指定から “キーワード=” を省略するときだけ,成分指定から “

キーワード=” を省略できる。

C487

(R458)

キーワードは,その型の成分の名前でなければならない。

C488

(R457)

型名 及び 成分指定が書かれた型のすべての成分は,構造体構成子を含んでいる有効域内で参照

可能でなければならない。

C489

(R457)

派生型指定子が総称名と同じ型名であるとき,成分指定並びは,総称引用として解決される

(12.4.4.1)

関数引用の有効な実引数指定並びであってはならない。

C490

(R459)

データ指示先は,手続ポインタではないポインタ成分に対応しなければならない。手続指示先

は,手続ポインタである成分に対応しなければならない。

C491

(R459)

データ指示先は,対応する成分と同じ次元数でなければならない。





注記 4.56

名前 (…)” の形は,可能であれば,総称関数引用として解釈される。総称関数引用として解釈

できないときだけ,構造体構成子と解釈される。





成分キーワードが存在しないとき,成分データ源には対応する成分が成分順序 (4.5.3.5) に従って代入される。成

分キーワードが存在するとき,キーワードによって名付けられた成分に式が代入される。ポインタではない成分に対

して,その成分 及び 式の宣言時の型 及び 型パラメタは,7.4.1.2 

表 7.8 で示した組込み代入文での変数 及び 式と

同様に適合しなければならない。必要ならば,その組込み型のそれぞれの値は,組込み代入の規則 (7.4.1.3) に従っ

て型 及び 型パラメタが派生型の対応する成分と一致する値に変換される。ポインタでもなく割付け成分でもない成

分に対しては,式の形状は成分の形状と適合しなければならない。


54

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

暗黙の初期値設定が存在する成分が,対応する成分データ源をもたないとき,暗黙の初期値設定が,その成分に対

して適応される。





例 4.57

定義した成分順序に親成分を書くことはないので,親成分の成分値は,成分キーワードによって

だけ指定できる。

例 4.54 で示した型を用いた,等しい値の例を示す。

! x = 1.0, y = 2.0, color = 3

という成分をもった値を生成する。

TYPE(POINT) :: PV = POINT(1.0, 2.0)

!

ここで TYPE(POINT) の成分が

!

参照可能であるとする。

...

COLOR_POINT( point=point(1,2), color=3)

!

親成分に対する値を設定する。

COLOR_POINT( point=PV, color=3)

! TYPE(point)

が非公開の成分を

!

もっているときも有効である。

COLOR_POINT( 1, 2, 3)

!

すべての TYPE(point) の成分が

!

参照可能でなければならない。





構造体構成子は,引用している型を定義する前に書いてはならない。





例 4.58

例 4.17 の派生型定義を使用した派生型定数式の例

PERSON (21, ’JOHN SMITH’)

この例は,次のように書いてもよい。

PERSON (NAME = ’JOHN SMITH’, AGE = 21)





例 4.59

例 4.24 で定義した派生型 GENERAL POINT を使った構成子の例

general_point(dim=3) ( (/ 1., 2., 3. /) )





ポインタ成分に対して,対応する成分データ源は,ポインタ代入文 (7.4.2) 中のそのようなポインタに対して許さ

れるデータ指示先 又は 手続指示先でなければならない。成分データ源がポインタのとき,成分の結合は,ポインタ

の結合とする。成分データ源がポインタでないとき,その成分は,その成分データ源とのポインタ結合とする。





例 4.60

例えば,変数 TEXT が次のとおりに宣言 (5.1) されていて,

CHARACTER, DIMENSION (1:400), TARGET :: TEXT

変数 BIBLIO が,

例 4.31 の派生型定義 REFERENCE

TYPE (REFERENCE) :: BIBLIO

を使って宣言されているとき,

BIBLIO = REFERENCE (1, 1987, 1, "This is the title of the referenced &

&paper", TEXT)

この文は有効であり,実体 BIBLIO のポインタ成分 SYNOPSIS は,指示先実体 TEXT と結合する。





派生型の成分が割付け成分である場合,対応する構成子の式は,引数をもたない組込み関数 NULL の引用であるか,

同じ次元数をもった割付け要素であるか,又は 同じ次元数の要素と評価されるかのいずれかでなければならない。そ

の式が組込み関数 NULL の引用である場合,構成子の対応する成分は,“割り付けられていない” 状態をもつ。その式

が割付け要素である場合,構成子の対応する成分は,その割付け要素と同じ割付け状態をもつ。更に割付け状態が “

割り付けられている” である場合,実行時の型,上下限 及び 値は同じとする。成分の長さ型パラメタが無指定であ

る場合,その値は,式の対応するパラメタと同じとする。その式が同じ次元数の要素と評価される場合,構成子の対

応する成分は,“割り付けられている” 割付け状態をもち,式と同じ上下限 及び 値をもつ。


55

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





注記 4.61

構成子が実引数であるとき,割付け成分の割付け状態は,結合する仮引数を通して使用可能と

なる。





4.5.10

派生型の演算 及び 代入

派生型要素の組込み代入は,7.4.1 で規定する。この規格は,派生型の要素への組込み演算は規定しない。派生型

の要素に対するどの演算 又は 利用者定義代入 (7.4.1.4) も,関数 又は サブルーチン,及び 総称引用仕様 (4.5.1

12.3.2.1)

によって明示的に定義しなければならない。

4.6

列挙体 及び 列挙子

列挙体は,列挙子の集合とする。列挙子は,整数型の名前付き定数とする。列挙体定義は,列挙体 及び その対応

する整数型の列挙子の集合を指定する。

R460

列挙体定義

is

列挙体定義文

列挙子定義文

[

列挙子定義文 ] ...

列挙体定義終了文

R461

列挙体定義文

is

ENUM , BIND ( C )

R462

列挙子定義文

is

ENUMERATOR [ :: ]

列挙子並び

R463

列挙子

is

名前付き定数 [ = スカラ整数初期値式 ]

R464

列挙体定義終了文

is

END ENUM

C492

(R462)

列挙子に = を書いたとき,列挙子並びの前に,区切りの 2 連コロンを書かなければならない。

列挙体に対して,種別は,対応する言語 C の列挙型と相互利用可能 (15.2.1) となるように選択される。対応する

言語 C の列挙型は,言語 C の列挙体指定子(言語 C の国際規格の 6.7.2.2 参照)で宣言される型とする。この列挙

体指定子は,列挙体定義で指定されたのと同じ値 及び 順序をもつ言語 C の列挙定数を指定する。

連携処理系 (2.5.10) は,同じ値を同じ順序で指定する言語 C のすべての列挙体指定子で宣言される型に対して同

じ表現を用いるものでなければならない。





注記 4.62

連携処理系が,与えられた列挙型に対して符号なしの型を用いているとき,Fortran 処理系は,

たとえ列挙子の幾つかの値が符号付き整数型では表現できないとしても,その列挙体に対して,同じ

範囲である符号付き整数型を用いる。どのような列挙体の値も,言語 C の列挙体で宣言された値と相

互利用可能となる。





注記 4.63

言語 C の国際規格は,列挙定数が言語 C の整数型(言語 C の国際規格の 6.7.2.2)に収まるこ

とを保証している。したがって,Fortran 処理系は,すべての列挙子の値を種別型パラメタ C INT を

もった整数型として評価できる。その後,対応する言語 C の列挙型と相互利用可能な整数型の種別型

パラメタを決定することができる。





注記 4.64

言語 C の国際規格は,二つの列挙型が同じ名前 及び 値を同じ順序でもつときだけ,整合性が

あると規定している。更にこの規格は,Fortran 処理系の連携処理系となる言語 C の処理系が,二つ

の列挙型の列挙定数の名前が異なっていても,値 及び 順序が同じであるときには,同じ表現を用い

ることを要求している。






56

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

列挙子は,PARAMETER 属性が明示的に宣言されたかのように扱われる。列挙子は,組込み代入 (7.4) の規則に

従って定義され,値は次のとおりに決定される。

(1)

スカラ整数初期値式が指定されている場合,列挙子の値はスカラ整数初期値式の結果の値とする。

(2)

スカラ整数初期値式が指定されていない場合であって,列挙子が列挙体定義の最初の列挙子であるとき,列挙

子の値は 0 とする。

(3)

スカラ整数初期値式が指定されていない場合であって,列挙子が列挙体定義の最初の列挙子でないとき,列挙

子の値は,列挙体定義中の直前の列挙子の値に 1 を加えた値とする。





例 4.65

列挙体定義の例

ENUM, BIND(C)

ENUMERATOR :: RED = 4, BLUE = 9

ENUMERATOR YELLOW

END ENUM

この列挙体の種別型パラメタは,処理系依存である。しかし処理系は,列挙子の値である 4,9,10 を

表現するのに十分な種別を選択しなければならない。

次の宣言は,上記の宣言と等価である。

INTEGER(SELECTED_INT_KIND(2)), PARAMETER :: RED = 4, BLUE = 9, YELLOW = 10

次の例のように,列挙子の一つを引数とした組込み関数 KIND を用いて,同じ種別型パラメタ値の

要素が宣言できる。

INTEGER(KIND(RED)) :: X





注記 4.66

列挙子の定義では,複数の ENUMERATOR 文を用いるか,一つの ENUMERATOR 文を用い

るかの違いはない。重要なのは,列挙体の定義時の列挙子の順序であり,ENUMERATOR 文の個数

ではない。





4.7

配列値の構成

配列構成子 (array constructor) は,スカラ値の列とする。配列構成子は,列中で指定された値を要素の値とする 1

次元配列として解釈される。

R465

配列構成子

is

(/

配列構成子指定 /)

or

左角括弧 配列構成子 右角括弧

R466

配列構成子指定

is

型指定子 ::

or

[

型指定子 :: ] 配列構成項目並び

R467

左角括弧

is

[

R468

右角括弧

is

]

R469

配列構成項目

is

or

配列構成 DO 形反復

R470

配列構成 DO 形反復

is

(

配列構成項目並び , 配列構成 DO 制御 )

R471

配列構成 DO 制御

is

配列構成 DO 変数 = スカラ整数式 , スカラ整数式 [ , スカラ整数式 ]

R472

配列構成 DO 変数

is

スカラ整変数

C493

(R472)

配列構成 DO 変数は,名前付き変数でなければならない。


57

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C494

(R466)

型指定子が省略されたとき,一つの配列構成子中の配列構成項目の式の型 及び 種別型パラメタ

は,すべて同じでなければならない。

C495

(R466)

型指定子が組込み型を指定するとき,一つの配列構成子中の配列構成項目の式の型は,

表 7.8 

指定したとおりに型指定子の型の変数と型が適合する組込み型でなければならない。

C496

(R466)

型指定子が派生型を指定するとき,一つの配列構成子中の配列構成項目の式の型は,その派生型

であって,型指定子で指定した型と同じ種別型パラメタ値をもたなければならない。

C497

(R470)

配列構成 DO 形反復の配列構成 DO 変数に,その配列構成 DO 形反復に含まれる配列構成 DO

形反復の配列構成 DO 変数と同じ変数を指定してはならない。

型指定子が省略されたとき,配列構成子中のすべての配列構成項目の式は同じ長さ型パラメタをもたなければなら

ない。このとき,配列構成子の型 及び 型パラメタは,配列構成項目の式と同じとする。

型指定子を書いたとき,その型指定子は,配列構成子の型 及び 型パラメタを指定する。配列構成子中の配列構成

項目の式は,その型 及び 型パラメタの変数への組込み代入と型が適合しなければならない。それぞれの値は,組込

み代入 (7.4.1.3 参照) の規則に従って配列構成子の型パラメタに変換される。

反復回数がゼロである配列構成 DO 形反復中の配列構成項目の文字長は,配列構成 DO 変数にも,初期値式ではな

い式の値にも,依存してはならない。

配列構成項目がスカラ式である場合,スカラ式の値は配列構成子の要素を指定する。配列構成項目が配列式の場合,

配列式の要素の値は,配列要素順序 (6.2.2.2) に対応して配列構成子の要素の列を指定する。配列構成項目が配列構

成 DO 形反復である場合,配列構成 DO 形反復は,DO 構文 (8.1.6.4) と同じ配列構成 DO 変数の制御に従って展開

され,配列構成子の要素の列を形成する。

配列構成 DO 形反復におけるループの初期化 及び 実行は,DO 構文と同じとする。

列が空のときは,その列は,大きさゼロの 1 次元配列を形成する。





例 4.67

組込み関数 RESHAPE (13.7.99) を用いた任意の正当な配列形状への 1 次元配列の変形

X = (/ 3.2, 4.01, 6.5 /)

Y = RESHAPE (SOURCE = [ 2.0, [ 4.5, 4.5 ], X ], SHAPE = [ 3, 2 ] )

この結果,3

× 2 の配列となる Y の値は,次のとおりになる。

2.0

3.2

4.5

4.01

4.5

6.5





例 4.68

配列構成 DO 形反復をもつ配列構成子

(/ (I, I = 1, 1075) /)

[ 3.6, (3.6/I, I = 1, N) ]





例 4.69

型定義 PERSON (

例 4.17) を参照した派生型配列値の構成

(/ PERSON (40, ’SMITH’), PERSON (20, ’JONES’) /)





例 4.70

型定義 LINE(

例 4.28)を参照し 2 次元配列を成分としてもつ派生型スカラ値の構成

LINE (RESHAPE ( (/ 0.0, 0.0, 1.0, 2.0 /), (/ 2, 2 /) ), 0.1, 1)

ここでは,組込み関数 RESHAPE を用いて,座標 (0, 0) から座標 (1, 2) までの幅 0.1cm の実線を表

現する値を構成している。






58

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 4.71

大きさがゼロの配列構成子の例

(/ INTEGER :: /)

(/ ( I, I = 1, 0) /)





例 4.72

長さ型パラメタを指定する配列構成子の例

(/ CHARACTER(LEN=7) :: ’Takata’, ’Tanaka’, ’Hayashi’ /)

この配列構成子で型指定がない場合,すべての定数が同じ文字長でなければならない。





5

データ実体の宣言 及び 指定

すべてのデータ実体は,型 及び 次元数をもち,型パラメタ 及び 実体の使用法を決定するその他の性質をもつこ

ともできる。ひとまとめにして,これらの性質をデータ実体の 属性 (attribute) という。 名前付きデータ実体の型は,

型宣言文 (type declaration statement) によって明示的に指定するか,又は その名前の第 1 文字によって暗黙的に決

定する(5.3 参照)。実体のすべての属性を一つの型宣言文に含めてもよいし,別々の宣言文で指定してもよい。





例 5.1

次の文は,INCOME 及び EXPENDITURE という名前の二つのデータ実体を整数型であると宣言する。

INTEGER :: INCOME, EXPENDITURE

次の文は,X,Y 及び Z という名前の三つのデータ実体を宣言する。

REAL, DIMENSION (-5:+5) :: X, Y, Z

これらは三つとも,基本実数型であり,下限が

5,上限が +5,大きさが 11 の 1 次元の形状明示

配列となる。





5.1

型宣言文

R501

型宣言文

is

宣言型指定子 [ [ , 属性指定子 ] ... :: ] データ要素宣言並び

R502

宣言型指定子

is

組込み型指定子

or

TYPE (

派生型指定子 )

or

CLASS (

派生型指定子 )

or

CLASS (*)

C501

(R502)

宣言型指定子において,“:” 及び “*” 以外の型パラメタ値は,宣言式でなければならない。

C502

(R502) “CLASS(

派生型指定子)” の場合,その派生型指定子には,拡張可能型を指定しなければならない。





注記 5.2

宣言型指定子は,非実行文中で使われる。型指定子は,配列構成子,SELECT TYPE 構成子 又

は ALLOCATE 文中で使われる。





C503

(R502) “TYPE(

派生型指定子)” の場合,その派生型には,抽象型(4.5.6 参照)を指定してはならない。

R503

属性指定子

is

参照許可指定子

or

ALLOCATABLE

or

ASYNCHRONOUS

or

DIMENSION (

配列形状指定 )

or

EXTERNAL

or

INTENT (

授受特性指定 )

or

INTRINSIC


59

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

or

言語束縛指定子

or

OPTIONAL

or

PARAMETER

or

POINTER

or

PROTECTED

or

SAVE

or

TARGET

or

VALUE

or

VOLATILE

R504

データ要素宣言

is

実体名 [ ( 配列形状指定 ) ] [ * 文字長 ] [ 初期値指定 ]

or

関数名 [ * 文字長 ]

C504

(R504)

データ要素宣言中に現れる “:” と “*” 以外の文字長中の型パラメタ値は,宣言式でなければな

らない。

R505

実体名

is

名前

C505

(R505)

実体名は,データ実体の名前でなければならない。

R506

初期値指定

is

=

初期値式

or

=>

空初期化

R507

空初期化

is

関数引用

C506

(R507)

関数引用は,引数なしの組込み関数 NULL の引用でなければならない。

C507

(R501)

同じ属性指定子を,一つの型宣言文中で 2 回以上指定してはならない。

C508

一つのデータ要素には,一つの有効域内で,どの属性も 2 回以上明示的に指定してはならない。

C509

(R501) CLASS

によって宣言された要素は,仮引数であるか,ALLOCATABLE 属性 又は POINTER 属

性をもっていなければならず,VALUE 属性をもってはならない。

C510

(R501) POINTER

属性 又は ALLOCATABLE 属性をもって宣言された配列は,無指定上下限並び

5.1.2.5.3 参照)の形の配列形状指定で指定しなければならない。

C511

(R501) ALLOCATABLE

属性 及び POINTER 属性をもたない関数結果としての実体名に対する配列形

状指定は,明示上下限並びでなければならない。

C512

(R501) POINTER

属性を指定したとき,ALLOCATABLE 属性,TARGET 属性, 及び INTRINSIC

属性は指定してはならない。

C513

(R501) TARGET

属性を指定したとき,POINTER 属性,EXTERNAL 属性,INTRINSIC 属性 及び

PARAMETER

属性は指定してはならない。

C514

(R501) PARAMETER

属性は,仮引数,ポインタ,割付け要素,関数 及び 共通ブロック中の実体には

指定してはならない。

C515

(R501) INTENT

属性,VALUE 属性 及び OPTIONAL 属性は,仮引数に対してだけ指定してよい。

C516

(R501) INTENT

属性は,POINTER 属性をもたない仮手続には指定してはならない。

C517

(R501) SAVE

属性は,共通ブロック中の個々の実体,仮引数,手続,関数結果,自動割付けデータ実体

及び PARAMETER 属性をもつ実体には指定してはならない。

C518

一つのデータ要素は,INTRINSIC 属性をもつとき,EXTERNAL 属性をもつことはできない。

C519

(R501)

データ要素宣言並び中の関数以外のデータ要素には,EXTERNAL 属性 及び INTRINSIC 属性

を指定してはならない。


60

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C520

(R504) “*

文字長” は,型指定が文字型である場合にだけ指定してよい。

C521

(R504)

関数名は,外部関数,組込み関数,仮手続関数,手続ポインタ 又は

文関数

の名前でなければな

らない。

C522

(R501) PARAMETER

属性(5.1.2.10 参照)があるときは,初期値指定を省略してはならない。

C523

(R501)

初期値指定を書いたとき,そのデータ要素宣言並びの前の区切りの 2 連コロンを省略してはなら

ない。

C524

(R504)

初期値指定は,実体名が仮引数,関数結果,型宣言が初期値設定プログラム単位以外にある名前

付き共通ブロック中の実体,無名共通ブロック中の実体,割付け変数,外部名,組込み名 又は 自動割付

け実体のいずれかであるならば,指定してはならない。

C525

(R504)

初期値指定に “=>” を書いたとき,実体は,POINTER 属性をもたなければならない。初期値指

定に “=” を書いたとき,実体は,POINTER 属性をもってはならない。

C526

(R501) VOLATILE

属性を指定したとき,PARAMETER 属性,INTRINSIC 属性,EXTERNAL 属性,

及び INTENT(IN) 属性は,指定してはならない。

C527

(R501) VALUE

属性を指定したとき,PARAMETER 属性,EXTERNAL 属性,POINTER 属性,ALLO-

CATABLE

属性,DIMENSION 属性,VOLATILE 属性,INTENT(INOUT) 属性 及び INTENT(OUT)

属性は,指定してはならない。

C528

(R501) VALUE

属性を指定したとき,長さ型パラメタ値は,省略するか,初期値式で指定しなければな

らない。

C529

(R501) VALUE

属性は,仮手続に対して指定してはならない。

C530

(R501) ALLOCATABLE

属性,POINTER 属性 及び OPTIONAL 属性は,手続言語束縛指定子をもつ

手続の仮引数に対して指定してはならない。

C531

(R503)

言語束縛指定子は,モジュールの宣言部にだけ書くことができる。

C532

(R501)

言語束縛指定子で宣言された要素は,相互利用可能変数(15.2 参照)でなければならない。

C533

(R501)

言語束縛指定子が NAME 指定子とともに指定された場合,データ要素宣言並びはただ一つの

データ要素宣言でなければならない。

C534

(R503) PROTECTED

属性は,モジュールの宣言部にだけ書くことができる。

C535

(R501) PROTECTED

属性は,共通ブロック中にない手続ポインタ 又は 名前付き変数に対してだけ指

定できる。

C536

(R501) PROTECTED

属性を指定したとき,INTRINSIC 属性 及び PARAMETER 属性は,指定して

はならない。PROTECTED 属性と EXTERNAL 属性を同時に指定するときは,POINTER 属性も指定

しなければならない。

C537

PROTECTED

属性をもつポインタでない実体が参照結合で参照された場合,その実体は,変数定義文

脈(16.5.7 参照) 及び ポインタ代入文中のデータ指示先 又は 手続指示先に現れてはならない。

C538

PROTECTED

属性をもつポインタである実体が参照結合で参照された場合,それは,次のいずれにも

現れてはならない。

(1)

NULLIFY

文中のポインタ実体

(2)

ポインタ代入文中のデータポインタ実体 又は 手続ポインタ実体

(3)

ALLOCATE

文中 又は DEALLOCATE 文中の割付け実体

(4)

仮引数に INTENT(OUT) 属性 又は INTENT(INOUT) 属性をもつポインタがあるような手続

を引用するとき,その仮引数に結合する実引数


61

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

一つの有効域内で個別組込み関数を識別する名前は,13.6 で規定する型をもつ。明示的な型宣言文は,必要ではな

いが,指定してもよい。型宣言文中に総称組込み関数名を書いて型を指定しても,その関数の総称性は失われない。

関数結果は,POINTER 属性 又は ALLOCATABLE 属性をもつとして宣言してよい。

配列形状指定,長さ型パラメタに対応する宣言型指定子中の型パラメタ値 又は データ要素宣言中の文字長中に現

れる宣言式は,引用仕様本体 (12.3.2.1),副プログラムの宣言部 又は FUNCTION 文の型指定子 (12.5.2.1) 以外で

は,初期値式でなければならない。データ実体が,初期値式ではない宣言式の値に依存して宣言されていて,かつ 仮

引数でないとき,その実体を 自動割付けデータ実体 (automatic data object) と呼ぶ。





注記 5.3

自動割付けデータ実体は,SAVE 文 及び DATA 文に書いてはならないし,SAVE 属性をもって

宣言したり,“= 初期値式” によって初期確定にしてはならない。





宣言型指定子 又は データ要素宣言中の文字長中の型パラメタが初期値式以外の式によって確定になったとき,そ

の型パラメタの値は,手続に入る時に定まり,手続の実行中に宣言式中の変数が再確定されたり不定になったりして

も,その影響を受けない。

データ要素宣言が初期値指定を含み,実体名が PARAMETER 属性をもたない場合,その要素は,明示的に初期化

された変数とする。変数が暗黙的初期値指定をもつ派生型でなければ,明示的な初期化を DATA 文で行うこともでき

る。初期値指定が “= 初期値式” であるとき,その実体は,組込み代入の規則(7.4.1.3 参照)に従って,型,型パラ

メタ,形状が実体名に一致するように変換された後,初期値式によって決まる値で確定になる。一つの変数 又は そ

の一部分に対して,プログラム中で 2 回以上明示的に初期値を指定してはならない。変数が配列であるとき,その変

数は,その型宣言文 又は それより前にある同じ有効域内の属性宣言文で形状が指定されていなければならない。

初期値指定が “=> 空初期化” であるとき,実体はポインタでなければならず,その初期の結合状態は空状態になる。

初期値指定をもつ実体は,名前付き共通ブロック中の実体 及び PARAMETER 属性をもつ実体を除いて,暗黙的

に保存される。この暗黙の SAVE 属性は,型宣言文中に SAVE 属性を書くこと,SAVE 文(5.2.12 参照)にその実

体名を指定すること, 又は 同じ有効域内で保存要素並びを使わずに SAVE 文で指定することによって明示的に確認

してもよい。





例 5.4

型宣言文の例を次に示す。

REAL A (10)

LOGICAL, DIMENSION (5, 5) :: MASK1, MASK2

COMPLEX :: CUBE_ROOT = (-0.5, 0.866)

INTEGER, PARAMETER :: SHORT = SELECTED_INT_KIND (4)

INTEGER (SHORT) K

!

範囲は少なくとも -9999∼9999 である。

REAL (KIND (0.0D0)) A

REAL (KIND = 2) B

COMPLEX (KIND = KIND (0.0D0)) :: C

CHARACTER (LEN=10, KIND = 2)

A

CHARACTER B, C *20

TYPE (PERSON) :: CHAIRMAN

TYPE(NODE), POINTER :: HEAD => NULL ( )

TYPE (humongous_matrix (k=8, d=1000)) :: mat

(最後の例は

例 4.24 で宣言した型を使っている。)





5.1.1

宣言型指定子

型宣言文中の 宣言型指定子 (declaration type specifier) は,データ要素宣言並び中のデータ要素に対してその型を

指定する。この明示的な型宣言は,要素名の第 1 文字によって示される暗黙の型(5.3 参照)を確認してもよいし,そ

れを上書きしてもよい。


62

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

型宣言文中の組込み型指定子は,組込み型のデータ要素に対してその型を指定する。

5.1.1.1

TYPE

指定子は,派生型のデータ要素の型を指定する。

データ要素が TYPE 指定子を用いて明示的に宣言されている場合,指定された派生型は,有効域内でそれ以前に定

義されているか 又は 参照結合か親子結合によって参照可能になっていなければならない。データ要素が関数結果で

ある場合,関数結果の型となる派生型は,関数の本体中で定義されているか 又は 参照結合 若しくは 親子結合によっ

て参照可能になっているならば,FUNCTION 文で指定してもよい。特に関数本体中で定義されている場合,指定さ

れた派生型の派生型定義の直後で,その関数の関数結果変数がその派生型で宣言されているのと同じ効果をもつ。

派生型のスカラデータ要素を構造体という。派生型が SEQUENCE の指定をもつ場合,その型をもつスカラ要素

を連続型構造体という。

5.1.1.2

クラス

プログラムの実行中に異なる型をもつことができるデータ要素を,多相的 (polymorphic) データ要素という。プ

ログラム実行中の一時点におけるデータ要素の型を 実行時の型 (dynamic type) という。データ要素の 宣言時の型

(declared type)

とは,明示的 又は 暗黙的に宣言された型のことをいう。

CLASS

指定子は,多相的実体を宣言するのに使われる。CLASS 指定子が型名を含むとき,それが多相的実体の宣

言時の型になる。

CLASS(*)

指定子で宣言された実体は,無制限多相的 (unlimited polymorphic) であるという。無制限多相的デー

タ要素は,型をもつものとして宣言しない。更に,別の無制限多相的データ要素を含む,すべての他の要素と宣言時

の型が同じであるとはみなさない。

データ要素が多相的でないとき,同一の宣言時の型をもつデータ要素だけと 型が適合する (type compatible)。多

相的データ要素が無制限多相的でなければ,型が適合するデータ要素は,同一の宣言時の型をもつものか 又は その

直接拡張型のものとする。無制限多相的データ要素は,宣言時の型をもつとはみなされない。ただし,すべてのデー

タ要素と型が適合する。データ要素がある型と “型が適合している” とは,その型のデータ要素と型が適合している

こととする。

二つのデータ要素の 型が適合しない (type incompatible) とは,双方とも,互いに型が適合していないことを指す。

データ要素が他の要素と TKR適合する (TKR compatible; type, kind, and rank compatible) とは,そのデータ要素

が対象となるデータ要素と型が適合し,両者の種別型パラメタが同一であり,更に次元数が一致していることをいう。

多相的割付け実体は,適合する型のうち任意の型のものを割り付けてよい。多相的ポインタ 又は 多相的仮引数は,

プログラムの実行中,型が適合している実体と結合してよい。

割り付けられた割付け多相的実体の実行時の型は,割付け時の型とする。結合状態にある多相的ポインタの実行時

の型は,指示先の実行時の型とする。割付け実体でなく,かつ ポインタでない多相的仮引数の実行時の型は,それが

結合している実引数の実行時の型とする。割付け状態にない割付け実体であるか 又は 空状態のポインタであるとき,

その実行時の型は,その宣言時の型とする。結合名(8.1.4)をもつ実体の実行時の型は,それが結合された選択子の

実行時の型とする。多相的でない実体の実行時の型は,その宣言時の型とする。





注記 5.5

多相的実体の宣言時の型に限り,成分を部分参照で特定できる(6.1.2 参照)。





5.1.2

属性

型宣言文の属性指定子で指定できる付加的な属性は,宣言されるデータ要素の性質 及び プログラム中での使用上

の制限を指定する。

5.1.2.1

参照許可属性

参照許可属性 (accessibility attribute) は,言語要素の参照可能性を指定する。指定は,識別子に対して行う。


63

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

R508

参照許可指定子

is

PUBLIC

or

PRIVATE

C539

(R508)

参照許可指定子は,モジュールの宣言部にだけ書くことができる。

モジュール内で指定されるか 又は 参照結合によって参照可能になっている識別子は,PUBLIC 属性 又は PRIVATE

属性をもつ。モジュール内で参照許可指定子が明示的に指定されていない識別子は,そのモジュール内での暗黙の参

照許可属性をもつ。モジュールの暗黙の参照許可属性は,公開 (PUBLIC) とする。ただし,PRIVATE 文(5.2.1 

照)で変更することができる。モジュール内で参照結合によって参照できる識別子は,PUBLIC 属性をもつものだけ

とする。





注記 5.6

識別子が参照結合によって参照できるには,それが参照先のモジュール内で PUBLIC 属性をもっ

ていなければならない。それとは別に,参照結合によって参照する側のモジュール内では PRIVATE

属性をもつことができる。この場合,PRIVATE 属性をもつモジュールからは,参照結合できない。





例 5.7

参照許可指定の例を次に示す。

REAL, PRIVATE :: X, Y, Z





5.1.2.2 ALLOCATABLE

属性

ALLOCATABLE

属性 (ALLOCATABLE attribute) をもつ実体とは,ALLOCATE 文(6.3.1 参照)又は 組込み

代入文(7.4.1.3 参照)で領域が割り付けられるもののことである。

5.1.2.3 ASYNCHRONOUS

属性

ASYNCHRONOUS

属性 (ASYNCHRONOUS attribute) は変数が非同期入出力に従うかどうかを指定する。

次の条件がいずれも満たされる場合,変数の基底実体は,有効域内で ASYNCHRONOUS 属性をもたなければなら

ない。

(1)

変数が,有効域内で,実行文 又は 宣言式中に現れている。

(2)

変数が未了入出力記憶列の作用子 (9.5.1.4) である間に,有効域内の任意の文が実行中である。

非同期入出力文 (9.5.1.4) で変数を使用することによって,暗黙のうちに ASYNCHRONOUS 属性をもつことが

ある。

実体は,ある有効域(11.2.1 及び 16.4.1.3 参照)内で ASYNCHRONOUS 属性をもたなくても,他の有効域内で

もつ場合がある。実体が ASYNCHRONOUS 属性をもつ場合,その部分実体は,すべて ASYNCHRONOUS 属性を

もつ。





注記 5.8

ASYNCHRONOUS

属性は,有効域が実行中に,未了入出力記憶列(非同期入出力が実行され

る実際の記憶場所)と結合されている変数に対して指定する。この情報は,コンパイラが,ある種の

コード移動最適化を抑止するのに使うこともできる。

ASYNCHRONOUS

属性は,VOLATILE 属性と似ている。非同期入出力がある場合のコード移動

最適化の補助情報として使うことができる。





5.1.2.4

データ要素の BIND 属性

BIND

属性 (BIND attribute) は,それを指定した変数 又は 共通ブロックが,外部結合(15.3 参照)をもつ言語

C

の変数と相互利用可能であることを指定する。

R509

言語束縛指定子

is

BIND ( C [, NAME =

スカラ文字初期値式 ] )

C540

(R509)

スカラ文字初期値式は,基本文字型の種別をもたなければならない。


64

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

スカラ文字初期値式の最初と最後の連続する空白を無視した値が,1 以上の長さであるとき,それは連携処理系の

側にとって有効な識別子でなければならない。





注記 5.9

言語 C の国際規格では,C の基本文字集合以外の文字を含む C の識別子を生成する機能を規定

している。このような C の識別子は国際文字名と呼ばれている(言語 C の国際規格の 6.4.3 参照)。

この場合,基本文字型で使われる表現方法では表現できない文字を含む可能性があり,その C のデー

タ要素は Fortran から参照できない。





BIND

属性をもつものは,自動的に SAVE 属性をもつ。ただし,SAVE 文を指定して,明示的に確認してもよい。





注記 5.10

データ要素に対して BIND 属性を指定しても,連携処理系にとって何らかの効果が現れるとは

限らない。





5.1.2.5 DIMENSION

属性

DIMENSION

属性 (DIMENSION attribute) は,データ要素が配列であることを指定する。次元数 及び 形状は,

配列形状指定がデータ要素宣言中にあればそれによって,なければ DIMENSION 属性指定子中の配列形状指定によっ

て指定する。型宣言文で配列を宣言するためには,DIMENSION 属性指定子を書くか,データ要素宣言に配列形状指

定を書かなければならない。データ要素宣言に配列形状指定を書くと,そのデータ要素に DIMENSION 属性が指定

される。これらの代わりに DIMENSION 属性を,DIMENSION 文, ALLOCATABLE 文, POINTER 文, TARGET

文 又は COMMON 文のそれぞれの単純宣言文で指定することもできる。

R510

配列形状指定

is

明示上下限並び

or

引継ぎ上下限並び

or

無指定上下限並び

or

大きさ引継ぎ配列形状指定

C541

(R510)

次元数は,最大 7 次元とする。





例 5.11

DIMENSION

属性指定の例を次に示す。

SUBROUTINE EX (N, A, B)

REAL, DIMENSION (N, 10) :: W

!

自動割付け形状明示配列

REAL A (:), B (0:)

!

形状引継ぎ配列

REAL, POINTER :: D (:, :)

!

配列ポインタ

REAL, DIMENSION (:), POINTER :: P

!

配列ポインタ

REAL, ALLOCATABLE, DIMENSION (:) :: E

!

割付け配列





5.1.2.5.1

形状明示配列

形状明示配列 (explicit-shape array) とは,明示上下限並びで宣言される名前付き配列とする。明示上下限並びは,

その配列の各次元の上下限を明示的な値で指定する。

R511

明示上下限

is

[

下限 : ] 上限

R512

下限

is

宣言式

R513

上限

is

宣言式

C542

(R511)

上下限が初期値式でない形状明示配列は,副プログラム 又は 引用仕様本体の中でだけ宣言で

きる。


65

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

自動割付け配列 (automatic array) とは,副プログラム 又は 引用仕様本体の中で宣言され,仮引数ではなく,初期

値式でない上下限をもつ形状明示配列とする。

形状明示配列が初期値式でない上下限をもつとき,その上下限 及び 配列の形状は,手続に入る時に,その上下限

の式を評価して決まる。そのような配列の上下限は,その手続の実行中に宣言式を構成する変数が再確定されたり不

定になったりしても影響を受けない。

それぞれの下限 及び 上限は,配列のそれぞれの次元の上下限 及び その次元の寸法を決定する。下限 及び 上限の

値は,正,負 又は ゼロであってよい。その次元の添字範囲は,上限が下限よりも小さくなければ,下限から上限まで

の整数値とする。上限が下限より小さいとき,添字範囲は空,その次元の寸法はゼロ,配列の大きさはゼロとする。

下限を省略したとき,その暗黙値は 1 とする。次元数は,指定した上下限の組の個数とする。

5.1.2.5.2

形状引継ぎ配列

形状引継ぎ配列 (assumed-shape array) とは,結合される実引数配列から形状を引き継ぐ,ポインタでない仮引数

配列とする。

R514

引継ぎ上下限

is

[

下限 ] :

次元数は,引継ぎ上下限並び中のコロンの個数とする。

形状引継ぎ配列の各次元の寸法は,結合している実引数配列の対応する次元の寸法とする。下限の値が であり,

結合している実引数配列の対応する次元の寸法が であれば,上限の値は d

− 1 とする。下限の値は,指定した

ときはその値とし,省略したときは 1 とする。

5.1.2.5.3

形状無指定配列

形状無指定配列 (deferred-shape array) とは,割付け配列 又は 配列ポインタとする。

割付け配列 (allocatable array) とは,ALLOCATABLE 属性 及び 指定された次元数をもつ配列とする。その上下

限 及び 形状は,割付け時 又は 引数結合時に決まる。

ALLOCATABLE

属性をもつ配列は,無指定上下限並びを用いて宣言しなければならない。

配列ポインタ (array pointer) は,POINTER 属性 及び 指定された次元数をもつ配列とする。その上下限 及び 形

状は,指示先に結合される時に決まる。POINTER 属性をもつ配列は,無指定上下限並びを用いて宣言しなければな

らない。

R515

無指定上下限

is

:

次元数は,無指定上下限並び中のコロンの個数とする。

割り付けられていない割付け配列 及び 空状態の配列ポインタの大きさ,上下限 及び 形状は,不定とする。その

ような配列のいかなる部分も,確定してはならないし引用してもならない。ただし,13.1 で指定する組込み問合せ関

数の引数としては書いてもよい。

割付け配列の各次元の下限 及び 上限の値は,配列を割り付けた時に指定した値とする。

配列ポインタの各次元の上下限は,次の二つの方法で指定できる。

(1) ALLOCATE

文 (6.3.1) で指示先を割り付ける時に指定する。

(2)

ポインタ代入 (7.4.2) で指定する。

配列指示先 及び 割付け配列の上下限は,上下限の宣言式中の変数が後で再確定されたり不定になったりしても影

響を受けない。

5.1.2.5.4

大きさ引継ぎ配列

大きさ引継ぎ配列 (assumed-size array) は,結合される実引数からその大きさを引き継ぐ仮引数配列とする。次元

数 及び 寸法は,実引数配列と仮引数配列との間で異なっていてもよく,実引数配列の大きさだけが,仮引数配列に

引き継がれる。大きさ引継ぎ配列は,大きさ引継ぎ配列形状指定を用いて宣言しなければならない。


66

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

R516

大きさ引継ぎ配列形状指定

is

[

明示上下限並び , ] [ 下限 : ] *

C543

大きさ引継ぎ配列形状指定は,仮引数の配列上下限の宣言以外に現れてはならない。

C544

INTENT(OUT)

属性をもつ大きさ引継ぎ配列は,多相的であってはならず,後始末可能な型,割付け可

能な末端成分をもつ型,及び 暗黙的初期値指定が指定された型であってはならない。

大きさ引継ぎ配列の大きさの決定は,次による。

(1)

大きさ引継ぎ配列と結合される実引数が基本文字型以外の型の配列であるとき,大きさは,実引数配列の大きさ

とする。

(2)

大きさ引継ぎ配列と結合される実引数が基本文字型以外の型の配列要素であり,それが大きさ の配列中の添字

順序値(6.2.2.2 参照)の要素であるとき,大きさは,x

− r + 1 とする。

(3)

実引数が基本文字型の配列,基本文字型の配列要素 又は 基本文字型の配列要素部分列(6.1.1 参照)であり,そ

れが 文字記憶単位をもつ配列の第 文字記憶単位から始まるとき,その大きさは MAX(INT((c

− t + 1)/e)0)

とする。ここで は,文字型仮配列の要素の長さとする。

(4)

実引数が配列要素 又は 配列要素部分列特定子ではない基本文字型スカラであるとき,仮配列の大きさは MAX(INT

(l/e)0)

であるとする。ここで は,文字型仮配列の要素の長さとし,は,実引数の長さとする。

次元数は,明示上下限の個数に 1 を足した数とする。

大きさ引継ぎ配列は,最後の次元の上限をもたない。したがって,最後の次元の寸法 及び 形状をもたない。大き

さ引継ぎ配列名は,形状を要求しない手続引用の実引数として以外,全体配列の引用を書いてはならない。

次元数 n > 1 であるとき,最初の n

− 1 次元の上下限は,大きさ引継ぎ配列形状指定があれば,その中で明示上下

限並びによって指定した値とする。最後の次元の下限は,指定したときはその値とし,省略したときは 1 とする。大

きさ引継ぎ配列には,添字 又は 部分配列添字(6.2.2.3 参照)を指定してもよい。最後の次元に添字三つ組を指定す

るときは,上限を省略してはならない。

大きさ引継ぎ配列が初期値式でない上下限をもつとき,その上下限は,手続に入る時に決まる。そのような配列の

上下限は,その手続の実行中に任意の変数が再確定されたり不定になったりしても影響を受けない。

5.1.2.6 EXTERNAL

属性

EXTERNAL

属性 (EXTERNAL attribute) は,宣言された関数名が,外部関数,仮関数,手続ポインタ 又は 初

期値設定副プログラムであることを指定する。この属性は,EXTERNAL 文 (12.3.2.2),手続宣言文 (12.3.2.3),又

は 抽象引用仕様宣言の中にない引用仕様本体 (12.3.2.1) でも宣言できる。

実引数として使われるか 又は 手続ポインタ代入の指示先になっている外部手続 又は 仮手続は,EXTERNAL 属

性をもつものとして宣言しなければならない。

EXTERNAL

属性と POINTER 属性の両方をもつ手続は,手続ポインタとする。

5.1.2.7 INTENT

属性

INTENT

属性 (INTENT attribute) は,仮引数の授受特性 (intent) を指定する。

R517

授受特性指定

is

IN

or

OUT

or

INOUT

C545

(R517) INTENT(IN)

属性をもつポインタでない実体は,変数確定文脈(16.5.7 参照)に現れてはなら

ない。

C546

(R517) INTENT(IN)

属性をもつポインタ実体は,次の箇所に現れてはならない。

(1)

NULLIFY

文中のポインタ実体

(2)

ポインタ代入文中のデータポインタ実体 又は 手続ポインタ実体


67

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

(3)

ALLOCATE

文 又は DEALLOCATE 文中の割付け実体

(4)

仮引数に INTENT(OUT) 属性 又は INTENT(INOUT) 属性をもつポインタがあるような手続を

引用するとき,その仮引数に結合する実引数

INTENT(IN)

属性をポインタでない仮引数に指定すると,手続の実行中に,その仮引数を再確定したり不定にした

りしてはならないことを指定する。INTENT(IN) 属性をポインタである仮引数に書くと,手続の実行中に,その仮引

数の結合を変更してはならないことを指定する。ただし,指示先がポインタを通さずに解放されたときには,不定に

なることはある(16.4.2.1.3 参照)。

INTENT(OUT)

属性をポインタでない仮引数に指定すると,手続の実行中にその仮引数を,引用するより前に確

定しなければならず,かつ その仮引数と結合する実引数が確定可能でなければならないことを指定する。手続の呼出

し時には,そのような仮引数は,暗黙的初期値指定された派生型実体の成分を除いて不定とする。INTENT(OUT) 属

性をポインタである仮引数に書くと,手続の呼出し時に,その仮引数のポインタ結合状態が不定になることを指定す

る。そのようなポインタ仮引数と結合される実引数は,ポインタ変数でなければならない。

INTENT(INOUT)

属性をポインタでない仮引数に指定すると,その仮引数が,手続を呼び出した有効域からデー

タを受け取ったり,そこへデータを返したりできることを指定する。このとき,仮引数は引用しても,確定してもよ

い。そのような仮引数と結合する実引数は,確定可能でなければならない。INTENT(INOUT) 属性をポインタであ

る仮引数に書くと,その仮引数が,手続を呼び出した有効域からポインタ結合されたデータを受け取ったり,そこへ

ポインタ結合されたデータを返したりできることを指定する。そのようなポインタ仮引数と結合される実引数は,ポ

インタ変数でなければならない。

INTENT

属性を指定しないと,仮引数の使用は,結合される実引数によって制限を受ける(12.4.1.212.4.1.4

参照)。





例 5.12

INTENT

属性指定の例を次に示す。

SUBROUTINE MOVE (FROM, TO)

USE PERSON_MODULE

TYPE (PERSON), INTENT (IN) :: FROM

TYPE (PERSON), INTENT (OUT) :: TO





INTENT

属性をもつ実体の部分実体は,すべて元の実体と同じ INTENT 属性をもつ。





注記 5.13

仮引数がポインタを成分にもつ構造体であるとき,そのポインタは,ポインタとしては仮引数

の部分実体であるが,その指示先はそうではない。したがって,それがポインタとして使われている

文脈では,仮引数の部分実体についての制限が適用されるが,参照はずし (dereference) されて指示先

を示す文脈では,その制限は適用されない。例えば,X が整数型ポインタの成分 P を含む派生型の仮

引数であり,かつ X が INTENT(IN) 属性をもっているとき,X%P => NEW_TARGET は禁止されるが,

X%P = 0

は許される。ただし,X%P は,確定可能な指示先に結合されているものとする。

同様に,ポインタである仮引数に対する INTENT 属性の制限は,仮引数との結合だけに適用され,

指示先に対する操作を制限するものではない。






68

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





注記 5.14

引数に対する授受特性の指定は,仮引数の使用の意図を記述する以外の用途にも使用することが

できる。処理系は,INTENT(IN) 属性をもつ仮引数が再確定される可能性のある使われ方をしているか

の検査ができる。また,INTENT(OUT) 属性をもつ仮引数が確定される前に引用されるかどうかの検査

も可能である。手続が明示的引用仕様をもっていれば,INTENT(OUT) 属性 又は INTENT(INOUT)

属性をもつ仮引数に対応する実引数が確定可能かどうかも検証できる。更に,INTENT(IN) 属性を

もっている仮引数に対応する実引数は変更されることはないという事実 及び INTENT(OUT) 属性を

もつ仮引数に対応する実引数の手続呼出し前の値は引用されることはなく,したがって捨ててよいと

いう事実を使って,引用有効域の翻訳最適化に使うことも可能である。

INTENT(OUT)

属性は,それをもつ変数の手続の呼出し後の値が,呼出し前の値によらず,その手

続を実行した結果によることを意味する。引数が,再確定されずに,呼出し前の値を保持する可能性

がある場合は,INTENT(OUT) 属性よりも INTENT(INOUT) 属性を指定するのがよい。仮引数の

値を明示的に引用する場面がなくても,そうするのがよい。INTENT(OUT) 属性をもつ変数は,手

続に入った時点で不定になったとみなすので,その時点で,変数の型に対して指定された暗黙の初期

化が行われる。

INTENT(INOUT)

属性は,INTENT 属性を省略したものと等価ではない。INTENT(INOUT) 属

性をもつ仮引数に対応する実引数は常に確定可能でなければならないが,INTENT 属性をもたない仮

引数に対応する実引数は,仮引数が実際に再確定された場合にだけ確定可能であることが要求される。





5.1.2.8 INTRINSIC

属性

INTRINSIC

属性 (INTRINSIC attribute) は,宣言された関数名が,組込み関数の個別名 (13.6) 又は 総称名 (13.5)

であることを指定する。それが 13.6 に列挙された

• 印のない個別名であるときにはその名前を実引数として使用で

きることを指定する(12.4 参照)。

総称名をもつ組込み関数に INTRINSIC 属性を指定しても,その名前は総称名のままとする。

組込み手続 (13.6) の個別名を実引数として用いる場合,その名前は,INTRINSIC 属性をもつことを明示的に指定

されていなければならない。

C547

(R503)(R1216)

総称組込み手続の名前が明示的に INTRINSIC 属性をもつと宣言され,更にそれが,同

一の有効域内で参照可能な一つ以上の総称引用仕様 (12.3.2.1) の総称名でもあるとき,引用仕様内の手

続 及び 個別名をもつ組込み手続は,すべて関数 又は すべてサブルーチンでなければならない。個別名

である組込み手続と引用仕様内の手続は,16.2.3 のとおり特性が異なる。

5.1.2.9 OPTIONAL

属性

OPTIONAL

属性 (OPTIONAL attribute) は,その仮引数が,手続の引用において必ずしも実引数と結合しなく

てもよいことを指定する(12.4.1.6 参照)。組込み関数 PRESENT を用いて,OPTIONAL 属性をもつ仮引数が実引数

と結合しているかどうかを調べることができる。

5.1.2.10 PARAMETER

属性

PARAMETER

属性 (PARAMETER attribute) は,データ要素が名前付き定数であることを指定する。指定した

名前の実体は,必要なら組込み代入の規則(7.4.1.3 参照)に従って型,型パラメタ,形状が実体名に一致するように

変換された後,等号の右辺に書いた初期値式から決まる値で確定になる。

名前付き定数は,同じ文において以前に定義されているか,それより前の文で定義されているか,又は 参照結合

若しくは 親子結合によって参照可能にされているのでなければ,引用してはならない。


69

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 5.15

PARAMETER

属性をもった宣言の例を次に示す。

REAL, PARAMETER :: ONE = 1.0, Y = 4.1 / 3.0

INTEGER, DIMENSION (3), PARAMETER :: ORDER = (/ 1, 2, 3 /)

TYPE(NODE), PARAMETER :: DEFAULT = NODE(0, NULL ( ))





5.1.2.11 POINTER

属性

POINTER

属性 (POINTER attribute) をもつ実体は,プログラムの実行中に別のデータ実体 又は 手続と結合す

ることができる。ポインタは,データポインタ 又は 手続ポインタとする。手続ポインタは 12.3.2.3 による。

データポインタは,引用可能 又は 確定可能な指示先実体と結合されない限り,引用も確定もしてはならない。

データポインタが結合され,ポインタに無指定型パラメタがあれば,その値は,指示先の対応する型パラメタの値

になる。

手続ポインタは,指示先の手続とポインタ結合されない限り,引用してはならない。





例 5.16

POINTER

属性指定の例を次に示す。より現実的な例を C.2.1 に示す。

TYPE (NODE), POINTER :: CURRENT, TAIL

REAL, DIMENSION (:, :), POINTER :: IN, OUT, SWAP





5.1.2.12 PROTECTED

属性

PROTECTED

属性 (PROTECTED attribute) は,モジュールの要素の使用に関する制限を指定する。

PROTECTED

属性を指定された要素がある場合,それが指定されたモジュール内の場合を除き,次のいずれかが

成り立たなければならない。

(1)

ポインタでない実体の場合,確定可能であってはならない。

(2)

ポインタの場合,指示先がポインタを通して解放する以外の方法で解放され不定になるか,又は 指示先が RETURN

文 若しくは END 文の実行によって不定になる場合を除いて,ポインタの結合状態は,変更してはならない。

実体が PROTECTED 属性をもっていれば,その部分実体もすべて PROTECTED 属性をもつ。





例 5.17

PROTECTED

属性の例を示す。

MODULE temperature

REAL, PROTECTED ::temp_c, temp_f

CONTAINS

SUBROUTINE set_temperature_c(c)

REAL, INTENT(IN) :: c

temp_c = c

temp_f = temp_c*(9.0/5.0) + 32

END SUBROUTINE

END MODULE

temp c

と temp f に PROTECTED 属性を指定することによって,set temperature c 以外に,そ

れらを変更できないことを保証し,その結果,両者の関係の整合性が取れることになる。





5.1.2.13 SAVE

属性

副プログラムの有効域内で SAVE 属性 (SAVE attribute) をもって宣言された要素は,RETURN 文 又は END 文

の実行後も結合状態,割付け状態,定義状態 及び 値を保持する。ただし,要素がポインタであって,RETURN 文

又は END 文の実行後その指示先が不定になる場合(16.4.2.1.3 (4) 参照)を除く。その要素は,その副プログラム

のすべての分身(12.5.2.3 参照)によって共有される。

モジュールの有効域内で SAVE 属性をもって宣言された要素は,要素がポインタであってその指示先が不定になる


70

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

場合を除いて,そのモジュールを参照した手続が RETURN 文 又は END 文を実行した時の結合状態,割付け状態,

定義状態 及び 値を保持する。

SAVE

属性をもつ要素を 保存要素 (saved entity) と呼ぶ。SAVE 属性をもたない要素を 非保存要素 (unsaved entity)

と呼ぶ。

SAVE

属性は,主プログラム内の宣言に書いてもよいが,効果はない。

5.1.2.14 TARGET

属性

TARGET

属性 (TARGET attribute) をもつ実体は,ポインタ結合(7.4.2 参照)できる。参照可能なポインタを,

TARGET

属性をもたない実体にポインタ結合してはならない。





注記 5.18

TARGET

属性を明示的に指定した変数のほかに,ポインタの割付け (6.3.1.2) によって生成さ

れた実体も TARGET 属性をもつ。





実体が TARGET 属性をもつ場合,その部分実体でポインタでないものは,すべて TARGET 属性をもつ。





例 5.19

TARGET

属性指定の例を次に示す。より現実的な例を C.2.2 に示す。

TYPE (NODE), TARGET :: HEAD

REAL, DIMENSION (1000, 1000), TARGET :: A, B





注記 5.20

実体特定子の先頭が指示先の実体である場合,それは TARGET 属性 又は POINTER 属性を

もつことになる。特定子がポインタである場合,その特定子は元の指示先の実体の部分実体である保

証はない。しかし,ポインタは,指示先だけを指している場合もあるので,ポインタの指す実体の最

後が指示先でなく,かつ ポインタでもないという保証はできない。





5.1.2.15 VALUE

属性

VALUE

属性 (VALUE attribute) は,仮引数に対する引数結合(12.4.1.2 参照)の種類を指定する。

5.1.2.16 VOLATILE

属性

VOLATILE

属性 (VOLATILE attribute) は,プログラムで指示した以外の方法で,実体が,引用され,確定され

又は 不定になる可能性があることを指定する。

実体は,他の有効域内で VOLATILE 属性をもたなくても,ある特定の有効域内で VOLATILE 属性をもつことが

ある(11.2.1 及び 16.4.1.3 参照)。実体が VOLATILE 属性をもつ場合,その部分実体はすべて VOLATILE 属性を

もつ。





注記 5.21

Fortran

処理系は,VOLATILE 属性をもつ実体の値が要求された場合は,直近に確定された値

を使うのが望ましい。同じ考えに基づき,Fortran 側での直近の定義が利用可能になっているのが望ま

しい。Fortran 以外の処理系との相互作用をどう管理するかについては,プログラマ側の責任である。





VOLATILE

属性をもつポインタは,更に結合状態 及び 配列上下限がプログラムで指示した以外の方法で変更され

る可能性がある。





注記 5.22

ポインタの指示先が,プログラムで指示した以外の方法で,引用され,確定され 又は 不定に

なり,その一方で,ポインタが指示先と結合されている場合,ポインタは VOLATILE 属性をもって

いなければならない。通常,ポインタは,指示先が VOLATILE 属性をもっていれば,VOLATILE

属性をもつのが望ましい。同様にして,EQUIVALENCE 文で共有された記憶列は,そのうち一つが

VOLATILE

属性をもっていれば,全体も VOLATILE 属性をもつのが望ましい。






71

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

VOLATILE

属性をもつ割付け実体は,更に割付け状態,実行時の型,型パラメタ 及び 配列上下限も,プログラム

で指示した以外の方法で変更される可能性がある。

5.2

属性宣言文

型を除くすべての属性は,型とは独立に,別々の属性宣言文を用いて言語要素に対して指定できる。個々の言語要

素に対して指定できる属性の組合せは,どのように指定する場合にも,型宣言文に対して規定したのと同じ制限を受

ける。このことは,手続宣言文,EXTERNAL 文 及び INTRINSIC 文にも適用する。

5.2.1

参照許可宣言文

R518

参照許可宣言文

is

参照許可指定子 [ [ :: ] 参照対象並び ]

R519

参照対象

is

参照対象名

or

総称指定

C548

(R518)

参照許可宣言文は,モジュールの宣言部にだけ書くことができる。参照対象並びを省略した参照

許可宣言文は,一つのモジュールの宣言部内に高々一つ指定できる。

C549

(R519)

それぞれの参照対象名は,名前付き変数,手続,派生型,名前付き定数 又は 変数群の名前でな

ければならない。

参照対象並びのある参照許可宣言文は,並び中の言語要素が 公開(PUBLIC)であるか 非公開(PRIVATE)であるか

の参照許可属性(5.1.2.1 参照)を指定する。参照対象並びのない参照許可宣言文は,そのモジュールの宣言部にあっ

て参照許可属性をもちうるすべての識別子に対する暗黙の参照許可属性を指定する。参照対象並びのない PUBLIC 文

は,暗黙の参照許可属性を PUBLIC 属性と指定する。参照対象並びのない PRIVATE 文は,暗黙の参照許可属性を

PRIVATE

属性と指定する。モジュール内にこれらの文がないとき,暗黙の参照許可属性は,PUBLIC 属性になる。





例 5.23

参照許可宣言文の例を次に示す。

MODULE EX

PRIVATE

PUBLIC :: A, B, C, ASSIGNMENT (=), OPERATOR (+)





5.2.2 ALLOCATABLE

R520

ALLOCATABLE

is

ALLOCATABLE [ :: ]

実体名 [ ( 無指定上下限並び ) ]

[ ,

実体名 [ ( 無指定上下限並び ) ] ] ...

この文は,並び中の実体に対して ALLOCATABLE 属性(5.1.2.2 参照)を指定する。





例 5.24

ALLOCATABLE

文の例を次に示す。

REAL A, B (:), SCALAR

ALLOCATABLE :: A (:, :), B, SCALAR





5.2.3 ASYNCHRONOUS

R521

ASYNCHRONOUS

is

ASYNCHRONOUS [ :: ]

実体名並び

この文は,並び中の実体に対して,ASYNCHRONOUS 属性(5.1.2.3 参照)を指定する。

5.2.4 BIND

R522

BIND

is

言語束縛指定子 [ :: ] 束縛要素並び

R523

束縛要素

is

要素名

or

/

共通ブロック名 /


72

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C550

(R522) BIND

文中の束縛要素に要素名が含まれる場合,その BIND 文は,モジュールの宣言部に現れな

ければならず,その要素は相互利用可能変数でなければならない(15.2.4 及び 15.2.5 参照)。

C551

(R522)

言語束縛指定子が NAME 指定子である場合,束縛要素並び中の要素は,1 個だけとする。

C552

(R522)

束縛要素が共通ブロックである場合,その中の各変数は,相互利用可能でなければならない

15.2.4 及び 15.2.5 参照)。

この文は,並び中の変数や共通ブロックに対して,BIND 属性 (5.1.2.4) を指定する。

5.2.5 DATA

DATA

文 (DATA statement) は,明示的初期値指定を行う(5.1 参照)。

R524

DATA

is

DATA

初期化対応 [ [ , ] 初期化対応 ] ...

一つの変数 又は その一部分に対して,プログラム中で明示的初期値指定を 2 回以上してはならない。ポインタで

ない実体に対する型定義に暗黙的初期値指定があるとき,その実体を初期化項目として書いてはならない。

DATA

文中の前もって型宣言されていない変数は,その後,暗黙の型規則を確認する型宣言に書いてもよい。DATA

文に書いた配列名,部分配列 又は 配列要素は,その配列の性質が前もって宣言されていなければならない。

名前付き共通ブロック中の変数を除き,名前付き変数は,その一部分でも DATA 文で初期化されていれば SAVE

属性をもつ。これを SAVE 文 又は SAVE 属性をもつ型宣言文で確認してもよい。

R525

初期化対応

is

初期化項目並び / 初期値表現並び /

R526

初期化項目

is

変数

or

初期化 DO 形反復

R527

初期化 DO 形反復

is

(

初期化 DO 形項目並び , 初期化 DO 変数 = スカラ整数式 ,

スカラ整数式 [ , スカラ整数式 ] )

R528

初期化 DO 形項目

is

配列要素

or

スカラ構造体成分

or

初期化 DO 形反復

R529

初期化 DO 変数

is

スカラ整変数

C553

(R526)

初期化項目である変数において,添字,部分配列添字,部分列開始位置 及び 部分列終了位置は,

初期値式でなければならない。

C554

(R526)

初期化項目並び中 又は 初期化 DO 形項目並び中に特定子を書いた変数は,仮引数,参照結合 若

しくは 親子結合によって参照可能な変数,DATA 文が初期値設定プログラム単位以外にある名前付き共

通ブロックの変数,無名共通ブロックの変数,関数名,関数結果名,自動割付け実体 又は 割付け変数で

あってはならない。

C555

(R526)

初期化項目として書く初期化 DO 形項目 又は 変数は,ポインタ実体の実体特定子であってはな

らない。

C556

(R529)

初期化 DO 変数は,名前付き変数でなければならない。

C557

(R527)

初期化 DO 形反復のスカラ整数式は,定数,部分定数 及び 外側を囲む初期化 DO 形反復の DO

変数だけを一次子とする式でなければならない。各演算は,組込みでなければならない。

C558

(R528)

配列要素は,変数でなければならない。

C559

(R528)

スカラ構造体成分は,変数でなければならない。

C560

(R528)

スカラ構造体成分は,添字並びをもつ部分参照を少なくとも一つ含まなければならない。


73

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C561

初期化 DO 形項目である配列要素 又は スカラ構造体成分において,各添字は,定数,部分定数 又は そ

の初期化 DO 形反復 若しくは 外側を囲む初期化 DO 形反復の DO 変数だけを一次子とする式でなけれ

ばならない。各演算は,組込みでなければならない。

R530

初期値表現

is

[

初期値反復数 * ] 初期値定数

R531

初期値反復数

is

スカラ整定数

or

スカラ整部分定数

C562

(R531)

初期値反復数は,正 又は ゼロでなければならない。初期値反復数が名前付き定数であるとき,

それは,同じ有効域内で前もって宣言されているか,又は 参照結合 若しくは 親子結合によって参照可

能になっていなければならない。

R532

初期値定数

is

スカラ定数

or

スカラ部分定数

or

任意符号付き整定数表現

or

任意符号付き実定数表現

or

空初期化

or

構造体構成子

C563

(R532) DATA

文中の定数値が名前付き定数 又は 構造体構成子であるとき,名前付き定数 及び 派生型

は,その有効域内で既に宣言されているか参照結合 又は 親子結合で参照できなければならない。

C564

(R532)

初期値定数が構造体構成子であるとき,各成分は,初期値式でなければならない。

R533

整部分定数

is

部分定数

C565

(R533)

整部分定数は,整数型でなければならない。

R534

部分定数

is

特定子

C566

(R534)

部分定数は,定数の部分実体でなければならない。

C567

(R534)

すべての添字,部分列開始位置 及び 部分列終了位置は,初期値式でなければならない。

初期化項目並びは,展開されてポインタ 及び スカラ変数の列(以降の文中では “変数の展開列” と呼ぶ。)になる。

初期化項目並び中に書いた添字なしのポインタでない配列名は,配列要素順序(6.2.2.2 参照)に従った配列要素全

体の列と等価とする。部分配列も,配列要素順序に従ったその配列要素の列と等価とする。初期化 DO 形反復は,DO

構文(8.1.6.4 参照)と同じ手順で,DO 変数の制御に従って展開されて,配列要素 又は 構造体成分の列になる。

初期値表現並びは,展開されて初期値定数の列になる。初期値反復数は,続く初期値定数を列の中に指定回数だけ

繰り返す。省略したときは,反復数を 1 とする。

大きさゼロの配列 及び 繰返し回数がゼロである DO 形反復は,変数の展開列中に変数を与えないが,長さゼロの

スカラ文字変数は,列中に変数を与える。反復数がゼロである初期値定数は,スカラ初期値定数の展開列中に初期値

定数を与えない。

変数の展開列と初期値定数の展開列とは,1 対 1 に対応する。各初期値定数は,対応する変数の初期値 又は 空初

期化を指定する。二つの展開列の長さは,同じでなければならない。

初期値定数が空初期化であるとき,かつそのときに限り,対応する初期化項目は,POINTER 属性をもたなければ

ならない。初期化項目がポインタである場合,その初期結合状態は,空状態とする。

空初期化でない初期値定数は,組込み代入の規則(7.4.1.2 参照)に従って,対応する変数に適合可能でなければ

ならない。その変数は,組込み代入の規則に従って初期値定数の値で初期確定になる。必要ならば,値は,組込み代

入文の規則 (7.4.1.3) に従って,対応する変数に,型,型パラメタ 及び 形状が適合するように変換される。


74

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

初期値定数が非 10 進定数表現であるとき,対応する変数は,整数型でなければならない。非 10 進定数表現である

初期値定数は,処理系の最大の 10 進指数範囲をもつ表現方法を指定する種別の,整定数表現であるかのように扱わ

れる。





例 5.25

DATA

文の例を次に示す。

CHARACTER (LEN = 10) NAME

INTEGER, DIMENSION (0:9) :: MILES

REAL, DIMENSION (100, 100) :: SKEW

TYPE (NODE), POINTER :: HEAD_OF_LIST

TYPE (PERSON) MYNAME, YOURNAME

DATA NAME / ’JOHN DOE’ /, MILES / 10*0 /

DATA ((SKEW (K, J), J = 1, K), K = 1, 100) / 5050 * 0.0 /

DATA ((SKEW (K, J), J = K + 1, 100), K = 1, 99) / 4950 * 1.0 /

DATA HEAD_OF_LIST / NULL() /

DATA MYNAME / PERSON (21, ’JOHN SMITH’) /

DATA YOURNAME % AGE, YOURNAME % NAME / 35, ’FRED BROWN’ /

文字変数 NAME は,定数の長さが変数の長さより短いので,右側に空白詰めされた JOHN DOE と

いう値に初期化される。整数型配列 MILES の 10 個の要素すべては,ゼロに初期化される。2 次元配

列 SKEW は,対角要素を含む下三角部がゼロに,上三角部が 1 に初期化される。構造体 MYNAME 及び

YOURNAME

は,

例 4.17 の派生型 PERSON を使って宣言されている。ポインタ HEAD OF LIST は,例

4.36

の派生型 NODE を使って宣言されていて,初期に空状態になる。MYNAME は,構造体構成子で初

期化される。YOURNAME は,各成分の値を別々に与えて初期化される。





5.2.6 DIMENSION

R535

DIMENSION

is

DIMENSION [ :: ]

配列名 ( 配列形状指定 ) [ , 配列名 ( 配列形状指定 ) ] ...

この文は,並び中の実体に対して DIMENSION 属性(5.1.2.5 参照)及び 配列の性質を指定する。





例 5.26

DIMENSION

文の例を次に示す。

DIMENSION A (10), B (10, 70), C (:)





5.2.7 INTENT

R536

INTENT

is

INTENT (

授受特性指定 ) [ :: ] 仮引数名並び

この文は,並び中の仮引数に対して INTENT 属性(5.1.2.7 参照)を指定する。





例 5.27

INTENT

文の例を次に示す。

SUBROUTINE EX (A, B)

INTENT (INOUT) :: A, B





5.2.8 OPTIONAL

R537

OPTIONAL

is

OPTIONAL [ :: ]

仮引数名並び

この文は,並び中の仮引数に対して OPTIONAL 属性(5.1.2.9 参照)を指定する。





例 5.28

OPTIONAL

文の例を次に示す。

SUBROUTINE EX (A, B)

OPTIONAL :: B






75

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

5.2.9 PARAMETER

PARAMETER

文 (PARAMETER statement) は,並び中の名前付き定数に対して PARAMETER 属性(5.1.2.10

参照)及び 値を指定する。

R538

PARAMETER

is

PARAMETER (

名前付き定数定義並び )

R539

名前付き定数定義

is

名前付き定数 = 初期値式

名前付き定数は,型,型パラメタ 及び 形状をもち,それらはその宣言部で前もって宣言するか,又は 暗黙の型規

則(5.3 参照)に従うかしていなければならない。名前付き定数の型が暗黙の型規則によっているならば,その後の

宣言部での宣言は,その暗黙の型 及び 暗黙の型パラメタ値を確認するものでなければならない。

それぞれの名前付き定数は,組込み代入規則(7.4.1.3 参照)に従って,等号の右辺の初期値式によって与えられる

値で確定になる。必要ならば,値は,組込み代入文の規則(7.4.1.3 参照)に従って,対応する名前付き定数に,型,

型パラメタ 及び 形状が適合(5.1.1.2 参照)するように変換される。





例 5.29

PARAMETER

文の例を次に示す。

PARAMETER (MODULUS = MOD (28, 3), NUMBER_OF_SENATORS = 100)





5.2.10 POINTER

R540

POINTER

is

POINTER [ :: ]

ポインタ宣言並び

R541

ポインタ宣言

is

実体名 [ ( 無指定上下限並び ) ]

or

手続要素名

C568

(R541)

手続要素名には,EXTERNAL 属性 (5.1.2.6) を明示的に指定しなければならない。

この文は,並び中の実体 及び 手続要素に対して POINTER 属性(5.1.2.11 参照)を指定する。





例 5.30

POINTER

文の例を次に示す。

TYPE (NODE) :: CURRENT

POINTER :: CURRENT, A (:, :)





5.2.11 PROTECTED

R542

PROTECTED

is

PROTECTED [ :: ]

要素名並び

この文は,並び中の要素に対して PROTECTED 属性(5.1.2.12 参照)を指定する。

5.2.12 SAVE

R543

SAVE

is

SAVE [ [ :: ]

保存要素並び ]

R544

保存要素

is

実体名

or

手続ポインタ名

or

/

共通ブロック名 /

R545

手続ポインタ

is

名前

C569

(R545)

手続ポインタ名は,手続ポインタの名前でなければならない。

C570

(R543)

保存要素並びを省略した SAVE 文が有効域内にあるとき,同じ有効域内に,ほかに明示的な SAVE

属性 又は SAVE 文があってはならない。

保存要素並びのある SAVE 文は,並び中で指定された要素 又は 並び中で指定された共通ブロックに含まれる要素

に対して SAVE 属性(5.1.2.13 参照)を指定する。保存要素並びのない SAVE 文は,その有効域内のすべての可能

な項目を指定したかのように扱われる。


76

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

ある共通ブロック名を,プログラム中の主プログラム以外の有効域内の SAVE 文に指定したとき,主プログラムの

有効域を除いて,その共通ブロックが現れるすべての有効域内で,その共通ブロック名を SAVE 文に指定しなければ

ならない。SAVE 文で宣言した共通ブロックにおいて,RETURN 文 又は END 文が実行された時の共通ブロック記

憶列(5.5.2.1 参照)中の値は,プログラムの実行系列中で次にその共通ブロック名を指定している有効域 又は その

共通ブロックを参照する有効域で用いることができる。名前付き共通ブロックを主プログラムの有効域内で指定した

とき,共通ブロック記憶列の現在の値は,その名前付き共通ブロックを指定している,それぞれの有効域で用いるこ

とができる。名前付き共通ブロック記憶列中の各要素の定義状態は,その共通ブロック記憶列に対してそれまでにな

された結合によって決まる。

SAVE

文は,主プログラム内の宣言部に書いてもよいが,効果はない。





例 5.31

SAVE

文の例を次に示す。

SAVE A, B, C, / BLOCKA /, D





5.2.13 TARGET

R546

TARGET

is

TARGET [ :: ]

実体名 [ ( 配列形状指定 ) ]

[ ,

実体名 [ ( 配列形状指定 ) ] ] ...

この文は,並び中の実体に対して TARGET 属性(5.1.2.14 参照)を指定する。





例 5.32

TARGET

文の例を次に示す。

TARGET :: A (1000, 1000), B





5.2.14 VALUE

R547

VALUE

is

VALUE [ :: ]

仮引数名並び

この文は,並び中の仮引数に対して VALUE 属性(5.1.2.15 参照)を指定する。

5.2.15 VOLATILE

R548

VOLATILE

is

VOLATILE [ :: ]

実体名並び

この文は,並び中の実体に対して VOLATILE 属性(5.1.2.16 参照)を指定する。

5.3 IMPLICIT

IMPLICIT

文 (IMPLICIT statement) は,有効域内において,この文で指定された英字を第 1 文字としてもつ名

前のデータ要素が,暗黙的に型宣言されるときの型 (もしあれば) 及び 型パラメタを指定する。その有効域内で暗

黙の型規則を適用しないと指定することもできる。

R549

IMPLICIT

is

IMPLICIT

暗黙型宣言並び

or

IMPLICIT NONE

R550

暗黙型宣言

is

宣言型指定子 ( 英字範囲並び )

R551

英字範囲

is

英字 [ - 英字 ]

C571

(R549)

ある有効域内で IMPLICIT NONE を指定するときには,どの PARAMETER 文よりも前に指定し

なければならず,その有効域内に他の IMPLICIT 文を書いてはならない。

C572

(R551) “-”

と 2 番目の英字を書くとき,2 番目の英字は 1 番目の英字より ABC 順で後になければなら

ない。


77

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

英字範囲として “-” で区切られた二つの英字は,1 番目の文字から 2 番目の文字までの英字を ABC 順でいちいち

指定した並びと等価とする。例えば,A-C は,A,B,C に等しい。一つの有効域内のすべての IMPLICIT 文を通じて,

同じ英字を,単独の英字として書くか英字範囲に含めるかして,2 回以上指定してはならない。

各有効域内において,それぞれの英字 A, B, . . . , Z と型 及び 型パラメタとの間の対応付けが存在する。対応付け

は,空でありうる。IMPLICIT 文は,英字範囲並び中の英字に対して対応付けを指定する。IMPLICIT NONE は,すべ

ての対応付けを空にする。プログラム単位 又は 引用仕様本体において,対応付けが指定されていない英字は,I, J,

. . . , N

であれば基本整数型に,それ以外であれば基本実数型に暗黙的に対応付けられる。内部手続 又は モジュール

手続において,対応付けが指定されていない英字は,暗黙的に親有効域の対応付けに従う。

型宣言文で明示的に宣言されていなくて,組込み関数でもなく,更に参照結合 又は 親子結合によって参照可能に

なったのでもないデータ要素は,その名前の第 1 文字の対応付けが空でないとき,その対応付けに従った型 及び 型

パラメタをもつとして暗黙的に宣言される。データ要素の第 1 文字の対応付けは,IMPLICIT 文によって前もって定

めた対応付けか,又は その英字に対する暗黙的な対応付けとする。 ある派生型が局所的な有効範囲で参照不能であっ

ても,その親有効範囲で参照可能であれば,その対応付けは有効とする。データ要素は,それに対する最も外側の有

効域内で明示的に型宣言されたかのように扱われる。FUNCTION 文中の明示的な型指定は,その関数副プログラム

の結果変数名について,IMPLICIT 文を上書きする。


78

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 5.33

IMPLICIT

文の例を次に示す。

MODULE EXAMPLE_MODULE

IMPLICIT NONE

...

INTERFACE

FUNCTION FUN (I)

!

すべてのデータ要素を明示的に宣言する必要はない。

INTEGER FUN

END FUNCTION FUN

END INTERFACE

CONTAINS

FUNCTION JFUN (J)

!

すべてのデータ要素を明示的に宣言する必要がある。

INTEGER JFUN,J

...

END FUNCTION JFUN

END MOULE EXAMPLE_MODULE

SUBROUTINE SUB

IMPLICIT COMPLEX (C)

C = (3.0, 2.0)

! C

は暗黙的に複素数型であると宣言される。

...

CONTAINS

SUBROUTINE SUB1

IMPLICIT INTEGER (A, C)

C = (0.0, 0.0)

! C

は親子結合によって複素数型となる。

Z = 1.0

! Z

は暗黙的に実数型であると宣言される。

A = 2

! A

は暗黙的に整数型であると宣言される。

CC = 1

! CC

は暗黙的に整数型であると宣言される。

...

END SUBROUTINE SUB1

SUBROUTINE SUB2

Z = 2.0

! Z

は暗黙的に実数型であると宣言されるが,

! SUB1

中の同じ名前の変数とは異なる。

...

END SUBROUTINE SUB2

SUBROUTINE SUB3

USE EXAMPLE_MODULE

!

参照結合による整数型関数 FUN の参照

Q = FUN (K)

! Q

は暗黙的に実数型であると宣言される。

...

! K

は暗黙的に整数型であると宣言される。

END SUBROUTINE SUB3

END SUBROUTINE SUB






79

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 5.34

IMPLICIT

文に,派生型の宣言型指定子を指定してもよい。次の IMPLICIT 文 及び 型定義があ

るとする。

IMPLICIT TYPE (POSN) (A-B, W-Z), INTEGER (C-V)

TYPE POSN

REAL X, Y

INTEGER Z

END TYPE POSN

英字 A, B, W, X, Y 又は Z で始まる変数は,暗黙的に型 POSN となり,これら以外の変数は暗黙的に

整数型となる。





例 5.35

局所的な有効範囲で参照不能な派生型への対応付けの例を次に示す。

PROGRAM MAIN

IMPLICIT TYPE(BLOB) (A)

TYPE BLOB

INTEGER :: I

END TYPE BLOB

TYPE(BLOB) :: B

CALL STEVE

CONTAINS

SUBROUTINE STEVE

INTEGER :: BLOB

..

AA = B

..

END SUBROUTINE STEVE

END PROGRAM MAIN

サブルーチン STEVE において,BLOB が異なる意味を与えられているので,変数を型 BLOB として

明示的に宣言することはできない。しかし,英字 A に対して型 BLOB が暗黙的に対応付けられている

ので, AA は型 BLOB になる。





5.4 NAMELIST

NAMELIST

文 (NAMELIST statement) は,データ転送(9.5 及び 10.10 参照)に当たって,一つの名前で参照

できる名前付きデータ実体群を指定する。

R552

NAMELIST

is

NAMELIST /

変数群名 / 変数群要素並び

[ [ , ] /

変数群名 / 変数群要素並び ] ...

C573

(R552)

変数群名は,参照結合によって参照可能になった名前であってはならない。

R553

変数群要素

is

変数名

C574

(R553)

変数群要素は,大きさ引継ぎ配列であってはならない。

C575

(R552)

変数群名が PUBLIC 属性をもつとき,変数群要素並びの各項目は,PRIVATE 属性をもっては

ならない。

NAMELIST

文で指定した変数の順序が,出力時の値の順序になる。

同じ変数群名を,有効域内で二つ以上の NAMELIST 文に書いてもよい。 一つの有効域内で同じ変数群名を 2 回

以上書くと,その変数群要素をその順に全部つないだ並びとして扱われる。

一つの変数群要素を,二つ以上の変数群に含めてもよい。


80

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

変数群要素は,参照結合 若しくは 親子結合によって参照されるか,又は,その型,型パラメタ 及び 形状が同じ有

効域内の宣言文か手続の頭書きで前もって指定されるか 若しくは その有効域の暗黙の型規則で決められたものでな

ければならない。変数群要素が暗黙の型規則によっているならば,その後の型宣言文は,その暗黙の型 及び 型パラ

メタを確認するものでなければならない。





例 5.36

NAMELIST

文の例を次に示す。

NAMELIST /NLIST/ A, B, C





5.5

データ実体の記憶列結合

一般に,データ実体の物理的記憶単位 及び 記憶順序は指定できない。しかし,EQUIVALENCE 文,COMMON

文 若しくは SEQUENCE 文を使うか,又は BIND(C) 型属性指定子を指定することによって,記憶単位の順序 及び

配置を制御することができる。記憶列結合の一般的な機構は,16.4.3 による。

5.5.1 EQUIVALENCE

EQUIVALENCE

文 (EQUIVALENCE statement) は,有効域内で二つ以上の実体が同じ記憶単位を共有すること

を指定する。これは,その記憶単位を共有する実体の記憶列結合を引き起こす。

記憶列共有する実体が異なる型 又は 型パラメタをもつとき,EQUIVALENCE 文は,型変換 又は 数学的な等値化

を行わない。スカラ変数と配列が記憶列共有しているとき,スカラ変数は配列の性質をもたないし,配列はスカラの

性質をもたない。

R554

EQUIVALENCE

is

EQUIVALENCE

結合対応並び

R555

結合対応

is

(

結合実体 , 結合実体並び )

R556

結合実体

is

変数名

or

配列要素

or

部分列

C576

(R556)

結合実体は,仮引数,ポインタ,割付け変数,割付け末端成分をもつ派生型の実体,不連続派生

型の実体,成分選択のどの水準かにポインタをもつ派生型の実体,自動割付け実体,関数名,入口名,結

果名,BIND 属性をもつ変数,共通ブロック内にあって BIND 属性をもつ変数 又は 名前付き定数を基底

実体とする特定子であってはならない。

C577

(R556)

結合実体は,二つ以上の部分参照をもつ特定子であってはならない。

C578

(R556)

結合実体は,TARGET 属性をもってはならない。

C579

(R556)

結合実体の添字 及び 文字部分列式は,整数初期値式(7.1.7 参照)でなければならない。

C580

(R555)

結合実体の一つが基本整数型,基本実数型,倍精度実数型,基本複素数型,基本論理型 又は 数

値連続型であるとき,結合対応中の実体はすべてこれらの型でなければならない。

C581

(R555)

結合実体の一つが基本文字型 又は 文字連続型であるとき,結合対応中の実体はすべてこれらの

型でなければならない。

C582

(R555)

結合実体の一つが数値連続型でも文字連続型でもない連続した派生型であるとき,結合対応中の

実体はすべてこれと同じ型パラメタ値をもった同じ型でなければならない。

C583

(R555)

結合実体の一つが基本整数型,基本実数型,倍精度実数型,基本複素数型,基本論理型 及び 基

本文字型を除いた組込み型であるとき,結合対応の実体はすべてこれと同じ種別パラメタ値をもった同じ

型でなければならない。

C584

(R556)

結合実体の一つが PROTECTED 属性をもっている場合,その結合対応中のすべての実体も

PROTECTED

属性をもっていなければならない。


81

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C585

(R556)

結合実体の名前は,参照結合によって参照可能になった名前であってはならない。

C586

(R556)

部分列は,長さゼロであってはならない。





注記 5.37

EQUIVALENCE

文は,連続型構造体の結合 及び 基本種別でない型パラメタをもつ組込み型

の実体を結合してもよいが,これらの実体を EQUIVALENCE 文中に書く場合には,厳格な規則が

ある。

EQUIVALENCE

文中に書く構造体は,連続型構造体でなければならない。連続型構造体が数値連

続型でも文字連続型でもない場合,その構造体は,同じ型パラメタ値をもった同じ型の実体とだけ結

合できる。

数値連続型構造体は,別の数値連続型構造体と結合でき,基本整数型,基本実数型,倍精度実数型,

基本複素数型 又は 基本論理型の実体とも結合できる。したがって,構造体の末端成分は,これらの

組込み型の実体とだけ結合されることになる。

文字連続型構造体は,基本文字型の実体 及び 別の文字連続型構造体と結合できる。

基本種別でない型パラメタをもつ組込み型の実体は,同じ型 及び 同じ種別型パラメタをもつ実体

とだけ結合できる。

EQUIVALENCE

文と暗黙的初期値指定との相互作用は,16.4.3.3 で更に規定する。





5.5.1.1

記憶列共有結合

EQUIVALENCE

文は,結合対応に書いたデータ実体の記憶列(16.4.3.1 参照)が互いに記憶列結合することを指

定する。結合対応中の大きさがゼロでない列の先頭の記憶単位は,すべて同じ記憶単位とする。結合対応中の大きさ

がゼロの列は,互いに記憶列結合し,かつ 大きさがゼロでない列と同じ先頭の記憶単位にも結合する。これは結合対

応中のデータ実体の記憶列結合を引き起こし,更に他のデータ実体との記憶列結合を引き起こすこともある。

5.5.1.2

基本文字型実体の記憶列共有

基本文字型のデータ実体は,基本文字型の実体とだけ記憶列共有できる。記憶列共有するデータ実体の長さは,同

じである必要はない。

EQUIVALENCE

文は,一つの結合対応に書いたすべての基本文字型データ実体の記憶列が互いに記憶列結合する

ことを指定する。結合対応中の大きさがゼロでない列は,すべて同じ先頭の文字記憶単位をもつ。結合対応中の大き

さがゼロの列は,互いに記憶列結合し,かつ 大きさがゼロでない列と同じ先頭の文字記憶単位にも結合する。これは

結合対応中のデータ実体の記憶列結合を引き起こし,更に他のデータ実体との記憶列結合を引き起こすこともある。





例 5.38

次の宣言があるとする。

CHARACTER

(LEN = 4) :: A, B

CHARACTER

(LEN = 3) :: C (2)

EQUIVALENCE (A, C (1)), (B, C (2))

このときの A,B 及び C の結合を次に図示する。



-

A



-

B



-

C(1)



-

C(2)

1

2

3

4

5

6

7





5.5.1.3

配列名 及び 配列要素特定子


82

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

大きさがゼロでない配列について,添字並びを付けずに配列名を EQUIVALENCE 文に書くことは,その配列の先

頭の要素を指定した配列要素特定子を書くのと同じ効果がある。

5.5.1.4 EQUIVALENCE

文の制限

EQUIVALENCE

文によって,同じ記憶単位が一つの記憶列中に 2 回以上現れるような指定をしてはならない。





例 5.39

禁止例を次に示す。これは,A(1) と A(2) に対して同じ記憶単位を指定することになるので禁止

される。

REAL, DIMENSION (2) :: A

REAL :: B

EQUIVALENCE (A (1), B), (A (2), B)

!

規格合致でない。





EQUIVALENCE

文によって,連続する記憶単位を不連続とするような指定をしてはならない。





例 5.40

禁止例を次に示す。

REAL A (2)

DOUBLE PRECISION D (2)

EQUIVALENCE (A (1), D (1)), (A (2), D (2))

!

規格合致でない。





5.5.2 COMMON

COMMON

文 (COMMON statement) は,物理的な記憶場所のブロックを指定する。これを 共通ブロック (common

block)

と呼ぶ。共通ブロックは,プログラム中のどの有効域からも参照可能とする。したがって,COMMON 文は,

記憶列結合(16.4.3 参照)に基づいた大域データ参照を可能にする。

COMMON

文で指定される共通ブロックは,名前付きのものを 名前付き共通ブロック (named common block) と

呼び,名前付きでないものを 無名共通ブロック (blank common) と呼ぶ。

R557

COMMON

is

COMMON [ / [

共通ブロック名 ] / ] 共通ブロック実体並び

[ [ , ] / [

共通ブロック名 ] / 共通ブロック実体並び ] ...

R558

共通ブロック実体

is

変数名 [ ( 明示上下限並び ) ]

or

手続ポインタ名

C587

(R558)

一つの変数名 又は 手続ポインタ名は,一つの有効域内のすべての共通ブロック実体並びを通じ

て 1 回だけ書くことができる。

C588

(R558)

共通ブロック実体として,仮引数,割付け変数,割付け可能な末端成分をもつ派生型の実体,自

動割付け実体,関数名,入口名,BIND 属性をもつ変数 又は 結果名を指定してはならない。

C589

(R558)

共通ブロック実体に指定する派生型実体は,暗黙的初期値指定なしの連続型(4.5.1 参照)又は

BIND

属性をもつ型でなければならない。

C590

(R558)

変数名 及び 手続ポインタ名は,参照結合によって参照可能になった名前であってはならない。

各 COMMON 文において,共通ブロック名に続く共通ブロック実体並び中に名前を書いたデータ実体は,その共

通ブロック中にあると宣言される。先頭の共通ブロック名を省略すると,最初の共通ブロック実体並び中に名前を書

いたデータ実体は,無名共通ブロック中にある。共通ブロック名を省略した二つの “/” に続く共通ブロック実体並び

中に名前を書いたデータ実体もまた,無名共通ブロック中にある。

一つの有効域内の一つ以上の COMMON 文に,同じ名前をもつ共通ブロック 又は 無名共通ブロックを 2 回以上書

いてもよい。一つの有効域内で同じ共通ブロック名を 2 回以上書くと,それらに続く共通ブロック実体並びは,その

順に全部一つにつないだ並びとして扱われる。同様に無名共通ブロックの共通ブロック実体並びも,その順に全部一

つにつないだ並びとして扱われる。


83

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

変数名 ( 明示上下限並び )” の形を書くと,変数名は DIMENSION 属性をもつと宣言され,配列の性質を指定さ

れる。数値連続型(4.5.1 参照)又は 文字連続型(4.5.1 参照)の派生型実体を共通ブロック実体として書くと,そ

れは個々の成分を共通ブロック実体並び中に直接列挙したのと等価とする。





例 5.41

COMMON

文の例を次に示す。

COMMON /BLOCKA/ A, B, D(10,30)

COMMON I, J, K





5.5.2.1

共通ブロック記憶列

有効域内のそれぞれの共通ブロックについて,共通ブロック記憶列 (common block storage sequence) が,次のと

おりに形成される。

(1)

記憶列は,その共通ブロックの共通ブロック実体並び中のデータ実体の記憶列(16.4.3.1 参照)に含まれるすべ

ての記憶単位の列から形成される。記憶列の順序は,その有効域内での共通ブロック実体並びの出現順と同じと

する。

(2) (1)

で形成された記憶列は,記憶列共有結合によって記憶列結合したすべての記憶単位を含むように拡張される。

この拡張は,最後の記憶単位の後ろに記憶単位を追加する方向にだけ許される。共通ブロック中のデータ要素と

結合したデータ実体は,その共通ブロック中にあるとみなす。

その有効域内に書いた COMMON 文 及び EQUIVALENCE 文だけが,その有効域での共通ブロック記憶列の形成

に関与する。

5.5.2.2

共通ブロックの大きさ

共通ブロックの大きさ (size of a common block) とは,記憶列共有による列の拡張を含んだ共通ブロック記憶列の

大きさとする。

5.5.2.3

共通ブロック結合

プログラム中で,同じ名前をもち大きさがゼロでない共通ブロックの記憶列の先頭の記憶単位は,すべて同じ記憶

単位とする。同じ名前をもち大きさがゼロである共通ブロックの記憶列は,すべて互いに記憶列結合する。プログラ

ム中で,大きさがゼロでない無名共通ブロックの記憶列の先頭の記憶単位は,すべて同じ記憶単位とする。大きさが

ゼロである無名共通ブロックの記憶列は,すべて互いに結合し,かつ 大きさがゼロでない無名共通ブロックの先頭の

記憶単位とも結合される。これによって,異なる有効域間での実体の結合を可能とする。参照結合 又は 親子結合に

よって,これらの結合している実体を,同じ有効域で参照可能にしてもよい。

基本整数型,基本実数型,倍精度実数型,基本複素数型,基本論理型 又は 数値連続型であってポインタでない実

体は,これらの型のポインタでない実体とだけ結合できる。

基本文字型 又は 文字連続型であってポインタでない実体は,これらの型のポインタでない実体とだけ結合できる。

数値連続型 及び 文字連続型以外の派生型であってポインタでない実体は,同じ型パラメタ値をもつ同じ型のポイ

ンタでない実体とだけ結合できる。

基本整数型,基本実数型,倍精度実数型,基本複素数型,基本論理型 及び 基本文字型以外の組込み型であってポ

インタでない実体は,同じ型 及び 同じ型パラメタをもったポインタでない実体とだけ結合できる。

データポインタは,同じ型 及び 次元数をもつデータへのポインタとだけ記憶列結合できる。データポインタが記

憶列結合している場合,型パラメタを無指定にするときは,同じ型パラメタでなければならない。無指定でない型パ

ラメタが無指定のときは,同じ値をもたなければならない。手続ポインタは,手続ポインタとだけ記憶列結合できる。

この場合,引用仕様は双方とも明示的か 又は 双方とも暗黙的でなければならない。引用仕様が明示的である場合,双

方の特性は,同じでなければならない。引用仕様が暗黙的である場合,双方ともサブルーチンであるか,又は 双方と

も同じ型と同じ型パラメタをもつ関数でなければならない。


84

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

TARGET

属性をもつ実体は,同じ型 及び 型パラメタと TARGET 属性をもつ他の実体とだけ記憶列結合となり

うる。





注記 5.42

共通ブロックは,それを参照しているどの有効域内でもその共通ブロックに対して記憶単位の

同一の列を指定している場合,異なる種類の記憶単位を含んでもよい。例えば,単一の共通ブロック

が数値実体 及び 文字実体の両方を含んでもよい。

異なる有効域内での,基本種別の実体,倍精度実数型の実体 及び 連続型構造体の間の結合は,結

合実体 (5.5.1) に対する規則に従って許される。





5.5.2.4

名前付き共通ブロックと無名共通ブロックとの相違

無名共通ブロックは,次の事項を除いて,名前付き共通ブロックと同じ性質をもつ。

(1) RETURN

文 又は END 文の実行によって,名前付き共通ブロック中のデータ実体はその共通ブロック名を SAVE

文で宣言してなければ不定になりうるが,無名共通ブロック中のデータ実体は不定になることはない(16.5.6

参照)。

(2)

同じ名前の名前付き共通ブロックはプログラム中のすべての有効域で同じ大きさでなければならないが,無名共

通ブロックは異なる大きさであってもよい。

(3)

名前付き共通ブロック中のデータ実体は初期値設定プログラム単位(11.3 参照)中で,DATA 文 又は 型宣言文

によって初期確定にできるが,無名共通ブロック中の実体は初期確定にできない。

5.5.2.5 COMMON

文 及び EQUIVALENCE 文の制限

EQUIVALENCE

文によって,二つの異なる共通ブロックの記憶列を結合してはならない。

記憶列共有結合によって,COMMON 文中で指定した先頭の実体の記憶単位よりも前に,記憶単位を付け加える拡

張を行ってはならない。





例 5.43

禁止例を次に示す。

COMMON /X/ A

REAL B (2)

EQUIVALENCE (A, B (2))

!

規格合致でない。





記憶列共有結合によって,暗黙的初期値指定をもつ派生型の実体と共通ブロック中の実体とを結合してはならない。

6

データ実体の使用

実体特定子を,値を要求する文脈で書くことを 引用 (reference) という。引用は,そのデータ実体が確定となって

いる場合にだけ許される。ポインタの引用は,確定となっている指示先実体にそのポインタが結合している場合にだ

け許される。データ実体は,16.5.5 で示す事象が生じた場合に値とともに確定になる。

R601

変数

is

特定子

C601

(R601)

特定子は,定数 又は その部分実体であってはならない。

R602

変数名

is

名前

C602

(R602)

変数名は,変数の名前でなければならない。

R603

特定子

is

実体名

or

配列要素

or

部分配列

or

構造体成分


85

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

or

部分列

R604

論理変数

is

変数

C603

(R604)

論理変数は,論理型でなければならない。

R605

基本論理変数

is

変数

C604

(R605)

基本論理変数は,基本論理型でなければならない。

R606

文字変数

is

変数

C605

(R606)

文字変数は,文字型でなければならない。

R607

基本文字変数

is

変数

C606

(R607)

基本文字変数は,基本文字型でなければならない。

R608

整変数

is

変数

C607

(R608)

整変数は,整数型でなければならない。





例 6.1

次の宣言があるとする。

CHARACTER (10) A, B (10)

TYPE (PERSON) P

!

例 4.17 参照

このとき,A,B,B(1),B(1:5),P % AGE 及び A(1:1) は,すべて変数になる。





定数(3.2.2 参照)は,定数表現 又は 名前付き定数とする。定数表現は,その型,型パラメタ 及び 値を示す構文

形式に従って記述されたスカラとする。名前付き定数は,PARAMETER 属性(5.1.2.10 及び 5.2.9 参照)をもつ

名前を関連付けられている定数とする。定数の引用は,常に許される。定数の再確定は,禁止する。

6.1

スカラ

スカラ (scalar)(2.4.4 参照)は,その型の単一の値によって表現される,配列(6.2 参照)でないデータ要素とす

る。スカラの値は,確定している場合には,その型を特徴付ける値の集合の一つの要素とする。





注記 6.2

派生型のスカラ実体は,その成分の値からなる単一の値である(4.5.7 参照)。





スカラの次元数は,ゼロとする。

6.1.1

部分列

部分列 (substring) は,文字列(4.4.4 参照)の連続した一部分とする。部分列の形は,次の規則による。

R609

部分列

is

親列 ( 部分列範囲 )

R610

親列

is

スカラ変数名

or

配列要素

or

スカラ構造体成分

or

スカラ定数

R611

部分列範囲

is

[

スカラ整数式 ] : [ スカラ整数式 ]

C608

(R610)

親列は,文字型でなければならない。


86

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

部分列範囲の 1 番目のスカラ整数式の値を 開始位置 (starting point) といい,2 番目を 終了位置 (ending point) と

いう。部分列の長さは,その部分列中の文字の個数とする。開始位置 及び 終了位置をそれぞれ 及び とすると,

部分列の長さは,max(l

− f + 10) となる。

親列の長さを とし,親列中の文字に 123, . . . , n と番号が付いているとする。このとき,部分列中の文字は,開

始位置から終了位置までの親列中の文字とする。開始位置 及び 終了位置は,開始位置が終了位置を越えない場合は,

12, . . . , n

の間でなければならない。開始位置が終了位置を越える場合,部分列の長さは,ゼロとする。開始位置を

省略したとき,暗黙値は 1 とする。終了位置を省略したとき,暗黙値は とする。

親が変数の場合,部分列も変数とする。





例 6.3

文字部分列の例を次に示す。

B (1) (1:5)

親列が配列要素

P % NAME (1:1)

親列が構造体成分

ID (4:9)

親列がスカラ変数名

’0123456789’ (N:N)

親列が文字定数





6.1.2

構造体成分

構造体成分 (structure component) は,派生型の実体の部分とし,実体特定子によって参照できる。構造体成分は,

スカラであっても配列であってもよい。

R612

データ参照

is

部分参照 [ % 部分参照 ] ...

R613

部分参照

is

部分名 [ ( 部分配列添字並び ) ]

C609

(R612)

部分名は,右端のものを除いては,派生型でなければならない。

C610

(R612)

部分名は,左端のものを除いては,直前の部分名の宣言時の型の成分の名前でなければならない。

C611

(R612)

右端の部分名が抽象型である場合,データ参照は多相的でなければならない。

C612

(R612)

左端の部分名は,データ実体の名前でなければならない。

C613

(R613)

部分参照に部分配列添字並びの指定のある場合,部分配列添字の個数は部分名の次元数と等しく

なければならない。

部分配列添字並びの指定のない部分参照の次元数は,部分名の次元数とする。部分配列添字並びの指定のある部分

参照の次元数は,その並び中の添字三つ組 及び ベクトル添字の個数とする。

C614

(R612)

ゼロでない次元数の部分参照は,一つのデータ参照中に二つ以上あってはならない。ゼロでない

次元数の部分参照より右にある部分名は,ALLOCATABLE 属性 及び POINTER 属性をもっていてはな

らない。

ゼロでない次元数の部分参照がある場合,データ参照の次元数はその部分参照の次元数とする。それがない場合,

データ参照の次元数は,ゼロとする。データ参照の 基底実体 (base object) とは,その左端の部分名を名前にもつデー

タ実体をいう。

データ参照の型 及び (もしあれば) 型パラメタは,右端の部分名の型 及び 型パラメタとする。

二つ以上の部分引用をもつデータ参照は,右端を除いたその部分名がポインタでない場合,基底実体の部分実体で

ある。右端の部分名だけがポインタである場合,そのデータ参照は,ポインタ結合状態にある文脈である場合に限り,

その基底実体の部分実体である。


87

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





注記 6.4

X

をポインタ要素 P をもつ派生型の実体とする。このとき, X%P は,参照はずしの文脈ではな

くポインタそのものと見た文脈の中では X の部分実体である。

一方, X%P の指す指示先は X の部分実体ではない。したがって,X%P が参照はずしされている文脈

の中では,引用されている指示先は X の部分実体ではない。





R614

構造体成分

is

データ参照

C615

(R614)

構造体成分中には,部分参照が二つ以上なければならない。構造体成分中の右端の部分参照は,

部分配列添字並びの指定がない部分参照でなければならない。

構造体成分は,基底実体の宣言より前で引用 又は 確定してはならない。構造体成分は,その右端の部分名が POINTER

属性をもつと定義されている場合にだけ,ポインタとする。





例 6.5

構造体成分の例を次に示す。

SCALAR_PARENT % SCALAR_FIELD

スカラの親のスカラ成分

ARRAY_PARENT (J) % SCALAR_FIELD

配列要素の親成分

ARRAY_PARENT (1:N) % SCALAR_FIELD

部分配列の親成分

より現実的な例を,C.3.1 に示す。





注記 6.6

構文規則に従うと,添字並びが付かない成分名で終わっているデータ参照は,たとえ他のデー

タ参照の中の成分名に添字並びが付いていたとしても,構造体成分である。添字並びが付いて成分名

で終わっているデータ参照は,配列要素 又は 部分配列のいずれかである。部分列式で終了している

1

次元以上のデータ参照は,部分配列である。部分列式で終了している 0 次元のデータ参照は,部分

列である。





派生型の実体の部分成分subcomponent とは,その実体の成分 又は 部分実体とする。

6.1.3

型パラメタ問合せ

型パラメタ問合せ (type parameter inquiry) は,データ実体の型パラメタの問合せに用いる。組込み型と派生型の

双方に適用される。

R615

型パラメタ問合せ

is

特定子 % 型パラメタ名

C616

(R615)

型パラメタ名は特定子によって特定される実体の宣言時の型の型パラメタ名でなければならない。

結合されていないポインタ 又は 割り付けられていない割付け変数の無指定の型パラメタに対する型パラメタ問合

せは,してはならない。





注記 6.7

型パラメタ問合せの構文規則は,構造体成分の引用と同様である。ただし,意味が異なる。ま

ず,型パラメタ問合せは変数ではないので,代入ができない。できることは,式中の一次子としてで

きることに限られる。特に,型パラメタ問合せは,その中の特定子が配列であったとしても,スカラ

である。

組込み型の型パラメタに対しても,組込み関数である関数 KIND 及び LEN を使って,型パラメタ

問合せができる。






88

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 6.8

型パラメタ問合せの例を示す。

a%kind

!-- a

は実数型である。この値は KIND(a) の返す値と同じである。

s%len

!-- s

は文字型である。この値は LEN(s) の返す値と同じである。

b(10)%kind

!--

配列要素に対する問合せの例。

p%dim

!-- p

は派生型 general_point とする。

最後の例中で,型 general point の定義については

例 4.24 を参照。





6.2

配列

配列 (array) は,すべてが同じ型 及び 同じ型パラメタをもつスカラデータの集合とし,それらの要素を四角い形

に配置したものとする。配列を構成するスカラデータを,配列要素 (array element) という。

配列要素の参照の順序は,配列要素順序(6.2.2.2 参照)に従うことが指定されている場所以外では,配列名特定

子を書くことによっては指示されない。

6.2.1

全体配列

全体配列 (whole array) は,名前付き配列とし,その名前は,添字並びをもたない名前付き定数(5.1.2.10 及び

5.2.9

参照)でも名前付き変数でもよい。

実行文中に書いた全体配列変数は,その配列のすべての要素を指定する(2.4.5 参照)。大きさ引継ぎ配列を実行文

中に全体配列として書くことができるのは,配列の形状を要求しない手続引用の実引数としてだけとする。

非実行文中に書いた全体配列名は,結合対応中に全体配列が現れた場合(5.5.1.3 参照)を除いて,配列全体を指

定する。

6.2.2

配列要素 及び 部分配列

R616

配列要素

is

データ参照

C617

(R616)

すべての部分参照の次元数は,ゼロでなければならない。最後の部分参照は,添字並びをもたな

ければならない。

R617

部分配列

is

データ参照 [ ( 部分列範囲 ) ]

C618

(R617)

部分配列中には,ゼロでない次元数の部分参照がちょうど一つなければならず,最後の部分参照

がゼロでない次元数の部分配列添字並びをもつか 又は 他の部分参照がゼロでない次元数をもつかのいず

れかでなければならない。

C619

(R617)

部分列範囲をもつ部分配列の最も右にある部分名は,文字型でなければならない。

R618

添字

is

スカラ整数式

R619

部分配列添字

is

添字

or

添字三つ組

or

ベクトル添字

R620

添字三つ組

is

[

添字 ] : [ 添字 ] [ : 刻み幅 ]

R621

刻み幅

is

スカラ整数式

R622

ベクトル添字

is

整数式

C620

(R622)

ベクトル添字は,1 次元の整数配列式でなければならない。

C621

(R620)

大きさ引継ぎ配列の最後の次元の添字三つ組の 2 番目の添字を省略してはならない。


89

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

配列要素は,スカラとする。部分配列は,配列とする。部分列範囲をもつ部分配列のそれぞれの要素は,その部分

配列中の対応する要素中の特定された部分列とする。





例 6.9

次の宣言があるとする。

REAL A (10, 10)

CHARACTER (LEN = 10) B (5, 5, 5)

このとき,次の左の形は,右のものを表す。

A(1,2)

配列要素

A(1:N:2,M)

1

次元部分配列

B(:,:,:)(2:3)

形状が (5,5,5) の配列で,各要素が B の

それぞれの要素の長さ 2 の部分列であるもの





注記 6.10

特に指定されない限り,配列要素 及び 部分配列は,その全体配列の属性を引き継がない。特

に,POINTER 属性 及び ALLOCATABLE 属性をもつことはない。





例 6.11

配列要素 及び 部分配列の例を次に示す。

ARRAY_A (1:N:2) % ARRAY_B (I, J) % STRING (K)(:)

部分配列

SCALAR_PARENT % ARRAY_FIELD (J)

配列要素

SCALAR_PARENT % ARRAY_FIELD (1:N)

部分配列

SCALAR_PARENT % ARRAY_FIELD (1:N) % SCALAR_FIELD

部分配列





6.2.2.1

配列要素

配列要素の添字の値は,その次元の上下限の範囲内の値でなければならない。

6.2.2.2

配列要素順序

一つの配列中の要素は,配列要素順序 (array element order) と呼ばれる列を形成する。この列中での配列要素の位

置は,その要素を特定する添字並びの添字順序値によって決定される。添字順序値は,

表 6.1 の式で計算する。


90

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

表 6.1―添字順序値

次元数

添字上下限

添字並び

添字順序値

1

j

1

k

1

s

1

1 + (s

1

− j

1

)

2

j

1

k

1

j

2

k

2

s

1

s

2

1 + (s

1

− j

1

)

+ (s

2

− j

2

)

×d

1

3

j

1

k

1

j

2

k

2

j

3

k

3

s

1

s

2

s

3

1 + (s

1

− j

1

)

+ (s

2

− j

2

)

×d

1

+ (s

3

− j

3

)

×d

2

×d

1

.

.

.

.

.

.

.

.

.

.

.

.

7

j

1

k

1

. . . j

7

k

7

s

1

. . . s

7

1 + (s

1

− j

1

)

+ (s

2

− j

2

)

×d

1

+ (s

3

− j

3

)

×d

2

×d

1

+

· · ·

+ (s

7

− j

7

)

×d

6

×d

5

× · · · ×d

1

注記 d

i

= max(k

i

− j

i

+ 1, 0)

は,番目の次元の寸法とする。

2

配列の大きさがゼロでない場合,= 12, . . . , 7 に対して j

i

≤ s

i

≤ k

i

とする。

6.2.2.3

部分配列

部分配列 (array section) は,配列部分実体とする。部分配列には,部分列範囲を指定してもよい。

部分配列添字並びの指定のある部分配列において,その部分配列添字並び中のそれぞれの添字三つ組 及び ベクト

ル添字は,添字の列を指定する。その列は,空であってもよい。その列中のそれぞれの添字は,列が空である場合を

除いて,その次元の上下限の範囲内になければならない。それぞれの部分配列添字で指定される単一の添字 又は 添

字の列からすべての可能な添字並びが得られる。部分配列は,配列中の,それらの添字並びによって決定される要素

の集合とする。

部分配列添字並びの指定のない部分配列において,その部分配列の次元数 及び 形状は,次元数がゼロでない部分

参照の次元数 及び 形状とする。部分配列添字並びの指定のある部分配列において,その部分配列の次元数は,部分

配列添字並び中の添字三つ組 及び ベクトル添字の個数とする。その形状は,番目の要素が,番目の添字三つ組 又

は ベクトル添字で指定された列の中の整数値の個数であるような,1 次元配列とする。これらの列のいずれかが空で

ある場合,部分配列の大きさは,ゼロとする。部分配列の要素の添字順序は,その部分配列が表す配列データ実体の

添字順序とする。

6.2.2.3.1

添字三つ組

添字三つ組 (subscript triplet) は,ゼロ個以上の添字の値からなる規則的な添字の列を指定する。添字三つ組の 3

番目の式は,添字の値の増分値とし,刻み幅 (stride) と呼ぶ。添字三つ組の添字 及び 刻み幅は,省略してもよい。添

字三つ組の 1 番目の添字を省略した場合,その配列の下限の値の添字を指定したのと等価とする。2 番目の添字を省

略した場合,その配列の上限の値の添字を指定したのと等価とする。刻み幅を省略した場合,刻み幅 1 を指定したの

と等価とする。

刻み幅は,ゼロであってはならない。

刻み幅が正である場合,添字三つ組によって指定される添字の列は,1 番目の添字値から開始し,刻み幅の増分値

をもち,2 番目の添字値を超えない最大の整数までの等間隔の整数の列とする。1 番目の添字値が 2 番目より大きい


91

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

場合,列は,空とする。





例 6.12

A(5,4,3)

と宣言された配列の部分配列 A(3:5,2,1:2) は,形状 (32) の次の 2 次元配列となる。

A(3,2,1)

A(3,2,2)

A(4,2,1)

A(4,2,2)

A(5,2,1)

A(5,2,2)





刻み幅が負である場合,添字の列は,1 番目の添字値から開始し,刻み幅の増分値をもち,2 番目の添字値以上の

最小の整数までの減少列とする。2 番目の添字値が 1 番目より大きい場合,列は,空とする。





例 6.13

B(10)

と宣言された配列の部分配列 B(9:1:-2) は,形状 (5) の配列となる。その配列の要素は,

順に,B(9),B(7),B(5),B(3),B(1) となる。





注記 6.14

配列要素を選択するすべての添字値がその次元の宣言された上下限の範囲内にあれば,添字三

つ組中の添字は,その範囲内になくてもよい。例えば,B(10) と宣言された配列の部分配列 B(3:11:7)

は,形状 (2) の配列となる。その配列の要素は,順に,B(3),B(10) となる。





6.2.2.3.2

ベクトル添字

ベクトル添字 (vector subscript) は,その配列式の要素の値に対応した添字の列を指定する。式の要素は,すべて

確定となっていなければならない。重複部分配列 (many-one array section) は,二つ以上の要素が同じ値をもつベク

トル添字で指定された部分配列とする。重複部分配列は,代入文の左辺 又は READ 文の入力項目として書いてはな

らない。

ベクトル添字をもつ部分配列は,確定 又は 再確定される仮引数と結合する引数であってはならない。ベクトル添

字をもつ部分配列は,ポインタ代入文の指示先であってはならない。ベクトル添字をもつ部分配列は,内部ファイル

であってはならない。





例 6.15

Z

を形状 (57) の 2 次元配列,U 及び V をそれぞれ形状 (3) 及び (4) の 1 次元配列とし,U 及び

V

が次の値をもっているとする。

U = (/ 1, 3, 2 /)

V = (/ 2, 1, 1, 3 /)

このとき,Z(3,V) は,次の順の Z の第 3 行要素からなる。

Z(3,2)

Z(3,1)

Z(3,1)

Z(3,3)

Z(U,2)

は,次の列要素からなる。

Z(1,2)

Z(3,2)

Z(2,2)

Z(U,V)

は,次の要素からなる。

Z(1,2)

Z(1,1)

Z(1,1)

Z(1,3)

Z(3,2)

Z(3,1)

Z(3,1)

Z(3,3)

Z(2,2)

Z(2,1)

Z(2,1)

Z(2,3)

Z(3,V)

及び Z(U,V) は,Z の要素を重複して含むから,これらをこの部分配列の形で再確定しては

ならない。





6.3

動的結合

ポインタ指示先の生成,結合 及び 解放の動的制御は,ALLOCATE 文,NULLIFY 文,DEALLOCATE 文 及び

ポインタ代入によって行う。ALLOCATE 文(6.3.1 参照)は,ポインタの指示先を生成する。ポインタ代入(7.4.2


92

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

参照)は,存在する指示先にポインタを結合する。NULLIFY 文(6.3.2 参照)は,指示先との結合を解除してポイ

ンタを空状態にする。DEALLOCATE 文(6.3.3 参照)は,指示先を解放する。動的結合は,任意の型のスカラ 及

び 配列に適用できる。

ALLOCATE

文 及び DEALLOCATE 文は,ALLOCATABLE 属性をもつ変数の生成 及び 解放にも使用する。





注記 6.16

ポインタ 及び 動的結合に関する詳細な記述を,C.3.3 に示す。





6.3.1 ALLOCATE

ALLOCATE

文 (ALLOCATE statement) は,ポインタ指示先 及び 割付け変数を動的に生成する。

R623

ALLOCATE

is

ALLOCATE ( [

型指定子 :: ] 割付け指定並び [ , 割付け指定選択子列 ] )

R624

割付け指定選択子

is

STAT =

状態変数

   

or

ERRMSG =

誤り通報変数

or

SOURCE =

初期値指定式

R625

状態変数

is

スカラ整変数

R626

誤り通報変数

is

スカラ基本文字変数

R627

初期値指定式

is

R628

割付け指定

is

割付け実体 [ ( 割付け上下限並び ) ]

R629

割付け実体

is

変数名

or

構造体成分

R630

割付け上下限

is

[

割付け下限 : ] 割付け上限

R631

割付け下限

is

スカラ整数式

R632

割付け上限

is

スカラ整数式

C622

(R629)

それぞれの割付け実体は,手続を指していないポインタ 又は 割付け変数でなければならない。

C623

(R623)

文中で割付け実体が無指定型パラメタをもつ場合,型指定子 又は SOURCE 指定子が現れなけ

ればならない。

C624

(R623)

型指定子がある場合,その指定する型は,それぞれの割付け実体と型が適合していなければなら

ない。

C625

(R623)

割付け実体が無制限多相的 又は 抽象型である場合,型指定子 又は SOURCE 指定子が現れなけ

ればならない。

C626

(R623)

それぞれの割付け実体の対応する型パラメタが引き継がれる仮引数である場合に限り,型指定子

中の型パラメタ値は “*” でなければならない。

C627

(R623)

型指定子がある場合,それぞれの割付け実体の種別型パラメタ値は,その型指定子で対応する型

パラメタ値と同じでなければならない。

C628

(R628)

割付け実体が配列の場合に限り,割付け上下限並びを指定しなければならない。

C629

(R628)

割付け上下限並び中の割付け上下限の個数は,割付け実体の次元数と同じでなければならない。

C630

(R624)

一つの割付け選択子並び中に,同じ割付け選択子を複数回指定してはならない。

C631

(R623) SOURCE

指定子がある場合,型指定子があってはならない。また,割付け並び中の割付け実体

は一つだけでなければならず,かつ 初期値指定式と型が適合(5.1.1.2 参照)していなければならない。

C632

(R623)

初期値指定式は,スカラ 又は 割付け実体と同じ次元数をもつものでなければならない。


93

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

C633

(R623)

対応する割付け実体と初期値指定式の種別型パラメタは,同じ値でなければならない。

割付け実体,その上下限パラメタ 及び 型パラメタは,状態変数の値にも誤り通報変数の値にも依存してはならな

い。更に,同じ ALLOCATE 文に現れる割付け実体中の値,上下限,長さ型パラメタ,割付け状態,結合状態のいず

れにも依存してはならない。

状態変数,初期値指定式,誤り通報変数はいずれもそれらが現れる ALLOCATE 文中で割り付けられてはならな

い。更に,同じ ALLOCATE 文に現れる割付け実体中の値,上下限,長さ型パラメタ,割付け状態,結合状態のいず

れにも依存してはならない。

型指定子はなくてもよいが,指定されたときには割り付けられる実体の実行時の型 及び 型パラメタを指定する。

型指定子がある場合,多相的実体の割付けをすると,指定された実行時の型をもつ実体を割り付ける。初期値指定式

がある場合,実行時の型 及び 型パラメタがその式と同じである実体を割り付ける。それ以外の場合,宣言時の型と

同じ実行時の型をもつ実体を割り付ける。

型指定子を伴う ALLOCATE 文が実行されると,型指定子中の型パラメタ値で,型パラメタが指定される。型パラ

メタとして指定された値が,割付け実体の宣言中で指定された値と異なる場合,誤り条件が発生する。

ALLOCATE

文における型指定子中の型パラメタ値が “*” の場合,引継ぎ型パラメタの現在の値を指す。型パラメ

タ値が式の場合,その式中の変数が後に再確定されても不定になっても,型パラメタ値に影響しない。





例 6.17

ALLOCATE

文の例を次に示す。

ALLOCATE (X (N), B (-3:M, 0:9), STAT = IERR_ALLOC)





配列に対して ALLOCATE 文を実行すると,割付け上限 及び 割付け下限の値がその配列の上下限を定める。上下

限の式中のどれかの変数が後に再確定されても不定になっても,その配列の上下限には影響しない。割付け下限を省

略したとき,暗黙値は 1 とする。上限が下限より小さい場合,その次元の寸法 及び 配列の大きさは,ゼロとする。





注記 6.18

割付け実体は,長さゼロの文字型であってもよい。





SOURCE

指定子がある場合,初期値指定式は割付け指定と形状適合(2.4.5 参照)していなければならない。割付

け実体の長さ型パラメタの値が指定され,それが初期値指定式の対応する型パラメタの値と異なる場合,誤り条件が

発生する。割付けが成功した場合,割付け実体の値は,初期値指定式のものとなる。





例 6.19

値と実行時の型が,他の実体を参照することで決定する ALLOCATE 文の例を,次に示す。

CLASS(*), ALLOCATABLE :: NEW

CLASS(*), POINTER :: OLD

! ...

ALLOCATE (NEW, SOURCE=OLD)

! OLD

のもつ値と実行時の型で NEW を割り付ける。

より大規模な例を,C.3.2 に示す。





STAT

指定子のある ALLOCATE 文の実行が正常に終了した場合,状態変数は,値ゼロで確定となる。ALLOCATE

文の実行中に誤り条件が発生した場合,状態変数は,処理系依存の正の整数値で確定となり,それぞれの割付け実体

は,処理系依存の状態になる。割付けに成功した割付け実体は,“割り付けられている” という状態 又は “結合して

いる” というポインタ結合状態になり,割付けに失敗した割付け実体は,直前の割付け状態 又は ポインタ結合状態を

保つ。

STAT

指定子のない ALLOCATE 文の実行中に誤り条件が発生した場合,その実行可能プログラムの実行は,終了

する。

誤り通報指定子については,6.3.1.3 による。


94

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

6.3.1.1

割付け変数の割付け

割付け要素の割付け状態は,プログラムの実行中の任意の時点で,次のいずれかとする。

(1)

割付け変数は,ALLOCATE 文によって割り付けられた場合,代入中に割り付けられた場合,又は割付け転送手

続(13.5.16 参照)によってそう指定された場合に “割り付けられている” 状態になる。この状態をもつ割付け変

数は,引用,確定 又は 解放をしてもよい。ALLOCATE 文で割り付けようとすることは,ALLOCATE 文の誤

り条件となる。この状態をもつ変数に対して,組込み関数 ALLOCATED(13.7.9 参照)は真を返す。

(2)

割付け変数は,割り付けられている状態にないとき, “割り付けられていない” 状態をもつという。割付け変数

は,解放(6.3.3 参照)された場合,又は割付け転送手続によってそう指定された場合に,割り付けられていない

状態になる。この状態をもつ割付け変数は,引用も確定もしてはならない。また,ALLOCATABLE 属性をもっ

ていない仮引数に,実引数として与えてもならない。ただし,組込み問合せ関数の一部では例外がある。割付け

変数が割り付けられていない状態にあれば,ALLOCATE 文で割り付けてもよい。DEALLOCATE 文によって

この変数を解放しようとすることは,DEALLOCATE 文の誤り条件となる。この状態の変数に対して,組込み

関数 ALLOCATED(13.7.9 参照)は,偽を返す。

プログラム実行の当初において,割付け変数はすべて “割り付けられていない” 状態にある。

SAVE

属性をもつ割付け変数は,“割り付けられていない” という初期状態をもつ。この状態は,手続の実行中に変

えてもよい。

割付け変数の割付け状態が変更されるとき,その変数と結合状態にある割付け変数の割付け状態も,その変更に従っ

て変更される。割付け変数が割り付けられると,それと結合状態にあるすべての割付け変数について,型パラメタの

値で無指定状態のままであったものは,確定する。

SAVE

属性をもたない割付け変数のうち,手続内で局所的な変数であるものは,手続の呼出し時には “割り付けら

れていない” という割付け状態をもつ。この状態は,手続の実行中に変えてもよい。SAVE 属性をもたない割付け実

体のうち,モジュール内 又は その実体の部分実体内で局所的な変数であるものは,“割り付けられていない” という

初期状態をもつ。この状態は,手続の実行中に変えてもよい。

派生型をもつ実体が ALLOCATE 文で生成されたとき,その時点では,その末端成分で,ALLOCATABLE 属性を

もつものは,すべて “割り付けられていない” という状態をもつ。

6.3.1.2

ポインタ指示先の割付け

ポインタの割付けは,TARGET 属性を暗黙的にもつ実体を生成する。ポインタに対して,続いて ALLOCATE 文

を実行し,それが成功すると,そのポインタは,指示先と結合し,指示先の引用 又は 確定に使用できるようになる。

このポインタ指示先 又は その一部分に,ポインタ代入によって別のポインタを結合してもよい。指示先と結合して

いるポインタを割り付けることは,誤りではない。この場合,ポインタの属性 及び ALLOCATE 文に指定した配列

上下限,型,型パラメタによって要求されるポインタ指示先が新たに生成され,ポインタは,その指示先と結合され

る。そのポインタのそれまでの指示先との結合は解除される。以前の指示先が割付けによって生成されたものであっ

た場合,その指示先は,それと結合している他のポインタがないときには,参照不能になる。ポインタが不定の結合

状態をもたない限り,そのポインタが結合されているか否かは,組込み関数 ASSOCIATED(13.7.13 参照)によって

知ることができる。

関数結果がポインタである関数の実行の開始時には,そのポインタの結合状態は,不定とする。そのような関数から

の戻りの前には,そのポインタに指示先を結合するか 又は そのポインタの結合状態を空状態にしなければならない。

6.3.1.3

誤り通報指定子

誤り条件が ALLOCATE 文 又は DEALLOCATE 文の実行中に発生したとき,処理系は,誤り通報変数にそれを

説明する通報を代入しなければならない。誤り条件が発生しなかったときは,処理系は,誤り通報変数の値を変更し

てはならない。


95

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

6.3.2 NULLIFY

NULLIFY

文 (NULLIFY statement) は,ポインタを空状態にする。

R633

NULLIFY

is

NULLIFY (

ポインタ実体並び )

R634

ポインタ実体

is

変数名

or

構造体成分

or

手続ポインタ名

C634

(R634)

ポインタ実体は,POINTER 属性をもたなければならない。

ポインタ実体は,同じ NULLIFY 文中の他のポインタ実体の値,上下限 又は 結合状態に依存してはならない。





注記 6.20

NULLIFY

文が多相的ポインタ(5.1.1.2 参照)に適用されると,そのポインタの実行時の型

は宣言されたものになる。





6.3.3 DEALLOCATE

DEALLOCATE

文 (DEALLOCATE statement) は,割付け変数を解放し,また,ポインタ指示先を解放してポイ

ンタを空状態にする。

R635

DEALLOCATE

is

DEALLOCATE (

割付け実体並び [ , 解放指定選択子並び ] )

C635

(R635)

それぞれの割付け実体は,手続を指していないポインタ 又は 割付け変数でなければならない。

R636

解放指定選択子

is

STAT =

状態変数

   

or

ERRMSG =

誤り通報変数

C636

(R636)

一つの解放指定選択子並びに,同じ解放指定選択子が二つ以上現れてはならない。

割付け実体は,同じ DEALLOCATE 文中の他の割付け実体の値,上下限,割付け状態 又は 結合状態に依存して

はならない。同じ DEALLOCATE 文中の状態変数 及び 誤り通報変数の値に依存してもならない。

状態変数 及び 誤り通報変数は,同じ DEALLOCATE 文で解放されてはならない。状態変数は,同じ DEALLOCATE

文中の他の割付け実体の値,上下限,割付け状態 又は 結合状態に依存してもならない。

STAT

指定子のある DEALLOCATE 文の実行が正常に終了した場合,状態変数は,値ゼロで確定となる。DEALLO-

CATE

文の実行中に誤り条件が発生した場合,状態変数は,処理系依存の正の整数値で確定となり,正常に解放され

た割付け実体は,“割り付けられていない” 状態になるか 又は ポインタの結合状態が空状態になる。正常に解放され

なかった割付け実体は,直前の割付け状態 又は ポインタとの結合状態を保つ。





注記 6.21

正しく解放されなかった割付け実体の状態は,組込み関数 ALLOCATED 又は組込み関数

ASSOCIATED

で個々に検査できる。





STAT

指定子のない DEALLOCATE 文の実行中に誤り条件が発生した場合,その実行可能プログラムの実行は,終

了する。

誤り通報指定子は,6.3.1.3 による。





例 6.22

DEALLOCATE

文の例を次に示す。

DEALLOCATE (X, B)





6.3.3.1

割付け変数の解放


96

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

割り付けられていない割付け変数を更に解放しようとすると,DEALLOCATE 文で誤り条件が発生する。TARGET

属性をもつ割付け変数を解放すると,その割付け変数と結合しているすべてのポインタの結合状態は,不定になる。

RETURN

文 又は END 文によって手続の実行が終了したとき,その手続内で局所的な名前をもつ割付け変数のう

ち,割付け状態 及び 定義状態を保持するものは,SAVE 属性をもつか,関数結果変数 又は その部分実体とする。そ

のほかの場合,その変数は解放される。





注記 6.23

変数が割り付けられている状態であるか解放されているかは,組込み関数 ALLOCATED によっ

て知ることができる。





RETURN

文 又は END 文によって手続の実行が終了し,モジュールに対する活動状態にある有効域がなくなった

場合,そのモジュールの局所変数であって SAVE 属性をもたない割付け実体が割り付けられているとき,割付け状態

を保持するか解放されるかは,処理系依存とする。





例 6.24

SAVE

属性の割付け情報の効果を,次の例で示す。

MODULE MOD1

TYPE INITIALIZED_TYPE

INTEGER :: I = 1

!

暗黙的初期値設定

END TYPE INITIALIZED_TYPE

SAVE :: SAVED1, SAVED2

INTEGER :: SAVED1, UNSAVED1

TYPE(INITIALIZED_TYPE) :: SAVED2, UNSAVED2

ALLOCATABLE :: SAVED1(:), SAVED2(:), UNSAVED1(:), UNSAVED2(:)

END MODULE MOD1

PROGRAM MAIN

CALL SUB1

! SUB1

の PRINT 文で呼んでいる組込み関数 ALLOCATED の

!

返す値は,次のとおりになる。

!

偽,偽,偽,偽

!

モジュール MOD1 が参照され,その中の変数が割り付けられる。

!

このサブルーチンから戻ってきた後に,SAVE 属性がない変数

!

の割付け状態が保持されるかどうかは,処理系依存となる。

CALL SUB1

! SUB1

の PRINT 文で呼んでいる最初の二つの組込み関数

! ALLOCATED

の返す値は,次のとおりになる。

!

真,真

!

その次の PRINT 文中の二つの組込み関数 ALLOCATED の返す値は,処理系

!

依存となり,それぞれ真にも偽にもなりうる。

CONTAINS

SUBROUTINE SUB1

USE MOD1

! SAVE

属性をもつ変数ともたない変数を参照する。

PRINT *, ALLOCATED(SAVED1), ALLOCATED(SAVED2), &

&

ALLOCATED(UNSAVED1), ALLOCATED(UNSAVED2)

IF (.NOT. ALLOCATED(SAVED1)) ALLOCATE(SAVED1(10))

IF (.NOT. ALLOCATED(SAVED2)) ALLOCATE(SAVED2(10))

IF (.NOT. ALLOCATED(UNSAVED1)) ALLOCATE(UNSAVED1(10))

IF (.NOT. ALLOCATED(UNSAVED2)) ALLOCATE(UNSAVED2(10))

END SUBROUTINE SUB1

END PROGRAM MAIN





ある関数の結果が,ALLOCATABLE 属性をもつか 又は 構造体であってその部分実体が ALLOCATABLE 属性を

もち,実行構文中でその関数を引用し,その関数引用が実行されたとき,返された結果 又は 結果の部分実体として

割り付けられた割付け要素は,その引用を含む最も内側の実行構文が実行された後に,解放される。


97

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

ある関数の結果がそれ自体 ALLOCATABLE 属性をもつか 又は それが構造体であって部分実体が ALLOCATABLE

属性をもち,有効域中の宣言式でその関数の引用が実行されたとき,返された結果 又は 結果の部分実体として割り

付けられた割付け要素は,その有効域中の実行構文の実行の前に解放される。

手続が呼び出されるとき, INTENT(OUT) 属性をもつ割付け仮引数と結合している,割り付けられている状態に

ある割付け実体である実引数は,解放される。INTENT(OUT) 属性をもつ割付け仮引数と結合している,割り付け

られている状態にある割付け実体である実引数の部分実体は,解放される。

組込み代入文(7.4.1.3 参照)が実行されると,割り付けられている状態にある割付け実体としての変数の部分実

体は,すべてその代入が行われる前に解放される。

派生型の変数が解放されると,割り付けられている状態にある割付け実体としての部分実体は,すべて解放される。

割付け実体である成分が,後始末可能な実体の部分実体である場合,その成分が自動的に解放される前に,その実

体の後始末が起こる。

自動解放が起こるときの効果は,解放指定選択子並びを指定せずに DEALLOCATE 文を実行したときの効果と同

じとする。





例 6.25

次の例において,サブルーチン PROCESS から戻る時,X は SAVE 属性をもっているので,X の割

付け状態は保持されなければならない。TEMP は SAVE 属性をもっていないので,解放される。次の

PROCESS

の実行時には,TEMP は “割り付けられていない” という割付け状態になる。

SUBROUTINE PROCESS

REAL, ALLOCATABLE :: TEMP(:)

REAL, ALLOCATABLE, SAVE :: X(:)

...

END SUBROUTINE PROCESS





6.3.3.2

ポインタ指示先の解放

DEALLOCATE

文中にポインタがある場合,そのポインタの結合状態は,確定でなければならない。空状態のポイ

ンタ 又は ALLOCATE 文によって生成されたのでない指示先をもつポインタを解放しようとすると,DEALLOCATE

文で誤り条件が発生する。ポインタが割付け要素と結合されている場合,そのポインタを解放してはならない。

DEALLOCATE

文中にポインタがある場合,そのポインタは,割付けによって生成された実体全体と結合してい

なければならない。ポインタ指示先を解放すると,その指示先 又は その指示先の一部分と結合している他のポイン

タのポインタ結合状態は,不定になる。

7

式 及び 代入

この箇条 では,式, 組込み代入文,利用者定義代入文,ポインタ代入文,配列選別代入文 (WHERE) 及び FORALL

文 に関する形式,解釈 及び 評価方法を規定する。

7.1

式 (expression) は,データの引用 又は 計算のいずれかを表現し,式の値は,スカラ 又は 配列のいずれかとする。

式は,演算対象,演算子 及び 括弧を用いて構成する。

演算対象は,スカラ 又は 配列のいずれかとする。演算は,組込み演算 又は 利用者定義演算 (7.2) のいずれかとす

る。式それ自身を演算対象として用いることによって,より複雑な式を構成することができる。

式の評価によって値を得る。その値は,型,

(もし必要ならば)型パラメタ 及び 形状をもつ(7.1.4 参照)。

7.1.1

式の形式

式は,一次子,単項段階式,数値段階式,文字段階式,関係段階式 及び 論理段階式を用いて定義する。


98

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

これらの種類は,異なる演算子優先順位に関連しており,一般的には他の種類を用いて定義する。式の最も単純な

形式は,一次子とする。次に与える規則は,式の構文を規定する。式の意味は,7.2 で規定する。

7.1.1.1

一次子

R701

一次子

is

定数

or

特定子

or

配列構成子

or

構造体構成子

or

関数引用

or

型パラメタ問合せ

or

型パラメタ名

or

(

式 )

C701

(R701)

型パラメタ名は,型パラメタの名前でなければならない。

C702

(R701)

特定子は,大きさ引継ぎの全体配列であってはならない。





例 7.1

一次子の例を次に示す。

構文要素

1.0

定数

’ABCDEFGHIJKLMNOPQRSTUVWXYZ’ (I:I)

部分定数

A

変数

(/ 1.0, 2.0 /)

配列構成子

PERSON (12, ’Jones’)

構造体構成子

F (X, Y)

関数引用

(S + T)

(

式 )





7.1.1.2

単項段階式

利用者定義単項演算子は,最も高い演算子優先順位をもつ (

表 7.7)。単項段階式は,必要ならば利用者定義単項演

算子を前に付けた一次子とする。

R702

単項段階式

is

[

利用者定義単項演算子 ] 一次子

R703

利用者定義単項演算子

is

.

英字 [ 英字 ] ... .

C703

(R703)

利用者定義単項演算子の英字は,63 文字を超えてはならず,どの組込み演算子 又は 論理定数表

現とも同じであってはならない。





例 7.2

簡単な単項段階式の例を次に示す。

構文要素

A

一次子 (R701)

.INVERSE. B

単項段階式 (R702)

複雑な単項段階式の例を次に示す。

.INVERSE. (A + B)






99

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

7.1.1.3

数値段階式

数値段階式は,必要ならば数値演算子であるべき乗演算子,乗除演算子 及び 加減演算子を伴う単項段階式とする。

R704

乗除演算対象

is

単項段階式 [ べき乗演算子 乗除演算対象 ]

R705

加減演算対象

is

[

加減演算対象 乗除演算子 ] 乗除演算対象

R706

数値段階式

is

[ [

数値段階式 ] 加減演算子 ] 加減演算対象

R707

べき乗演算子

is

**

R708

乗除演算子

is

*

or

/

R709

加減演算子

is

+

or

-





例 7.3

簡単な数値段階式の例を次に示す。

構文要素

説明

A

単項段階式

A

は一次子である。(R702)

B ** C

乗除演算対象

B

は単項段階式であり,“**” はべき乗演算子であり,

C

は乗除演算対象である。(R704)

D * E

加減演算対象

D

は加減演算対象であり,“*” は乗除演算子であり,

E

は乗除演算対象である。(R705)

+1

数値段階式

“+”

は加減演算子であり,

“1”

は加減演算対象である。(R706)

F - I

数値段階式

F

は数値段階式であり,“-” は加減演算子であり,

I

は加減演算対象である。(R706)

複雑な数値段階式の例を次に示す。

- A + D * E + B ** C





7.1.1.4

文字段階式

文字段階式は,必要ならば文字演算子である連結演算子を伴う数値段階式とする。

R710

文字段階式

is

[

文字段階式 連結演算子 ] 数値段階式

R711

連結演算子

is

//





例 7.4

簡単な文字段階式の例を次に示す。

構文要素

A

数値段階式 (R706)

B // C

文字段階式 (R710)

複雑な文字段階式の例を次に示す。

X // Y // ’ABCD’






100

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

7.1.1.5

関係段階式

関係段階式は,必要ならば関係演算子を伴う文字段階式とする。

R712

関係段階式

is

[

文字段階式 関係演算子 ] 文字段階式

R713

関係演算子

is

.EQ.

or

.NE.

or

.LT.

or

.LE.

or

.GT.

or

.GE.

or

==

or

/=

or

<

or

<=

or

>

or

>=





例 7.5

簡単な関係段階式の例を次に示す。

構文要素

A

文字段階式 (R710)

B == C

関係段階式 (R712)

D < E

関係段階式 (R712)

複雑な関係段階式の例を次に示す。

(A + B) /= C





7.1.1.6

論理段階式

論理段階式は,必要ならば論理演算子である否定演算子,論理積演算子,論理和演算子 及び 論理等否演算子を伴

う関係段階式とする。

R714

論理積演算対象

is

[

否定演算子 ] 関係段階式

R715

論理和演算対象

is

[

論理和演算対象 論理積演算子 ] 論理積演算対象

R716

論理等否演算対象

is

[

論理等否演算対象 論理和演算子 ] 論理和演算対象

R717

論理段階式

is

[

論理段階式 論理等否演算子 ] 論理等否演算対象

R718

否定演算子

is

.NOT.

R719

論理積演算子

is

.AND.

R720

論理和演算子

is

.OR.

R721

論理等否演算子

is

.EQV.

or

.NEQV.


101

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 7.6

簡単な論理段階式の例を次に示す。

構文要素

A

関係段階式 (R712)

.NOT. B

論理積演算対象 (R714)

C .AND. D

論理和演算対象 (R715)

E .OR. F

論理等否演算対象 (R716)

G .EQV. H

論理段階式 (R717)

S .NEQV. T

論理段階式 (R717)

複雑な論理段階式の例を次に示す。

A .AND. B .EQV. .NOT. C





7.1.1.7

式の一般形

式は,必要ならば利用者定義 2 項演算子を伴う論理段階式とする。利用者定義 2 項演算子は,演算子優先順位が最

も低い(

表 7.7)。

R722

is

[

式 利用者定義 2 項演算子 ] 論理段階式

R723

利用者定義 2 項演算子

is

.

英字 [ 英字 ] ... .

C704

(R723)

利用者定義 2 項演算子の英字は,63 文字を超えてはならず,どの組込み演算子 又は 論理定数表

現とも同じであってはならない。





例 7.7

簡単な式の例を次に示す。

構文要素

A

論理段階式 (R717)

B .UNION. C

式 (R722)

複雑な式の例を次に示す。

(B .INTERSECT. C) .UNION. (X - Y)

A + B == C * D

.INVERSE. (A + B)

A + B .AND. C * D

E // G == H (1:10)





7.1.2

組込み演算

組込み演算 (intrinsic operation) は,組込み単項演算 又は 組込み 2 項演算のいずれかとする。組込み単項演算

(intrinsic unary operation)

は,“組込み演算子 x

2

という形式の演算とする。ここで,x

2

は,組込み単項演算子に

関して

表 7.1 に規定された組込み型 (4.4) をもつ。

組込み2項演算 (intrinsic binary operation) は,“x

1

組込み演算子 x

2

という形式の演算とする。ここで,x

1

及び

x

2

は,組込み 2 項演算子に関して

表 7.1 に規定された組込み型 (4.4) をもち,かつ 形状適合である (7.1.5) とする。


102

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

表 7.1―組込み演算に関する演算対象 及び 演算結果の型

組込み演算子 op

x

1

の型

x

2

の型

[x

1

op x

2

の型

単項の +,-

I

,R,Z

I

,R,Z

2

項の +,-,*,/,**

I

I

,R,Z

I

,R,Z

R

I

,R,Z

R

,R,Z

Z

I

,R,Z

Z

,Z,Z

//

C

C

C

.EQ.

,.NE.,==,/=

I

I

,R,Z

L

,L,L

R

I

,R,Z

L

,L,L

Z

I

,R,Z

L

,L,L

C

C

L

.GT.

,.GE.,.LT.,.LE.

I

I

,R

L

,L

>

,>=,<,<=

R

I

,R

L

,L

C

C

L

.NOT.

L

L

.AND.

,.OR.,.EQV.,.NEQV.

L

L

L

注記 記号 I,R,Z,C 及び L は,それぞれ整数型,実数型,複素数型,文字型 及び

論理型を表す。x

2

について二つ以上の型が与えられているところでは,演算結果

の型は,結果の列の同じ相対位置に与える。演算対象が文字型の組込み演算子に

ついて,その二つの演算対象の種別型パラメタは,同じでなければならない。

数値組込み演算 (numeric intrinsic operation) は,組込み演算子が数値演算子( +,-,*,/ 及び ** )である組込

み演算とする。数値組込み演算子 (numeric intrinsic operator) は,数値組込み演算における演算子とする。

数値組込み 2 項演算において,二つの演算対象は,異なる数値型 又は 異なる種別型パラメタをもってもよい。整

数によってべき乗する値を除いて,もし二つの演算対象が異なる型 又は 異なる種別型パラメタをもつならば,演算

結果の型 又は 種別型パラメタとは異なる型 又は 種別型パラメタをもつ演算対象は,演算を実行する前に演算結果の

型 及び 種別型パラメタに変換する。実数型 又は 複素数型の値を整数によってべき乗するときには,整数型演算対象

を変換する必要はない。

同様にして,文字組込み演算 (character intrinsic operation),関係組込み演算 (relational intrinsic operation) 及

び 論理組込み演算 (logical intrinsic operation) は,それぞれ 文字組込み演算子 (character intrinsic operator)(//),

関係組込み演算子 (relational intrinsic operator)(.EQ.,.NE.,.GT.,.GE.,.LT.,.LE.,==,/=,>,>=,< 及び

<=

)並びに 論理組込み演算子 (logical intrinsic operator)(.AND.,.OR.,.NOT.,.EQV. 及び .NEQV.)によって定

義する。組込み演算子 “//” では,種別型パラメタは,同じでなければならない。文字演算対象の関係組込み演算子

では,その演算対象の種別型パラメタは,同じでなければならない。

数値関係組込み演算 (numeric relational intrinsic operation) は,演算対象が数値型である関係組込み演算とする。

文字関係組込み演算 (character relational intrinsic operation) は,二つの演算対象が文字型である関係組込み演算と

する。

7.1.3

利用者定義演算

利用者定義演算 (defined operation) は,利用者定義単項演算 又は 利用者定義 2 項演算のいずれかとする。利用者

定義単項演算 (defined unary operation) は,次のいずれかとする。

(1) 

利用者定義単項演算子 x

2

という形式をもち,関数副プログラム 及び 総称引用仕様 (4.5.112.3.2.1) によっ


103

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

て定義する。

(2) 

単項組込み演算子 x

2

という形式をもち,関数副プログラム 及び 総称引用仕様によって定義する。

単項演算 op x

2

を定義する関数は,次の条件をすべて満たさなければならない。

(1)

その関数を定義するのに用いる FUNCTION 文 (12.5.2.1) 又は ENTRY 文 (12.5.2.4) が,一つの仮引数 d

2

けを指定する。

(2)

次のいずれかを満たす。

(a)

総称引用仕様 (12.3.2.1) が,OPERATOR(op) という総称指定をもつ関数を指定する。

(b)

OPERATOR(op)

という総称指定をもつ x

2

の宣言時の型に総称束縛 (4.5.4) があり,かつ その x

2

の実行時

の型における関数への対応する束縛がある。

(3) d

2

の型が x

2

の実行時の型と適合する。

(4) d

2

に型パラメタがあるとき,それは 対応する x

2

の型パラメタと一致する。

(5)

次のいずれかを満たす。

(a)

x

2

の次元数は,d

2

のそれと一致する。

(b)

その関数が要素別処理関数であり,かつ この演算を定義する関数が他にない。

仮引数 d

2

が配列であるとき,x

2

の形状は,d

2

の形状と一致する。

利用者定義 2 項演算 (defined binary operation) は,次のいずれかとする。

(1) x

1

利用者定義 2 項演算子 x

2

という形式をもち,関数副プログラム 及び 総称引用仕様によって定義する。

(2) x

1

組込み演算子 x

2

という形式をもち,関数副プログラム 及び 総称引用仕様によって定義する。

2

項演算 x

1

op x

2

を定義する関数は,次の条件をすべて満たさなければならない。

(1)

その関数を定義するのに用いる FUNCTION 文 (12.5.2.1) 又は ENTRY 文 (12.5.2.4) が,二つの仮引数 d

1

び d

2

を指定する。

(2)

次のいずれかを満たす。

(a)

総称引用仕様 (12.3.2.1) が,OPERATOR(op) という総称指定をもつ関数を指定する。

(b)

OPERATOR(op)

という総称指定をもつ x

1

又は x

2

の宣言時の型に総称束縛 (4.5.4) があり,かつ その x

1

又は x

2

の実行時の型における関数への対応する束縛がある。

(3) d

1

及び d

2

の型が x

1

及び x

2

の実行時の型とそれぞれ適合する。

(4) d

1

及び d

2

に型パラメタがあるとき,それは x

1

及び x

2

それぞれの対応する型パラメタと一致する。

(5)

次のいずれかを満たす。

(a)

x

1

及び x

2

の次元数は,d

1

及び d

2

の次元数とそれぞれ一致する。

(b)

その関数が要素別処理関数であり,x

1

及び x

2

が形状適合であって,この演算を定義する関数がほかに

ない。

仮引数 d

1

又は d

2

が配列であるとき,x

1

及び x

2

の形状は,d

1

及び d

2

の形状とそれぞれ一致する。





注記 7.8

組込み演算子は,利用者定義演算中の演算子として使用できる。その場合に,演算子の総称特性

は,拡張される。





拡張演算 (extension operation) は,演算子が利用者定義単項演算子 又は 利用者定義 2 項演算子である利用者定義

演算とする。そのような演算子を 拡張演算子 (extension operator) と呼ぶ。拡張演算に使用される演算子は,その演

算子に対する総称引用仕様が二つ以上の関数を規定するものであってもよい。

利用者定義要素別処理演算 (defined elemental operation) は,関数が要素別処理 (12.7) である利用者定義演算と

する。

7.1.4

式の型型パラメタ 及び 形状


104

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

式の型,型パラメタ 及び 形状は,式の中で使用する演算子 並びに 一次子の型,型パラメタ 及び 形状に依存し,

式の構文から再帰的に決定される。式の型は,組込み型 (4.4) 又は 派生型 (4.5) の中の一つとする。

式が多相的な一次子 又は 利用者定義演算であるとき,式の型パラメタ 並びに 宣言時の型 及び 実行時の型は,そ

れらの一次子 又は 利用者定義演算と同じとする。それ以外の式では,式の型パラメタ 及び 実行時の型は,その式の

宣言時の型 及び 型パラメタと同じになる。それらを単に式の型 及び 型パラメタと呼ぶ。

R724

論理式

is

C705

(R724)

論理式は,論理型でなければならない。

R725

文字式

is

C706

(R725)

文字式は,文字型でなければならない。

R726

基本文字式

is

C707

(R726)

基本文字式は,基本文字型でなければならない。

R727

整数式

is

C708

(R727)

整数式は,整数型でなければならない。

R728

数値式

is

C709

(R728)

数値式は,整数型,実数型 又は 複素数型でなければならない。

7.1.4.1

一次子の型型パラメタ 及び 形状

一次子の型,パラメタ 及び 形状は,その一次子が定数,変数,配列構成子,構造体構成子,関数引用,型パラメ

タ問合せ,型パラメタ名 又は 括弧付き式であるか否かに従って決定される。一次子が定数の場合,その型,型パラ

メタ 及び 形状は,定数のそれとする。構造体構成子の場合,その一次子はスカラとし,その型 及び 型パラメタは

4.5.9

に規定するとおりとする。配列構成子の場合,その型,型パラメタ 及び 形状は,4.7 に規定するとおりとする。

変数 又は 関数引用の場合,その型,型パラメタ 及び 形状は,それぞれ変数 (5.1.15.1.2) 又は 関数引用 (12.4.2)

のそれとする。関数引用が総称 (12.3.2.1, 13.5) である場合,その型,型パラメタ 及び 形状は,実引数の型,型パ

ラメタ 及び 次元数によって 12.4.4.1 のとおりに決まる個別の関数引用による。型パラメタ問合せ 又は 型パラメタ

名である場合,その型パラメタの種別をもつスカラ整数とする。

一次子が括弧付き式の場合,その型,型パラメタ 及び 形状は,その式のそれとする。

次のいずれかとしてポインタを用いたときは,結合された指示先実体が引用される。

(1)

組込み演算 又は 利用者定義演算の中の一次子

(2)

括弧付き一次子の式

(3)

組込み代入文の右辺のただ一つの一次子

その一次子の型,型パラメタ 及び 形状は,現在の指示先のそれとする。指示先と結合していないポインタを一次

子として書くことができるのは,対応する仮引数がポインタであると宣言されている手続の引用における実引数とし

て 又は ポインタ代入文の指示先としてだけとする。

空状態の配列ポインタ 又は 割り付けられていない割付け配列は,形状をもたないが,次元数をもつ。組込み関数

NULL

の結果の型,型パラメタ 及び 次元数は,文脈に依存する (13.7.88)。

7.1.4.2

演算結果の型型パラメタ 及び 形状

組込み演算 [x

1

op x

2

の結果の型は,

表 7.1 によって規定する。

組込み演算の結果の形状は,op が単項演算子であるか 又は x

1

がスカラであるとき,x

2

の形状とし,それ以外の

ときは x

1

の形状とする。


105

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

利用者定義演算 [x

1

op x

2

の結果の型,型パラメタ,及び 形状は,その演算を定義する関数で指定する (7.2)。

組込み型の式は,種別型パラメタをもつ。文字型の式は,更に文字長パラメタをもつ。

組込み演算の結果の型パラメタは,次による。

(1) x

1

及び x

2

が文字型である場合,式 x

1

// x

2

(// は文字組込み演算)の文字長パラメタは,演算対象の長さ

の和とし,その種別型パラメタは,x

1

の種別型パラメタとする。ただし,その種別型パラメタは,x

2

の種別型

パラメタと同じでなければならない。

(2) op

を組込み単項演算子,x

2

を整数型,実数型,複素数型 又は 論理型とする場合,式 op x

2

の種別型パラメタ

は,演算対象のそれとする。

(3) op

を数値組込み 2 項演算子とし,その一方の演算対象が整数型であり,かつ 他方の演算対象が実数型 又は 複

素数型である場合,式 x

1

op x

2

の種別型パラメタは,実数型 又は 複素数型のそれとする。

(4) op

が数値組込み 2 項演算子の場合,その二つの演算対象が同じ型 及び 同じ種別型パラメタをもつか,又は 一

方の演算対象が実数型であって他方が複素数型で同じ種別型パラメタをもつとき,式 x

1

op x

2

の種別型パラメ

タは,演算対象の種別型パラメタと同一とする。二つの演算対象が整数型で,かつ 異なる種別型パラメタをもつ

とき,式の種別型パラメタは,10 進指数範囲が異なるならば,より大きな 10 進指数範囲をもつ演算対象の種別

型パラメタとする。10 進指数範囲が等しいならば,式の型パラメタは処理系依存とするが,種別型パラメタはど

ちらかの演算対象と同じとする。二つの演算対象が実数型 又は 複素数型のいずれかで,かつ 異なる種別型パラ

メタをもつとき,式の種別型パラメタは,10 進精度が異なるならば,より大きな 10 進精度をもつ演算対象の種

別型パラメタとする。10 進精度が等しいならば,式の種別型パラメタは処理系依存とするが,種別型パラメタは

どちらかの演算対象と同じとする。

(5) op

が論理組込み 2 項演算子の場合,その二つの演算対象が同じ種別型パラメタをもつとき,式 x

1

op x

2

の種別

型パラメタは,演算対象の種別型パラメタと同一とする。二つの演算対象が論理型で,かつ 異なる種別型パラメ

タをもつとき,式の種別型パラメタは処理系依存とするが,種別型パラメタはどちらかの演算対象と同じとする。

(6) op

が関係組込み演算子の場合,式 x

1

op x

2

は,基本論理型の種別型パラメタをもつ。

7.1.5

要素別処理演算の適合規則

要素別処理演算 (elemental operation) は,組込み演算 又は 利用者定義要素別処理演算のいずれかとする。二つの

データ要素が同じ形状の配列であるか,又は データ要素の一方 若しくは 両方がスカラであるとき,二つのデータ要

素は,形状適合 (shape conformance) であるとする。

すべての要素別処理 2 項演算について,二つの演算対象は,形状適合でなければならない。演算対象の一方がスカ

ラであり,かつ 他方が配列である場合,そのスカラは,配列演算対象と等しい形状をもち,かつ 配列のすべての要

素が(それがあるときは)そのスカラ値に等しい配列として扱われる。

7.1.6

宣言式

宣言式 (specification expression) は,長さ型パラメタ (C501),配列の上下限 (R512, R513) などの宣言に用いるの

に適した制限をもつ式とする。

R729

宣言式

is

スカラ整数式

C710

(R729)

スカラ整数式は,制限式でなければならない。

制限式 (restricted expression) は,その中のすべての演算が組込みであり,かつ すべての一次子が次のいずれかで

ある式とする。その中のそれぞれの添字,部分配列添字,部分列開始位置,部分列終了位置 及び 型パラメタ値は,制

限式とし,すべての呼び出される後始末サブルーチンは純粋とする。

(1)

定数 又は 部分定数。

(2) OPTIONAL

属性 及び INTENT(OUT) 属性のいずれももたない仮引数としての基底実体をもつ実体特定子。


106

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

(3)

共通ブロック内の基底実体をもつ実体特定子。

(4)

参照結合 又は 親子結合によって参照可能となった基底実体をもつ実体特定子。

(5)

配列構成子。その中のすべての要素 及び 配列構成 DO 制御の各スカラ整数式が制限式である。

(6)

構造体構成子。その中のすべての成分が,制限式である。

(7)

各特定子 又は 関数引数が次のいずれかである宣言問合せ。

(a)

制限式。

(b)

その性質の問合せができる変数。ただし,その性質は,次のいずれでもない。

(i)

大きさ引継ぎ配列の最後の次元の上限に依存するもの。

(ii)

無指定 。

(iii)

制約式以外の式で確定されるもの。

(8)

他の組込み関数の引用。すべての引数が,制限式である。

(9)

宣言関数の引用。すべての引数が,制限式である。

(10)

定義される派生型の型パラメタ。

(11)

配列構成子中の配列構成 DO 変数。対応する配列構成 DO 制御の各スカラ整数式が,制限式である。

(12)

括弧でくくられた制限式。

宣言問合せ (specification inquiry) は次のいずれかの引用とする。

(1)

配列問合せ関数 (13.5.7)。

(2) 2

進数問合せ関数 BIT SIZE。

(3)

文字問合せ関数 LEN。

(4)

種別問合せ関数 KIND。

(5)

文字問合せ関数 NEW LINE。

(6)

数値問合せ関数 (13.5.6)。

(7)

型パラメタ問合せ (6.1.3)。

(8) IEEE

問合せ関数 (14.9.1)。

宣言関数 (specification function) は,純粋な関数であり,標準組込み関数でなく,内部関数でなく,

文関数でなく,

手続引数をもたない関数とする。

宣言関数の評価は,呼び出される副プログラムによって定義される手続を,直接的にも間接的にも呼び出してはな

らない。





注記 7.9

宣言関数は,宣言式中でデータ実体の属性を決定するのに用いることができる組込みでない関数

である。純粋な関数でなければならないという条件から,同じ宣言部で宣言された他の実体に影響す

るような副作用をもたないことが保証される。内部関数であってはならないという条件から,同じ宣

言部で宣言された他の実体について(親子結合を通じて)問い合わせることができないことが保証さ

れる。再帰の禁止は,手続の構築中に,手続の新しいインスタンスを作ることを避けることにある。





宣言式の中の変数は,型をもたなければならず,もし必要ならば型パラメタももたなければならない。その型 及び

型パラメタは,同じ有効域内の先行する宣言,その有効域について有効な暗黙の型規則,親子結合 又は 参照結合に

よって指定する。宣言式の中の変数が暗黙の型規則によっているとき,その後の型宣言文は,その暗黙の型 及び 暗

黙の型パラメタを確認するものでなければならない。

宣言式が同じ宣言部の中で宣言されたデータ要素の型パラメタ 又は 配列上下限に依存する宣言問合せを含む場合,

その型パラメタ 又は 配列上下限は,宣言部の先行する部分に宣言されていなければならない。その宣言は,同じ文の

中の宣言問合せの左側にあってもよいが,同じデータ要素宣言内にあってはならない。宣言式が同じ宣言部の中で宣


107

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

言された配列要素の値を引用する場合,その配列は,宣言部の先行する部分で完全に宣言されていなければならない。

モジュール中の宣言式が総称の引用を含む場合,その総称は宣言式を伴うモジュールで定義された個別手続であって

はならない。





例 7.10

宣言式の例を次に示す。

LBOUND (B, 1) + 5

!

B

は,大きさ引継ぎ仮配列とする。

M + LEN (C)

!

M

及び C は,仮引数とする。

2 * PRECISION (A)

!

A

は,USE 文によって参照可能になった実数変数とする。





7.1.7

初期値式

初期値式 (initialization expression) は,種別型パラメタ,初期化,又は 名前付き定数として用いるのに適した制

限のある式である。これは,すべての演算が組込みであり,かつ すべての一次子が次のいずれかである式とする。た

だし,その中のすべての添字,部分配列添字,部分列開始位置,部分列終了位置 及び 型パラメタ値は,初期値式と

する。

(1)

定数 又は 部分定数。

(2)

配列構成子。その中のすべての要素,及び すべての配列構成 DO 制御のすべてのスカラ整数式は,初期値式で

ある。

(3)

構造体構成子。その中のすべての割付け成分に対応する成分指定は,変形組込み関数 NULL の引用であり,それ

以外の成分指定が,初期値式である。

(4)

要素別処理標準組込み関数の引用。すべての引数が,初期値式である。

(5) NULL

以外の変形標準組込み関数の引用。すべての引数が,初期値式である。

(6)

変形組込み関数 NULL の引用。初期値式以外の式で定義されるか 又は 仮定される型パラメタをもつ引数をもた

ない。

(7)

組込みモジュール IEEE ARITHMETIC (14) からの変形関数 IEEE SELECTED REAL KIND の引用。すべての引数が,

初期値式である。

(8)

宣言問合せ。すべての特定子 又は 関数引数は,次のいずれかとする。

(a)

初期値式。

(b)

その性質の問合せができる変数。ただし,その性質は,次のいずれでもない。

(i)

引き継がれるもの。

(ii)

無指定。

(iii)

初期値式以外の式で確定されるもの。

(9)

定義された派生型の種別型パラメタ。

(10)

配列構成子中の配列構成 DO 変数。配列構成 DO 制御に対応するすべてのスカラ整数式が,初期値式である。

(11)

括弧でくくられた初期値式。

R730

初期値式

is

C711

(R730)

初期値式は,上に定めた初期値式の制限に従わなければならない。

R731

文字初期値式

is

文字式

C712

(R731)

文字初期値式は,初期値式でなければならない。

R732

整数初期値式

is

整数式

C713

(R732)

整数初期値式は,初期値式でなければならない。


108

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

R733

論理初期値式

is

論理式

C714

(R733)

論理初期値式は,初期値式でなければならない。

初期値式が同じ宣言部の中で宣言されたデータ要素の型パラメタ 又は 配列上下限に依存する宣言問合せを含む場

合,その型パラメタ 又は 配列上下限は,宣言部の先行する部分に宣言されていなければならない。その宣言は,同

じ文の中のその宣言問合せの左側にあってもよいが,同じデータ要素宣言中にあってはならない。モジュール中の初

期値式が総称の引用を含む場合,その総称は初期値式を伴うモジュールで定義された個別手続であってはならない。





例 7.11

初期値式の例を次に示す。

3

-3 + 4

’AB’

’AB’ // ’CD’

(’AB’ // ’CD’) // ’EF’

SIZE (A)

DIGITS (X) + 4

4.0 * atan(1.0)

ceiling(number_of_decimal_digits / log10(radix(0.0)))

ここで,A は定数上下限をもつ形状明示配列とし,X は基本実数型とする。





7.1.8

演算の評価

組込み演算は,演算対象の値を必要とする。

処理系が採用している算術で定義されない数値演算は,実行してはならない。実数型一次子の値が負であって,べ

き指数が実数型であるべき乗は,してはならない。

関数引用の評価は,文の中の他のデータ要素の評価に影響を与えたり与えられたりしてはならない。関数引用がそ

の関数の実引数を確定 又は 不定にする場合,その引数 又は それに結合している実体は同じ文の他の場所に現れては

ならない。ただし,IF 文 (8.1.2.4) の論理式,単純 WHERE 文 (7.4.3.1) の選別式 又は FORALL 文 (7.4.4) の添字

若しくは 刻み幅における関数引用の実行は,選択的に実行される文の中の変数を確定にしてもよい。





例 7.12

関数 F の引用が I を確定 若しくは 不定にし,又は 関数 G の引用が X を確定 若しくは 不定にす

るとき,次の文は,許されない。

A (I) = F (I)

Y = G (X) + X

これに対し,次の文で,F 又は G は,X を確定してもよい。

IF (F (X)) A = X

WHERE (G (X)) B = X





関数引用を含む式の宣言時の型は,関数の実引数の評価に影響を与えたり与えられたりしない。

配列要素の引用の実行には,その添字の評価を必要とする。配列要素の引用を含む式の型は,その添字の評価に影

響を与えたり与えられたりしてはならない。部分配列の引用の実行には,部分配列添字の評価を必要とする。部分配

列を含む式の型は,その部分配列添字の評価に影響を与えたり与えられたりしてはならない。部分列の引用の実行に

は,文字位置式の評価を必要とする。部分列を含む式の型は,その文字位置式の評価に影響を与えたり与えられたり

してはならない。処理系は,大きさゼロの配列の添字式 及び 長さゼロの文字データ要素についての文字列式を評価

する必要はない。

配列構成子の評価には,それが含む任意の配列構成 DO 形反復中の配列構成 DO 制御のすべてのスカラ整数式の評


109

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

価を必要とする。配列構成子を含む式の型は,そのような上下限 及び 刻み幅の評価に影響を与えたり与えられたり

してはならない。

要素別処理 2 項演算をスカラと配列 又は 同じ形状の二つの配列に適用すると,その演算は,配列演算対象の配列

要素に対応して要素ごとに実行される。処理系は,要素ごとの演算を任意の順序で実行してよい。





例 7.13

次の配列式は,A 及び B と同じ形状の配列を作る。

A + B

演算結果の個々の配列要素は,A の最初の要素に B の最初の要素を加えた値,A の 2 番目の要素に B

の 2 番目の要素を加えた値などをもつ。





要素別処理単項演算が配列演算対象に作用するとき,演算は,要素ごとに任意の順序で実行してよく,演算結果は,

演算対象と同じ形状とする。

7.1.8.1

演算対象の評価

処理系は,式の演算対象のすべてを完全に評価しなくても式の値を決定できるとき,演算対象を完全に評価する必

要はない。





注記 7.14

この原則は,論理式,大きさゼロの配列 及び 長さゼロの文字列に適用できることが多いが,他

のあらゆる式にも適用できる。例えば,X,Y 及び Z を実数とし,L を論理型関数とするとき,次の

式の評価において,もし X が Y よりも大きいならば,関数引用 L (Z) は評価する必要がない。

X > Y .OR. L (Z)

A

を大きさゼロの配列とし,W を関数とするとき,次の配列式において,関数引用 W (Z) は評価す

る必要がない。

W (Z) + A





文が評価する必要のない関数引用を式の一部に含むとき,引用の実行によって値が確定するすべてのデータ要素は,

その関数引用を含む式の評価の終了時には不定のままとなる。





注記 7.15

注記 7.14 の例では,もし L 又は W が引数を確定にするならば,ある条件の下では,式の評価

は,Z を不定にする。これは,L(Z) 又は W(Z) が評価されるか否かによらない。





7.1.8.2

括弧の保存

7.1.8.2

7.1.8.7 では,7.1.1 及び 7.2 において規定する規則の適用によって得られる式とは異なる式を処理系が

評価できる条件を定める。ただし,括弧でくくられた式は,一つのデータ要素として扱われなければならない。





例 7.16

A

,B 及び C を数値型とするとき,処理系は,式 A + (B - C) の評価において,B と C の差をま

ず評価し,次に加算を実行しなければならない。数学的に等価な式 (A + B) - C として評価しては

ならない。





7.1.8.3

数値組込み演算の評価

7.2.1

で定める規則は,数値組込み演算の解釈を規定する。それらの規則に従って一度解釈が確立したら,処理系

は,括弧の保存を犯さない限り,その式と数学的に同値な別の式を評価してもよい。

二つの数値型の式は,その一次子がとりうるすべての値に対して数学的な値が等しいとき,数学的に同値とする。

しかし,数学的に同値な数値型の式は,異なる計算結果を生成することがありうる。


110

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 7.17

式 (1./3.)*3. と 1. との値の違いは,計算上の違いとし,数学的な違いとはしない。式 5/2 と

5./2.

との値の違いは,数学的な違いとし,計算上の違いとはしない。整数型の除算の数学的な定義

は,7.2.1.1 で定める。





例 7.18

式を評価するときに処理系に許されている変形の例を次に示す。A,B 及び C は,任意の実数演算

対象 又は 複素数演算対象を表し,I 及び J は,整数演算対象を表し,X,Y 及び Z は,任意の数値

演算対象を表す。

許されている変形

X + Y

Y + X

X * Y

Y * X

-X + Y

Y - X

X + Y + Z

X + (Y + Z)

X - Y + Z

X - (Y - Z)

X * A / Z

X * (A / Z)

X * Y - X * Z

X * (Y - Z)

A / B / C

A / (B * C)

A / 5.0

0.2 * A

式を評価するときに処理系に禁止されている変形の例を次に示す。

禁止されている変形

I / 2

0.5 * I

X * I / J

X * (I / J)

I / J / A

I / (J * A)

(X + Y) + Z

X + (Y + Z)

(X * Y) - (X * Z)

X * (Y - Z)

X * (Y - Z)

X * Y - X * Z





所要の解釈を得るための括弧のほかに,式の実際の評価において処理系に許される変形を制限するための括弧を用

いてもよい。これは,式の評価の途中で生成される中間値の大きさと精度を制御するのに役立つ。





例 7.19

次の式においては,括弧付き式 (B - C) をまず評価し,その後で A に加えなければならない。

A + (B - C)

括弧を入れると,式の数学的な値が変わることもある。例えば,次の二つの式は,I 及び J が整数

型のとき,異なる数学的な値をもつことがある。

A * I / J

A * (I / J)





数値組込み演算におけるそれぞれの演算対象は,処理系が用いる評価の順序に従った型をもつ。


111

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 7.20

Z

,R 及び I をそれぞれ複素数型,実数型 及び 整数型のデータ実体とするとき,

Z + R + I

の評価において,I に加えられる演算対象の型は,複素数型 又は 実数型のいずれでもよく,それは

どの演算対象の対(Z と R,R と I,又は Z と I)が最初に加算されるかによる。





7.1.8.4

文字組込み演算の評価

7.2.2

で定める規則は,文字組込み演算の解釈を規定する。処理系は,式の現れる文脈で要求されるだけの文字組

込み演算を評価しなければならない。





例 7.21

文字組込み演算の評価

CHARACTER (LEN = 2) C1, C2, C3, CF

C1 = C2 // CF (C3)

この文で,C1 も C2 も長さ 2 であるから, C1 の値を決定するには C2 の値だけで十分なので,関数

CF

を評価する必要はない。





7.1.8.5

関係組込み演算の評価

7.2.3

で定める規則は,関係組込み演算の解釈を規定する。それらの規則に従って一度式の解釈が確立したら,処

理系は,式中の括弧の保存を犯さない限り,その式と関係として同値な別の式を評価してもよい。





例 7.22

I

及び J を整数型とするとき,処理系は,I > J を J - I < 0 として評価してもよい。





二つの関係組込み演算は,その一次子がとりうるすべての値に対して論理値が等しいとき,関係として同値である

とする。

7.1.8.6

論理組込み演算の評価

7.2.4

で定める規則は,論理組込み演算の解釈を規定する。それらの規則に従って一度式の解釈が確立したら,処

理系は,式中の括弧の保存を犯さない限り,その式と論理的に同値な別の式を評価してもよい。





例 7.23

L1

,L2 及び L3 を論理変数とするとき,処理系は,L1 .AND. L2 .AND. L3 を L1 .AND. (L2

.AND. L3)

として評価してもよい。





二つの論理式は,その一次子がとりうるすべての値に対して論理値が等しいとき,論理的に同値であるとする。

7.1.8.7

利用者定義演算の評価

7.2

で定める規則は,利用者定義演算の解釈を規定する。それらの規則に従って一度式の解釈が確立したら,処理

系は,括弧の保存を犯さない限り,その式と同値な別の式を評価してもよい。

派生型の二つの式は,その一次子がとりうるすべての値に対して値が等しいとき,同値であるとする。

7.2

組込み演算の解釈

組込み演算は,7.1.2 の演算とする。これらの演算は,数値,文字,関係 及び 論理に分ける。7.2.17.2.4 で規

定する解釈は,スカラ 及び 配列の両者に適用する。配列の場合は,スカラについての解釈を要素ごとに適用する。

利用者定義演算の解釈は,演算を定義した関数によって提供される。組込み演算 又は 利用者定義演算からなる式

の型,型パラメタ 及び 解釈は,その式を含む文脈,大きい式の型 及び 型パラメタによらない。





例 7.24

X

を実数型,J を整数型の変数とし,INT を実数から整数への組込み型変換関数とするとき,式

INT(X+J)

は整数型であり,式 X+J は実数型である。






112

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

演算子 <,<=,>,>=,== 及び /= は,それぞれ常に .LT.,.LE.,.GT.,.GE.,.EQ. 及び .NE. と同じ解釈をもつ。

7.2.1

数値組込み演算

数値演算は,数値の計算をするのに用いる。数値演算を評価して数値を得る。数値組込み演算の演算対象として許

される型は,7.1.2 で規定する。

数値組込み演算子 及び その解釈を,

表 7.2 に示す。ここで,x

1

は演算子の左側の演算対象を表し,x

2

は右側の

演算対象を表す。

表 7.2―数値組込み演算子の解釈

演算子

意味

演算子の使用法

解釈

**

べき乗

x

1

** x

2

x

1

を x

2

乗する

/

除算

x

1

x

2

x

1

を x

2

で割る

*

乗算

x

1

x

2

x

1

に x

2

を乗じる

-

減算

x

1

x

2

x

1

から x

2

を引く

-

符号反転

x

2

x

2

の符号を反転する

+

加算

x

1

x

2

x

1

に x

2

を足す

+

恒等

x

2

x

2

と同じ

除算の解釈は,演算対象の型による (7.2.1.1)。

x

1

及び x

2

が整数型であり,かつ x

2

が負の値であるとき,x

1

** x

2

は,1/(x

1

** ABS (x

2

))

に整数型の除算

(7.2.1.1)

の規則を適用したものと解釈する。





例 7.25

2 ** (-3)

は,1/(2 ** 3) と同じであり,その値はゼロになる。





7.2.1.1

整数型の除算

整数型の演算対象を他の整数型の演算対象で割ることができる。二つの整数の数学的な商は,整数とは限らない。

しかし,

表 7.1 は,二つの整数型演算対象をもつ除算は,整数型の式として解釈することを規定する。割り切れない

ときの整数演算の結果は,ゼロからその商までの範囲にあるその商に最も近い整数とする。





例 7.26

式 (-8)/3 は,値 -2 をもつ。





7.2.1.2

複素数型のべき乗

複素数型を複素数型でべき乗する場合,式 x

1

** x

2

の値は,x

1

x

2

の主値とする。

7.2.2

文字組込み演算

文字組込み演算子 “//” は,同じ種別型パラメタをもつ文字型の二つの演算対象を連結する。文字組込み演算の評

価によって文字型の演算結果を得る。

文字組込み演算子 “//” の解釈を,

表 7.3 に示す。ここで,x

1

は演算子の左側の演算対象を表し,x

2

は右側の演

算対象を表す。

表 7.3―文字組込み演算子 //” の解釈

演算子

意味

演算子の使用法

解釈

//

連結

x

1

// x

2

x

1

と x

2

とを連結する

文字組込み演算 “//” の結果は,x

1

の値の右側に x

2

の値を連結した文字列とし,その文字列の長さは,x

1

及び x

2

の長さの和とする。評価順序を指定するための括弧は,文字式の解釈に影響しない。


113

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 7.27

(’AB’ // ’CDE’) // ’F’

の値は,文字列 ’ABCDEF’ となる。また,’AB’ // (’CDE’ // ’F’)

の値も,文字列 ’ABCDEF’ となる。





7.2.3

関係組込み演算

関係組込み演算は,関係組込み演算子 .LT.,.LE.,.GT.,.GE.,.EQ.,.NE.,<,<=,>,>=,== 及び /= を用

いて二つの演算対象の値を比較する。関係組込み演算子の演算対象として許される型は,7.1.2 で規定する。





注記 7.28

表 7.1 に示したとおり,関係組込み演算子を用いて,数値型の式を文字型 又は 論理型の式と

比較してはならない。論理型の二つの演算対象を比較してはならない。複素数演算対象を含む比較は,

演算子が .EQ.,.NE.,== 又は /= のときに限る。文字型の二つの演算対象は,それらが同じ種別型

パラメタをもつときに限り,比較できる。





関係組込み演算の評価によって基本論理型の結果を得る。

関係組込み演算子の解釈を

表 7.4 に示す。ここで,x

1

は演算子の左側の演算対象を表し,x

2

は右側の演算対象を

表す。

表 7.4―関係組込み演算子の解釈

演算子

意味

演算子の使用法

解釈

.LT.

より小さい

x

1

.LT. x

2

x

1

は,x

2

より小さい

<

より小さい

x

1

x

2

x

1

は,x

2

より小さい

.LE.

以下

x

1

.LE. x

2

x

1

は,x

2

以下

<=

以下

x

1

<= x

2

x

1

は,x

2

以下

.GT.

より大きい

x

1

.GT. x

2

x

1

は,x

2

より大きい

>

より大きい

x

1

x

2

x

1

は,x

2

より大きい

.GE.

以上

x

1

.GE. x

2

x

1

は,x

2

以上

>=

以上

x

1

>= x

2

x

1

は,x

2

以上

.EQ.

等しい

x

1

.EQ. x

2

x

1

は,x

2

と等しい

==

等しい

x

1

== x

2

x

1

は,x

2

と等しい

.NE.

等しくない

x

1

.NE. x

2

x

1

は,x

2

と等しくない

/=

等しくない

x

1

/= x

2

x

1

は,x

2

と等しくない

数値関係組込み演算は,演算対象の値が演算子の指定する関係を満足すれば,真の論理値をもつ。数値関係組込み

演算は,演算対象の値が演算子の指定する関係を満足しなければ,偽の論理値をもつ。

数値関係演算

x

1

関係演算子 x

2

において,x

1

と x

2

との型 又は 種別型パラメタが異なるときは,それらは,評価に先立って式 x

1

x

2

の型 及び 種

別型パラメタに変換する。

文字関係組込み演算は,演算対象の値が演算子の指定する関係を満足すれば,真の論理値をもつ。文字関係組込み

演算は,演算対象の値が演算子の指定する関係を満足しなければ,偽の論理値をもつ。

文字関係組込み演算において,演算対象は,それぞれの最初の文字から始めて,順番に文字ごとに比較する。演算

対象の長さが異なるときは,短いほうの演算対象は,長いほうの演算対象の長さまで空白を右側に補ったものとして

扱われる。x

1

及び x

2

の両者が長さゼロである場合,x

1

は,x

2

に等しいとする。x

1

の各文字が x

2

の対応する位置

の文字に等しい場合,x

1

は,x

2

に等しいとする。等しくない場合,文字が異なる最初の位置において,その位置の


114

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

x

1

の文字値が x

2

の文字値よりも大小順序 (4.4.4.3) で先行しているときは,文字演算対象 x

1

は,x

2

より小さいと

する。その位置の x

1

の文字値が x

2

の文字値よりも大小順序で後続しているときは,文字演算対象 x

1

は,x

2

より

大きいとする。





注記 7.29

文字の大小順序は,部分的に処理系に依存する。ただし,演算子 .EQ.,.NE.,== 及び /= を

使用した結果は,文字の大小順序に依存しない。基本文字型でない文字型に対して補う空白文字は,

処理系依存とする。





7.2.4

論理組込み演算

論理組込み演算は,論理値の計算をするのに用いる。論理演算の評価によって論理型の結果を得る。論理組込み演

算の演算対象として許される型は,7.1.2 で規定する。

論理演算子 及び その解釈は,

表 7.5 に示す。ここで,x

1

は演算子の左側の演算対象を表し,x

2

は右側の演算対

象を表す。

表 7.5―論理組込み演算子の解釈

演算子

意味

演算子の使用法

解釈

.NOT.

論理否定

.NOT. x

2

x

2

が偽ならば真

.AND.

論理積

x

1

.AND. x

2

x

1

及び x

2

が共に真ならば真

.OR.

論理和

x

1

.OR. x

2

x

1

及び/又は x

2

が真ならば真

.NEQV.

論理非等価

x

1

.NEQV. x

2

x

1

又は x

2

のいずれかが真で他方が偽ならば真

.EQV.

論理等価

x

1

.EQV. x

2

x

1

及び x

2

が共に真 又は 共に偽ならば真

論理組込み演算の値の関係は,

表 7.6 に示す。

表 7.6―論理組込み演算子を含む演算の値の関係

x

1

x

2

.NOT. x

2

x

1

.AND. x

2

x

1

.OR. x

2

x

1

.EQV. x

2

x

1

.NEQV. x

2

7.3

演算子の優先順位

組込み演算 及び 拡張演算には,7.1.1 における式の一般形から導かれる優先順位がある。優先順位は,括弧を用い

ない限り,演算対象が結合する順序を決定する。この優先順位を

表 7.7 に示す。


115

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

表 7.7―演算の種類 及び その優先順位

演算の種類

演算子

優先順位

拡張

利用者定義単項演算子

最も高い

数値

**

.

数値

*

及び /

.

数値

単項の + 及び -

.

数値

2

項の + 及び -

.

文字

//

.

関係

.LT.

,.LE.,.GT.,.GE.,.EQ.,.NE.,

.

<

,<=,>,>=,== 及び /=

.

論理

.NOT.

.

論理

.AND.

.

論理

.OR.

.

論理

.EQV.

及び .NEQV.

.

拡張

利用者定義 2 項演算子

最も低い

利用者定義演算の優先順位は,その演算子による。





例 7.30

式 -A ** 2 において,べき乗演算子は,符号反転演算子よりも高い優先順位をもつ。したがって,

二つの演算対象が,べき乗演算子によって結び付いた式になり,次いでそれが符号反転演算子の演算

対象となる。この式の解釈は,- (A ** 2) と同じになる。





式の一般形 (7.1.1) は,同種の演算子の間にも優先順位を定める。この優先順位は,括弧を用いない限り,式を解

釈するときに演算対象が結合する順序を定める。


116

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)





例 7.31

二つ以上の “+” 又は “-” を含む数値段階式を解釈するとき,それぞれの演算対象(加減演算対

象)は,左から順に結合する。加減演算対象の中の乗除演算対象も左から順に結合し,他の段階式も

同様になる。ただし,乗除演算対象の式の中で,二つ以上のべき乗演算子 “**” が単項段階式を結合

するときは,右から順に結合する。

2.1 + 3.4 + 4.9

2.1 * 3.4 * 4.9

2.1 / 3.4 / 4.9

2 ** 3 ** 4

’AB’ // ’CD’ // ’EF’

上の式は,それぞれ次の式と同じ解釈になる。

(2.1 + 3.4) + 4.9

(2.1 * 3.4) * 4.9

(2.1 / 3.4) / 4.9

2 ** (3 ** 4)

(’AB’ // ’CD’) // ’EF’

一般形 (7.1.1) からの帰結として,数値段階式の最も左にある加減演算対象だけは,演算子 “+” 又

は “-” が先行してもよい。構文規則は,A ** - B 及び A + - B のような二つの連続した数値演算

子を含む式を禁止している。しかし,A ** (- B) 及び A + (- B) は,許される。次のような利用者

定義単項演算子の直前の 2 項演算子 又は 組込み単項演算子も,許される。

A * .INVERSE. B

- .INVERSE. (B)

一般形は,演算子 .AND. が演算子 .OR. よりも高い優先順位をもつことを暗黙的に意味している。

したがって,式 A .OR. B .AND. C の解釈は,A .OR. (B .AND. C) と同じになる。





例 7.32

式は,2 種類以上の段階の演算子を含んでもよい。A,B 及び C を実数型とし,L を論理型とする

とき,数値演算子,関係演算子 及び 論理演算子を含んでいる論理式 L .OR. A + B >= C の解釈は,

L .OR. ((A + B) >= C)

と同じになる。





例 7.33

L1

及び L2 を論理型とし,X 及び Y を実数型とする。この場合,

(1)

演算子 “**” が,論理型に拡張されていて,

(2)

演算子 “.STARSTAR.” が,実数型演算子 “**” を複製して定義されていて,

(3)

演算子 “.MINUS.” が,単項演算子 “-” を複製して定義されている

とき,優先順位において,L1 ** L2 は X * Y より高く,X * Y は X .STARSTAR. Y より高く,かつ

.MINUS. X

は -X より高い。





7.4

代入

代入文を実行すると,変数を確定 又は 再確定する。ポインタ代入を実行すると,ポインタを指示先と結合するか,

又は そのポインタ結合状態を空状態 若しくは 不定にする。WHERE 文 又は WHERE 構文を実行すると,論理型配

列式の値に従って,配列代入文における式の評価 及び 値の代入を選別する。FORALL 文 又は FORALL 構文を実

行すると,一組の指標変数 及び 選別式を用いて,配列要素への代入を制御する。

7.4.1

代入文

代入文の実行は,変数を確定 又は 再確定する。

7.4.1.1

一般形


117

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

R734

代入文

is

変数 = 式

C715

(R734)

代入文の変数は,大きさ引継ぎの全体配列であってはならない。





例 7.34

代入文

A = 3.5 + X * Y

I = INT (A)





代入文は,利用者定義代入文 又は 組込み代入文のいずれかの要件を満たさなければならない。

7.4.1.2

組込み代入文

組込み代入文 (intrinsic assignment statement) は,利用者定義代入文 (7.4.1.4) ではない代入文とする。組込み代

入文では変数は多相的ではなく,次の条件を満たす。

(1)

式が配列のとき,変数もまた配列である。

(2)

変数は式と同じ次元数の割付け配列であるか,変数 及び 式の形状が適合している。

(3)

変数 及び 式の宣言時の型が,表 7.8 のとおりに適合している。

表 7.8―組込み代入文 変数 ” の型適合

変数の型

式の型

整数型

整数型,実数型,複素数型

実数型

整数型,実数型,複素数型

複素数型

整数型,実数型,複素数型

ISO 10646

文字型, ASCII 文字型 又は 基本文字型

ISO 10646

文字型, ASCII 文字型 又は 基本文字型

その他の文字型

変数と同じ種別型パラメタをもつ文字型

論理型

論理型

派生型

変数と同じ種別型パラメタの派生型。各長さ型パラメタの

値は,対応する型パラメタが無指定である割付け変数を

除き,同じとする。

数値組込み代入文 (numeric intrinsic assignment statement) は,変数 及び 式が数値型である組込み代入文とする。

文字組込み代入文 (character intrinsic assignment statement) は,変数 及び 式の型が文字型の組込み代入文とする。

論理組込み代入文 (logical intrinsic assignment statement) は,変数 及び 式が論理型である組込み代入文とする。派

生型組込み代入文 (derived-type intrinsic assignment statement) は,変数 及び 式が派生型の組込み代入文とする。

配列組込み代入文 (array intrinsic assignment statement) は,変数が配列である組込み代入文とする。変数は,重

複部分配列 (6.2.2.3.2) であってはならない。

変数がポインタのとき,指示先 及び 式の型,型パラメタ 及び 形状が適合する確定可能な指示先と結合されなけ

ればならない。

7.4.1.3

組込み代入文の解釈

組込み代入文の実行によって,右辺の式の評価,変数の中のすべての式 (7.1.8) の評価,変数の型 及び 型パラメタ

への右辺の式の必要な変換(

表 7.9),並びに 計算結果による変数の確定をする。代入文を実行するときは,右辺の

式 及び 変数の中のすべての式を評価してから変数の任意の部分が確定する。変数の中の式の評価は,右辺の式の評

価に影響を与えたり与えられたりしてはならない。変数が長さゼロの文字型 又は 大きさゼロの配列である場合,変

数へはどのような値も代入されない。

変数がポインタである場合,式の値は,変数の指示先に代入される。


118

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

変数が割り付けられた割付け変数の場合,式が異なる形状の配列であるか 又は 変数と式の対応する長さ型パラメ

タ値のいずれかが異なるとき,割り付けられた変数は解放される。変数が割り付けられていない割付け変数であるか

又は 割り付けられていない割付け変数になる場合,変数は式の対応する型パラメタと等しい各無指定の型パラメタ,

式の形状,及び LBOUND(式) の対応する要素と等しい各下限に割り付けられる。





例 7.35

次の宣言による代入文において,NAME が以前に割り付けられていない場合 又は 異なる長さで割

り付けられていた場合でも,長さは LEN(FIRST NAME)+LEN(SURNAME)+5 となる。

CHARACTER(:),ALLOCATABLE :: NAME

NAME =

’Dr. ’//FIRST_NAME// ’ ’//SURNAME

しかし,次の代入文において,NAME は代入時に割付け済みでなければならない。代入される値は,以
前に割り付けられた NAME の長さによって,切り詰められるか 又は 空白が埋められる。

NAME(:) =

’Dr. ’//FIRST_NAME// ’ ’//SURNAME





変数 及び 式は,変数の一部を引用してもよい。





例 7.36

文字組込み代入文

STRING (2:5) = STRING (1:4)

において,STRING の 1 番目の文字の 2 番目の文字への代入は,STRING(1:4) の評価に影響しない。

もし代入前の STRING の値を ’ABCDEF’ とするならば,代入後の値は,’AABCDF’ となる。





右辺の式がスカラであり,変数が配列である場合,式は,変数と同じ形状の配列で,その配列のすべての要素が式

のスカラ値と同じものとして扱われる。

変数が配列である場合,代入は,変数 及び 式の対応する配列要素について要素ごとに実行される。





例 7.37

A

及び B を同じ形状の配列とすると,配列組込み代入 A = B は,B のそれぞれの要素を A の対応

する要素に代入する。すなわち,B の最初の要素を A の最初の要素に代入し,B の 2 番目の要素を A

の 2 番目の要素に代入する。C が 1 次元の割付け配列のとき,C = PACK(ARRAY,ARRAY>0) は,配列要

素順序に従って ARRAY のすべての正の要素を C に詰め込む。もし,C が割り付けられていないか 又は

誤った大きさで割り付けられている場合,PACK の結果を保持できる正しい大きさで再割付けされる。





処理系は,要素ごとの代入を任意の順序で実行してよい。





例 7.38

次の組込み代入文の実行によって,配列 X の要素は,逆順になる。

REAL X (10)

...

X (1:10) = X (10:1:-1)





数値組込み代入文では,変数 及び 式は,異なる数値型 又は 異なる種別型パラメタであってもよい。その場合,式

の値は,

表 7.9 の規則に従って,変数の型 及び 型パラメタに変換される。

表 7.9―数値変換 及び 代入文 変数 

変数の型

代入される値

整数

INT (

式, KIND = KIND ( 変数 ))

実数

REAL (

式, KIND = KIND ( 変数 ))

複素数

CMPLX (

式, KIND = KIND ( 変数 ))

注記

関数 INT,REAL,CMPLX 及び KIND は,13.7 において規定する総称関数とする。


119

X 3001-1 :

2009

(ISO/IEC 1539-1

: 2004

)

論理組込み代入文において,変数 及び 式は,異なる種別型パラメタをもっていてもよい。その場合,式の値は,変

数の種別型パラメタに変換される。

文字組込み代入文において,変数 及び 式は,異なる文字長パラメタをもっていてもよい。その場合,変数の長さ

への式の変換は,次のいずれかによる。

(1)

変数の長さが式の長さよりも小さい場合,式の値は,変数と同じ長さになるように右側を切り詰める。

(2)

変数の長さが式の長さよりも大きい場合,式の値は,変数と同じ長さになるように右側に空白を補い拡張する。

変数と式が異なる種別型パラメタをもつとき,式中の各文字 c は ACHAR(IACHAR(c),KIND(変数)) によって変数の

種別型パラメタに変換される。





注記 7.39

基本文字型でない文字型に対して補う空白文字は,処理系依存とする。文字式を種別の異なる変

数に代入するとき,変数の種別で表現不可能な式中の各文字は,処理系依存の文字に置き換えられる。





派生型組込み代入では,ポインタ成分についてはポインタ代入 (7.4.2) を用い,成分に一致する型束縛の利用者定

義代入をもつ型のポインタでも割付け成分でもない成分については利用者定義代入を用い,他のポインタでも割付け

成分でもない成分については組込み代入を用いて,右辺の式の各成分を変数の対応する成分に代入する。割付け成分

については,次の操作を順に適用する。

(1)

変数の成分が割り付けられているならば,解放される。

(2)

式の値の成分が割り付けられているならば,変数の対応する成分は式の値の成分と同じ実行時の型 及び 型パラ

メタが割り付けられる。成分が配列ならば,同じ上下限で割り付けられる。式の値の成分の値の,変数の対応