+ All Categories
Home > Documents > IBM XL Fortran for Linux, V15.1

IBM XL Fortran for Linux, V15.1

Date post: 16-Oct-2021
Category:
Upload: others
View: 19 times
Download: 0 times
Share this document with a friend
1196
IBM XL Fortran for Linux, V15.1.3 ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用) バージョン 15.1.3 SC43-2644-02 IBM
Transcript
Page 1: IBM XL Fortran for Linux, V15.1

IBM XL Fortran for Linux, V15.1.3

ランゲージ・リファレンス(リトル・エンディアン・ディストリビューション用)

バージョン 15.1.3

SC43-2644-02

IBM

Page 2: IBM XL Fortran for Linux, V15.1
Page 3: IBM XL Fortran for Linux, V15.1

IBM XL Fortran for Linux, V15.1.3

ランゲージ・リファレンス(リトル・エンディアン・ディストリビューション用)

バージョン 15.1.3

SC43-2644-02

IBM

Page 4: IBM XL Fortran for Linux, V15.1

お願い本書および本書で紹介する製品をご使用になる前に、 1125ページの『特記事項』に記載されている情報をお読みください。

本書は、IBM XL Fortran for Linux, V15.1.3 (プログラム 5765-J10; 5725-C75)、および新しい版で明記されていない限り、以降のすべてのリリースおよびモディフィケーションに適用されます。正しいレベルの製品をご使用になるようお確かめください。

お客様の環境によっては、資料中の円記号がバックスラッシュと表示されたり、バックスラッシュが円記号と表示されたりする場合があります。

 

原典: SC27-6590-02

IBM XL Fortran for Linux, V15.1.3

Language Reference

for Little Endian Distributions

Version 15.1.3

First edition

発行: 日本アイ・ビー・エム株式会社

担当: トランスレーション・サービス・センター

© Copyright IBM Corporation 1996, 2015.

Page 5: IBM XL Fortran for Linux, V15.1

目次本書について . . . . . . . . . . . . xv本書の対象読者 . . . . . . . . . . . . . xv本書の使用法 . . . . . . . . . . . . . . xv本書の構成 . . . . . . . . . . . . . . xv規則 . . . . . . . . . . . . . . . . xvi関連情報 . . . . . . . . . . . . . . . xxi

IBM XL Fortran 情報 . . . . . . . . . . xxi標準および仕様. . . . . . . . . . . . xxiiその他の IBM 情報 . . . . . . . . . . xxiii

技術サポート . . . . . . . . . . . . . xxiii

第 1 章 XL Fortran for Linux . . . . . 1Fortran 言語標準 . . . . . . . . . . . . . 1技術仕様 29113 . . . . . . . . . . . . 1Fortran 2008 . . . . . . . . . . . . . 2Fortran 2003 . . . . . . . . . . . . . 4Fortran 95 . . . . . . . . . . . . . . 5Fortran 90 . . . . . . . . . . . . . . 5FORTRAN 77 . . . . . . . . . . . . . 5IBM 拡張 . . . . . . . . . . . . . . 6

OpenMP API バージョン 4.5 . . . . . . . . . 6標準仕様書 . . . . . . . . . . . . . . . 6

第 2 章 XL Fortran 言語の基本要素 . . . 7文字 . . . . . . . . . . . . . . . . . 7名前 . . . . . . . . . . . . . . . . . 8指定子 . . . . . . . . . . . . . . . . 9演算子 . . . . . . . . . . . . . . . . 9ステートメント . . . . . . . . . . . . . 9ステートメント・キーワード . . . . . . . . 9ステートメント・ラベル . . . . . . . . . 9

区切り文字 . . . . . . . . . . . . . . 10行およびソース形式 . . . . . . . . . . . 10固定ソース形式 . . . . . . . . . . . . 11自由ソース形式 . . . . . . . . . . . . 13IBM 自由ソース形式 (IBM 拡張) . . . . . . 15条件付きコンパイル (IBM 拡張) . . . . . . 16

ステートメントの順序および実行シーケンス . . . 17データ型 . . . . . . . . . . . . . . . 18型宣言: 型パラメーターおよび指定子 . . . . . 19型の決定 . . . . . . . . . . . . . . 20

データ・オブジェクト . . . . . . . . . . . 21定数 . . . . . . . . . . . . . . . . 21自動オブジェクト . . . . . . . . . . . 21ポリモアフィック・エンティティー (Fortran2003) . . . . . . . . . . . . . . . 22変数の定義状況 . . . . . . . . . . . . 23割り振り状況 . . . . . . . . . . . . . 30変数のストレージ・クラス (IBM 拡張) . . . . 31

型なしのリテラル定数 . . . . . . . . . . . 3416 進定数 . . . . . . . . . . . . . . 34

8 進定数 . . . . . . . . . . . . . . 342 進定数 . . . . . . . . . . . . . . 35ホレリス定数 . . . . . . . . . . . . . 36型なし定数の使用方法 . . . . . . . . . . 36

第 3 章 組み込みデータ型 . . . . . . . 41整数 . . . . . . . . . . . . . . . . . 41実数 . . . . . . . . . . . . . . . . . 42複素数 . . . . . . . . . . . . . . . . 45論理演算子 . . . . . . . . . . . . . . 47文字演算子 . . . . . . . . . . . . . . 48文字定数の例 . . . . . . . . . . . . . 50文字サブストリング . . . . . . . . . . 50

バイト (IBM 拡張) . . . . . . . . . . . . 51ベクトル (IBM 拡張) . . . . . . . . . . . 52ピクセル (IBM 拡張) . . . . . . . . . . . 53Unsigned (IBM 拡張) . . . . . . . . . . . 53

第 4 章 派生型 . . . . . . . . . . . 55派生型の構文 . . . . . . . . . . . . . . 55派生型パラメーター (Fortran 2003) . . . . . . 56派生型コンポーネント . . . . . . . . . . . 57割り振り可能コンポーネントおよびポインター・コンポーネント . . . . . . . . . . . . 59プロシージャー・ポインター・コンポーネント . 60配列のコンポーネント . . . . . . . . . . 61コンポーネントのデフォルト初期化 . . . . . 61コンポーネントの順序 . . . . . . . . . . 63コンポーネントの参照 . . . . . . . . . . 63

コンポーネントおよびプロシージャーのアクセス可能度 . . . . . . . . . . . . . . . . . 65順序派生型 . . . . . . . . . . . . . . 65拡張可能派生型 (Fortran 2003) . . . . . . . . 66抽象型および据え置きバインディング (Fortran 2003) 67派生型の値 . . . . . . . . . . . . . . 68型制約プロシージャー (Fortran 2003) . . . . . . 68型制約プロシージャーの構文 . . . . . . . 68特定バインディング . . . . . . . . . . 69総称バインディング . . . . . . . . . . 71最終バインディング . . . . . . . . . . 73プロシージャーのオーバーライド . . . . . . 75

最終化 (Fortran 2003) . . . . . . . . . . . 76最終化プロセス . . . . . . . . . . . . 76最終化が行われる条件 . . . . . . . . . . 77

派生型の宣言型の決定 . . . . . . . . . . . 78構造体コンストラクター . . . . . . . . . . 79

第 5 章 配列の概念 . . . . . . . . . 85配列の基本 . . . . . . . . . . . . . . 85次元の境界 . . . . . . . . . . . . . 85次元のエクステント . . . . . . . . . . 86

© Copyright IBM Corp. 1996, 2015 iii

Page 6: IBM XL Fortran for Linux, V15.1

配列のランク、形状、およびサイズ . . . . . 86配列宣言子 . . . . . . . . . . . . . . 86明示的形状配列 . . . . . . . . . . . . . 87自動割り付け配列 . . . . . . . . . . . 88調整可能配列 . . . . . . . . . . . . . 89ポインティング先配列 (IBM 拡張). . . . . . 89

想定形状配列 . . . . . . . . . . . . . . 90据え置き形状配列 . . . . . . . . . . . . 91割り振り可能配列 . . . . . . . . . . . 92配列ポインター . . . . . . . . . . . . 93

暗黙形状配列 (Fortran 2008) . . . . . . . . . 94想定サイズ配列 . . . . . . . . . . . . . 95想定ランク・オブジェクト (TS 29113) . . . . . 97配列エレメント . . . . . . . . . . . . . 98配列セクション . . . . . . . . . . . . . 99添え字トリプレット . . . . . . . . . . 101ベクトル添え字 . . . . . . . . . . . . 103サブストリングの範囲 . . . . . . . . . 104配列セクションと構造体コンポーネント . . . 104配列セクションのランクおよび形状 . . . . . 105

配列コンストラクター . . . . . . . . . . 106配列コンストラクターの暗黙 DO リスト . . . 109

連続性 (Fortran 2008) . . . . . . . . . . . 110配列を含む式 . . . . . . . . . . . . . 111

第 6 章 式および代入 . . . . . . . . 113式および代入の概要 . . . . . . . . . . . 113

1 次式 . . . . . . . . . . . . . . . 113定数式 . . . . . . . . . . . . . . . . 114宣言式 . . . . . . . . . . . . . . . . 115演算子と式 . . . . . . . . . . . . . . 117算術 . . . . . . . . . . . . . . . 117文字演算子 . . . . . . . . . . . . . 120一般 . . . . . . . . . . . . . . . 120論理演算子 . . . . . . . . . . . . . 1211 次式 . . . . . . . . . . . . . . . 123関係演算子 . . . . . . . . . . . . . 124

拡張組み込み演算および定義済み演算 . . . . . 125式の評価について . . . . . . . . . . . . 126演算子の優先順位 . . . . . . . . . . . 126BYTE データ・オブジェクトの使用法 (IBM 拡張) . . . . . . . . . . . . . . . . 129

組み込み代入 . . . . . . . . . . . . . 130算術変換 . . . . . . . . . . . . . . 132

WHERE 構文 . . . . . . . . . . . . . 133マスクされた配列代入の解釈 . . . . . . . 136

FORALL 構文 . . . . . . . . . . . . . 141FORALL 構文の解釈 . . . . . . . . . . 142

データ・ポインターの代入 . . . . . . . . . 144プロシージャー・ポインターの代入 (Fortran 2003) 147整数ポインターの代入 (IBM 拡張) . . . . . . 148

第 7 章 実行制御 . . . . . . . . . . 149ステートメント・ブロック . . . . . . . . . 149ASSOCIATE 構文 (Fortran 2003) . . . . . . . 150BLOCK 構文 (Fortran 2008) . . . . . . . . 151

DO 構文 . . . . . . . . . . . . . . . 153終端ステートメント . . . . . . . . . . 154DO CONCURRENT 構文 (Fortran 2008) . . . 157DO WHILE 構文 . . . . . . . . . . . 157

IF 構文 . . . . . . . . . . . . . . . 158CASE 構文 . . . . . . . . . . . . . . 160SELECT TYPE 構文 (Fortran 2003) . . . . . . 163関連名 . . . . . . . . . . . . . . . . 165分岐 . . . . . . . . . . . . . . . . 166CONTINUE ステートメント . . . . . . . . 166STOP ステートメント . . . . . . . . . . 167ERROR STOP ステートメント (Fortran 2008). . . 167

第 8 章 プログラム単位およびプロシージャー . . . . . . . . . . . . . . 169スコープ . . . . . . . . . . . . . . . 169有効範囲単位 . . . . . . . . . . . . 169有効範囲を持つエンティティー . . . . . . 170

関連付け . . . . . . . . . . . . . . . 175ホスト関連付け . . . . . . . . . . . . 175使用関連付け . . . . . . . . . . . . 177構文関連付け . . . . . . . . . . . . 178ポインター関連付け . . . . . . . . . . 178整数ポインター関連付け (IBM 拡張) . . . . 180

プログラム単位、プロシージャー、およびサブプログラム . . . . . . . . . . . . . . . . 181内部プロシージャー . . . . . . . . . . 182インターフェースの概念 . . . . . . . . . 183

インターフェース・ブロック . . . . . . . . 185総称インターフェース・ブロック . . . . . . . 189一義的な総称プロシージャー参照 . . . . . . 189総称インターフェース・ブロックによる組み込みプロシージャーの拡張 . . . . . . . . . 191定義済み演算子 . . . . . . . . . . . . 192定義済み代入 . . . . . . . . . . . . 193ユーザー定義の派生型入出力プロシージャー(Fortran 2003) . . . . . . . . . . . . 194

抽象インターフェース (Fortran 2003) . . . . . 197メインプログラム . . . . . . . . . . . . 198モジュール . . . . . . . . . . . . . . 199サブモジュール (Fortran 2008) . . . . . . . . 203モジュール・サブプログラム . . . . . . . . 206関数サブプログラムとサブルーチン・サブプログラム . . . . . . . . . . . . . . . 206分離モジュール・サブプログラム (Fortran 2008) 212

ブロック・データ・プログラム単位 . . . . . . 214組み込みプロシージャー . . . . . . . . . . 216組み込みプロシージャー名と他の名前の競合 . . 216

引数 . . . . . . . . . . . . . . . . 217実引数の指定 . . . . . . . . . . . . 217

引数関連付け . . . . . . . . . . . . . 219%VAL および %REF (IBM 拡張) . . . . . 221仮引数の意図 . . . . . . . . . . . . 222オプションの仮引数 . . . . . . . . . . 223オブジェクト受け渡し仮引数 . . . . . . . 223

iv XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 7: IBM XL Fortran for Linux, V15.1

指定されていないオプションの仮引数に関する制約事項 . . . . . . . . . . . . . . . 223文字引数の長さ . . . . . . . . . . . . 225仮引数が変数の場合 . . . . . . . . . . 225仮引数が割り振り可能オブジェクトの場合(Fortran 2003) . . . . . . . . . . . . 228仮引数がポインターの場合 . . . . . . . . 229仮引数がプロシージャーの場合 . . . . . . 230仮引数がアスタリスクの場合 . . . . . . . 231

プロシージャー参照の解決 . . . . . . . . . 232プロシージャー参照を名前に解決する場合の規則 232

再帰 . . . . . . . . . . . . . . . . 233純粋プロシージャー . . . . . . . . . . . 234エレメント型プロシージャー . . . . . . . . 237

第 9 章 XL Fortran の入出力. . . . . 241レコード . . . . . . . . . . . . . . . 241定様式レコード . . . . . . . . . . . . 241不定形式レコード . . . . . . . . . . . 241ファイル終了レコード . . . . . . . . . 241

ファイル . . . . . . . . . . . . . . . 242外部ファイルの定義 . . . . . . . . . . 242ファイル・アクセス方式 . . . . . . . . . 243

装置 . . . . . . . . . . . . . . . . 245装置の接続 . . . . . . . . . . . . . 245

データ転送ステートメント . . . . . . . . . 247非同期入出力 . . . . . . . . . . . . 248アドバンス入出力および非アドバンス入出力 . . 249ユーザー定義の派生型入出力プロシージャー・インターフェース (Fortran 2003) . . . . . . . 250ユーザー定義の派生型入出力 (Fortran 2003) . . 250データ転送が行われる前後のファイルの位置 . . 252

条件および IOSTAT 値 . . . . . . . . . . 254レコード終了条件 . . . . . . . . . . . 254ファイル終了条件 . . . . . . . . . . . 255エラー条件 . . . . . . . . . . . . . 255

第 10 章 入出力の形式設定 . . . . . . 267形式指示の形式設定 . . . . . . . . . . . 267複素数編集 . . . . . . . . . . . . . 267データ編集記述子 . . . . . . . . . . . 267制御編集記述子 . . . . . . . . . . . . 272文字ストリング編集記述子 . . . . . . . . 273有効リスト項目 (Fortran 2003) . . . . . . . 274入出力リストと形式仕様の相互作用 . . . . . 275コンマで区切られた入出力 (IBM 拡張) . . . . 277

データ編集記述子 . . . . . . . . . . . . 278A (文字) 編集 . . . . . . . . . . . . 278B (2 進) 編集 . . . . . . . . . . . . 278E、D、および Q (拡張精度) 編集 . . . . . 280DT 編集 (Fortran 2003) . . . . . . . . . 281EN 編集 . . . . . . . . . . . . . . 282ES 編集 . . . . . . . . . . . . . . 283F (指数なしの実数) 編集 . . . . . . . . 284G (一般) 編集 . . . . . . . . . . . . 286H 編集 . . . . . . . . . . . . . . 288

I (整数) 編集 . . . . . . . . . . . . 288L (論理) 編集 . . . . . . . . . . . . 290O (8 進) 編集 . . . . . . . . . . . . 290Q (文字カウント) 編集 (IBM 拡張) . . . . . 292Z (16 進) 編集 . . . . . . . . . . . . 293

制御編集記述子 . . . . . . . . . . . . . 294/ (スラッシュ) 編集 . . . . . . . . . . 294: (コロン) 編集 . . . . . . . . . . . . 295$ (ドル記号) 編集 (IBM 拡張). . . . . . . 296BN (ブランク・ヌル) および BZ (ブランク・ゼロ) 編集 . . . . . . . . . . . . . . 296DC および DP (10 進) 編集 (Fortran 2003) . . 297P (スケール因数) 編集 . . . . . . . . . 297RC、RD、RN、RP、RU、および RZ (丸め) 編集 (Fortran 2003) . . . . . . . . . . . 298S、SP、および SS (符号制御) 編集 . . . . . 299T、TL、TR、および X (定位置) 編集 . . . . 299

リスト指示の形式設定 . . . . . . . . . . 301値のセパレーター . . . . . . . . . . . 301リスト指示入力 . . . . . . . . . . . . 301リスト指示出力 . . . . . . . . . . . . 303

名前リストの形式設定 . . . . . . . . . . 305名前リスト入力 . . . . . . . . . . . . 305名前リスト出力 . . . . . . . . . . . . 310

第 11 章 ステートメントおよび属性 313属性 . . . . . . . . . . . . . . . . 316ABSTRACT (Fortran 2003) . . . . . . . . . 317ALLOCATABLE (Fortran 2003) . . . . . . . 318ALLOCATE . . . . . . . . . . . . . . 319ASSIGN . . . . . . . . . . . . . . . 323ASSOCIATE (Fortran 2003) . . . . . . . . . 324ASYNCHRONOUS . . . . . . . . . . . . 325AUTOMATIC (IBM 拡張) . . . . . . . . . 327BACKSPACE . . . . . . . . . . . . . 329BIND (Fortran 2003) . . . . . . . . . . . 331BLOCK (Fortran 2008) . . . . . . . . . . 332BLOCK DATA . . . . . . . . . . . . . 333BYTE (IBM 拡張) . . . . . . . . . . . . 333CALL . . . . . . . . . . . . . . . . 336CASE . . . . . . . . . . . . . . . . 339CHARACTER . . . . . . . . . . . . . 341CLASS (Fortran 2003). . . . . . . . . . . 346CLOSE . . . . . . . . . . . . . . . 347COMMON . . . . . . . . . . . . . . 350共通関連 . . . . . . . . . . . . . . 352

COMPLEX . . . . . . . . . . . . . . 354CONTAINS . . . . . . . . . . . . . . 358CONTIGUOUS (Fortran 2008) . . . . . . . . 359CONTINUE . . . . . . . . . . . . . . 361CYCLE . . . . . . . . . . . . . . . 362DATA . . . . . . . . . . . . . . . . 363DEALLOCATE . . . . . . . . . . . . . 367派生型 . . . . . . . . . . . . . . . . 369DIMENSION . . . . . . . . . . . . . . 371DO . . . . . . . . . . . . . . . . . 372

目次 v

Page 8: IBM XL Fortran for Linux, V15.1

DO CONCURRENT (Fortran 2008) . . . . . . 374DO WHILE . . . . . . . . . . . . . . 377DOUBLE COMPLEX (IBM 拡張) . . . . . . . 378DOUBLE PRECISION. . . . . . . . . . . 381ELSE . . . . . . . . . . . . . . . . 384ELSE IF . . . . . . . . . . . . . . . 385ELSEWHERE . . . . . . . . . . . . . 386END . . . . . . . . . . . . . . . . 387END (構文) . . . . . . . . . . . . . . 389END INTERFACE . . . . . . . . . . . . 392END TYPE . . . . . . . . . . . . . . 394ENDFILE . . . . . . . . . . . . . . . 394ENTRY . . . . . . . . . . . . . . . 397ENUM/END ENUM (Fortran 2003) . . . . . . 400EQUIVALENCE. . . . . . . . . . . . . 402ERROR STOP (Fortran 2008) . . . . . . . . 404EXIT . . . . . . . . . . . . . . . . 405EXTERNAL . . . . . . . . . . . . . . 407FLUSH (Fortran 2003) . . . . . . . . . . 409FORALL . . . . . . . . . . . . . . . 411

FORALL ステートメントの解釈 . . . . . . 413ループ並列化 . . . . . . . . . . . . 414

FORALL (構文). . . . . . . . . . . . . 415FORMAT . . . . . . . . . . . . . . . 417文字形式仕様 . . . . . . . . . . . . 418

FUNCTION . . . . . . . . . . . . . . 419再帰 . . . . . . . . . . . . . . . 423エレメント型プロシージャー . . . . . . . 424

GO TO (代入) . . . . . . . . . . . . . 424GO TO (計算) . . . . . . . . . . . . . 425GO TO (無条件) . . . . . . . . . . . . 426IF (算術) . . . . . . . . . . . . . . . 427IF (ブロック) . . . . . . . . . . . . . 428IF (論理) . . . . . . . . . . . . . . . 429IMPLICIT. . . . . . . . . . . . . . . 430IMPORT (Fortran 2003) . . . . . . . . . . 432INQUIRE . . . . . . . . . . . . . . . 433INTEGER . . . . . . . . . . . . . . . 442INTENT . . . . . . . . . . . . . . . 446INTERFACE . . . . . . . . . . . . . . 448INTRINSIC . . . . . . . . . . . . . . 451LOGICAL. . . . . . . . . . . . . . . 452MODULE . . . . . . . . . . . . . . . 456MODULE PROCEDURE (Fortran 2008) . . . . . 457NAMELIST . . . . . . . . . . . . . . 458NULLIFY . . . . . . . . . . . . . . . 459OPEN . . . . . . . . . . . . . . . . 460OPTIONAL . . . . . . . . . . . . . . 468PARAMETER . . . . . . . . . . . . . 470PAUSE . . . . . . . . . . . . . . . 471POINTER (Fortran 90) . . . . . . . . . . 472POINTER (integer) (IBM 拡張). . . . . . . . 474PRINT . . . . . . . . . . . . . . . . 476暗黙 DO リスト . . . . . . . . . . . 477

PRIVATE . . . . . . . . . . . . . . . 478PROCEDURE . . . . . . . . . . . . . 479

PROCEDURE 宣言 (Fortran 2003). . . . . . . 481PROGRAM . . . . . . . . . . . . . . 484PROTECTED (Fortran 2003). . . . . . . . . 485PUBLIC . . . . . . . . . . . . . . . 486READ . . . . . . . . . . . . . . . . 488暗黙 DO リスト . . . . . . . . . . . 496

REAL . . . . . . . . . . . . . . . . 496RECORD (IBM 拡張) . . . . . . . . . . . 500RETURN . . . . . . . . . . . . . . . 502REWIND . . . . . . . . . . . . . . . 503SAVE . . . . . . . . . . . . . . . . 505SELECT CASE . . . . . . . . . . . . . 507SELECT TYPE (Fortran 2003) . . . . . . . . 508SEQUENCE . . . . . . . . . . . . . . 509ステートメント関数 . . . . . . . . . . . 510STATIC (IBM 拡張) . . . . . . . . . . . 512STOP . . . . . . . . . . . . . . . . 513SUBMODULE (Fortran 2008) . . . . . . . . 515SUBROUTINE . . . . . . . . . . . . . 517TARGET . . . . . . . . . . . . . . . 520TYPE . . . . . . . . . . . . . . . . 521型宣言 . . . . . . . . . . . . . . . . 526保護型 (Fortran 2003) . . . . . . . . . . . 533USE . . . . . . . . . . . . . . . . 534VALUE (Fortran 2003) . . . . . . . . . . 538VECTOR (IBM 拡張) . . . . . . . . . . . 539VIRTUAL (IBM 拡張) . . . . . . . . . . 539VOLATILE . . . . . . . . . . . . . . 540WAIT (Fortran 2003) . . . . . . . . . . . 542WHERE . . . . . . . . . . . . . . . 545WRITE . . . . . . . . . . . . . . . 547暗黙 DO リスト . . . . . . . . . . . 553

第 12 章 ディレクティブ (IBM 拡張) 555コメント形式および非コメント形式のディレクティブ . . . . . . . . . . . . . . . . . 555コメント形式ディレクティブ . . . . . . . 555非コメント形式ディレクティブ . . . . . . 558

ディレクティブと最適化 . . . . . . . . . . 558アサーティブ・ディレクティブ . . . . . . 558ループ最適化のためのディレクティブ . . . . 558

ディレクティブの詳細説明 . . . . . . . . . 559ALIGN . . . . . . . . . . . . . . 559ASSERT . . . . . . . . . . . . . . 560BLOCK_LOOP . . . . . . . . . . . . 563CNCALL . . . . . . . . . . . . . . 564COLLAPSE . . . . . . . . . . . . . 565EJECT . . . . . . . . . . . . . . . 567EXECUTION_FREQUENCY (IBM 拡張) . . . 568EXPECTED_VALUE . . . . . . . . . . 568FUNCTRACE_XLF_CATCH . . . . . . . . 569FUNCTRACE_XLF_ENTER . . . . . . . . 570FUNCTRACE_XLF_EXIT . . . . . . . . 571IGNORE_TKR (IBM 拡張) . . . . . . . . 571INCLUDE. . . . . . . . . . . . . . 572INDEPENDENT . . . . . . . . . . . . 574

vi XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 9: IBM XL Fortran for Linux, V15.1

#LINE . . . . . . . . . . . . . . . 578LOOPID . . . . . . . . . . . . . . 580MEM_DELAY . . . . . . . . . . . . 581NEW . . . . . . . . . . . . . . . 582NOFUNCTRACE . . . . . . . . . . . 583NOSIMD . . . . . . . . . . . . . . 584NOVECTOR . . . . . . . . . . . . . 585PERMUTATION . . . . . . . . . . . 586@PROCESS . . . . . . . . . . . . . 587SNAPSHOT . . . . . . . . . . . . . 588SOURCEFORM . . . . . . . . . . . . 589STREAM_UNROLL . . . . . . . . . . 591SUBSCRIPTORDER . . . . . . . . . . 592UNROLL . . . . . . . . . . . . . . 594UNROLL_AND_FUSE. . . . . . . . . . 596

第 13 章 ハードウェア固有のディレクティブ . . . . . . . . . . . . . . 599キャッシュ制御 . . . . . . . . . . . . . 599

CACHE_ZERO . . . . . . . . . . . . 599DCBF . . . . . . . . . . . . . . . 599DCBFL . . . . . . . . . . . . . . 600DCBFLP . . . . . . . . . . . . . . 600DCBST . . . . . . . . . . . . . . 601EIEIO . . . . . . . . . . . . . . . 601ISYNC. . . . . . . . . . . . . . . 602LIGHT_SYNC . . . . . . . . . . . . 602

PREFETCH . . . . . . . . . . . . . . 602DCBTSTT . . . . . . . . . . . . . 603DCBTT . . . . . . . . . . . . . . 603DEFAULT_PREFETCH_DEPTH . . . . . . 604DEPTH_ATTAINMENT_URGENCY . . . . . 605HARDWARE_TRANSIENT_ENABLE . . . . . 605HARDWARE_UNIT_COUNT_ENABLE . . . . 606LOAD_STREAM_DISABLE . . . . . . . . 606LOAD_TRANSIENT_ENABLE . . . . . . . 606PARTIAL_DCBT . . . . . . . . . . . 607PREFETCH_BY_LOAD . . . . . . . . . 607PREFETCH_BY_STREAM . . . . . . . . 608PREFETCH_FOR_LOAD . . . . . . . . . 609PREFETCH_FOR_STORE . . . . . . . . 609PREFETCH_GET_DSCR_REGISTER . . . . . 609PREFETCH_SET_DSCR_REGISTER(VALUE) . . 610PROTECTED_STORE_STREAM_SET . . . . . 610PROTECTED_STREAM_COUNT . . . . . . 611PROTECTED_STREAM_COUNT_DEPTH . . . 611PROTECTED_STREAM_GO . . . . . . . . 612PROTECTED_STREAM_SET . . . . . . . 613PROTECTED_STREAM_STRIDE . . . . . . 613PROTECTED_STREAM_STOP . . . . . . . 614PROTECTED_STREAM_STOP_ALL . . . . . 614PROTECTED_UNLIMITED_STORE_STREAM_SET . . . . . . . . . . . . . . . 615PROTECTED_UNLIMITED_STREAM_SET . . . 615PROTECTED_UNLIMITED_STREAM_ SET_GO 616SET_PREFETCH_UNIT_COUNT . . . . . . 617

SOFTWARE_TRANSIENT_ENABLE . . . . . 617SOFTWARE_UNIT_COUNT_ENABLE . . . . 618STORE_TRANSIENT_ENABLE. . . . . . . 618STRIDE_N_STREAM_ENABLE. . . . . . . 618TRANSIENT_PROTECTED_STREAM_COUNT_DEPTH . . . . . . . . . . . . . . 619TRANSIENT_UNLIMITED_PROTECTED_STREAM_DEPTH . . . . . . . . . . . 619UNLIMITED_PROTECTED_STREAM_DEPTH 620例 . . . . . . . . . . . . . . . . 620

第 14 章 組み込みプロシージャー . . . 623組み込みプロシージャーのクラス . . . . . . . 623照会組み込み関数 . . . . . . . . . . . 623エレメント型組み込みプロシージャー . . . . 623システム照会組み込み関数 (IBM 拡張) . . . . 625変換組み込み関数 . . . . . . . . . . . 625組み込みサブルーチン . . . . . . . . . 625

データ表記モデル . . . . . . . . . . . . 626整数ビット・モデル . . . . . . . . . . 626整数データ・モデル . . . . . . . . . . 626実数データ・モデル . . . . . . . . . . 627

組み込みプロシージャーの詳細説明 . . . . . . 628ABORT() (IBM 拡張) . . . . . . . . . . 629ABS(A) . . . . . . . . . . . . . . 629ACHAR(I, KIND) . . . . . . . . . . . 630ACOS(X) . . . . . . . . . . . . . . 631ACOSD(X) (IBM 拡張) . . . . . . . . . 632ACOSH(X) (Fortran 2008) . . . . . . . . 632ADJUSTL(STRING) . . . . . . . . . . 633ADJUSTR(STRING) . . . . . . . . . . 633AIMAG(Z)、IMAG(Z) . . . . . . . . . . 634AINT(A, KIND). . . . . . . . . . . . 635ALIGNX(K,M) (IBM 拡張) . . . . . . . . 635ALL(MASK, DIM) . . . . . . . . . . . 636ALLOCATED(X) . . . . . . . . . . . 637ANINT(A, KIND) . . . . . . . . . . . 638ANY(MASK, DIM). . . . . . . . . . . 639ASIN(X) . . . . . . . . . . . . . . 639ASIND(X) (IBM 拡張) . . . . . . . . . 640ASINH(X) (Fortran 2008). . . . . . . . . 641ASSOCIATED(POINTER, TARGET) . . . . . 642ATAN(X) . . . . . . . . . . . . . . 643ATAN(Y, X) (Fortran 2008) . . . . . . . . 644ATAN2(Y, X) . . . . . . . . . . . . 644ATAN2D(Y, X) (IBM 拡張). . . . . . . . 645ATAND(X) (IBM 拡張) . . . . . . . . . 646ATANH(X) (Fortran 2008) . . . . . . . . 647BTEST(I, POS) . . . . . . . . . . . . 648BIT_SIZE(I) . . . . . . . . . . . . . 649CEILING(A, KIND) . . . . . . . . . . 649CHAR(I, KIND). . . . . . . . . . . . 650CMPLX(X, Y, KIND) . . . . . . . . . . 651COMMAND_ARGUMENT_COUNT() (Fortran2003) . . . . . . . . . . . . . . . 652CONJG(Z) . . . . . . . . . . . . . 652

目次 vii

Page 10: IBM XL Fortran for Linux, V15.1

COS(X) . . . . . . . . . . . . . . 653COSD(X) (IBM 拡張) . . . . . . . . . . 654COSH(X) . . . . . . . . . . . . . . 655COUNT(MASK, DIM, KIND) . . . . . . . 655CPU_TIME(TIME) (Fortran 95) . . . . . . . 656CSHIFT(ARRAY, SHIFT, DIM) . . . . . . 658CVMGx(TSOURCE, FSOURCE, MASK) (IBM 拡張) . . . . . . . . . . . . . . . . 659DATE_AND_TIME(DATE, TIME, ZONE,VALUES) . . . . . . . . . . . . . . 660DBLE(A) . . . . . . . . . . . . . . 662DCMPLX(X, Y) (IBM 拡張) . . . . . . . 663DIGITS(X) . . . . . . . . . . . . . 664DIM(X, Y) . . . . . . . . . . . . . 664DOT_PRODUCT(VECTOR_A, VECTOR_B). . . 665DPROD(X, Y) . . . . . . . . . . . . 666DSHIFTL(I, J, SHIFT) (Fortran 2008). . . . . 666DSHIFTR(I, J, SHIFT) (Fortran 2008) . . . . 667EOSHIFT(ARRAY, SHIFT, BOUNDARY, DIM) 668EPSILON(X) . . . . . . . . . . . . . 670ERF(X) (Fortran 2008) . . . . . . . . . 670ERFC(X) (Fortran 2008) . . . . . . . . . 671ERFC_SCALED(X) (Fortran 2008) . . . . . . 672EXECUTE_COMMAND_LINE(COMMAND,WAIT, EXITSTAT, CMDSTAT, CMDMSG)(Fortran 2008) . . . . . . . . . . . . 672EXP(X) . . . . . . . . . . . . . . 674EXPONENT(X) . . . . . . . . . . . . 675EXTENDS_TYPE_OF(A, MOLD) (Fortran 2003) 676FINDLOC(ARRAY, VALUE, DIM, MASK,KIND, BACK) または FINDLOC(ARRAY,VALUE, MASK, KIND, BACK) (Fortran 2008) . 676FLOOR(A, KIND) . . . . . . . . . . . 679FRACTION(X) . . . . . . . . . . . . 679GAMMA(X) (Fortran 2008) . . . . . . . . 680GET_COMMAND(COMMAND, LENGTH,STATUS) (Fortran 2003) . . . . . . . . . 681GET_COMMAND_ARGUMENT(NUMBER,VALUE, LENGTH, STATUS) (Fortran 2003) . . 682GET_ENVIRONMENT_VARIABLE(NAME,VALUE, LENGTH, STATUS, TRIM_NAME)(Fortran 2003) . . . . . . . . . . . . 683GETENV(NAME, VALUE) (IBM 拡張) . . . . 684HFIX(A) (IBM 拡張) . . . . . . . . . . 684HYPOT(X, Y) (Fortran 2008) . . . . . . . 685HUGE(X) . . . . . . . . . . . . . . 686IACHAR(C, KIND). . . . . . . . . . . 686IAND(I, J) . . . . . . . . . . . . . 687IBCLR(I, POS) . . . . . . . . . . . . 688IBITS(I, POS, LEN) . . . . . . . . . . 689IBM2GCCLDBL(A) (IBM 拡張) . . . . . . 689IBM2GCCLDBL_CMPLX(A). . . . . . . . 690IBSET(I, POS) . . . . . . . . . . . . 690ICHAR(C, KIND) . . . . . . . . . . . 691IEOR(I, J) . . . . . . . . . . . . . 692ILEN(I) (IBM 拡張) . . . . . . . . . . 693

IMAG(Z) (IBM 拡張) . . . . . . . . . . 693INDEX(STRING, SUBSTRING, BACK, KIND) 694INT(A, KIND) . . . . . . . . . . . . 695INT2(A) (IBM 拡張) . . . . . . . . . . 696IOR(I, J) . . . . . . . . . . . . . . 697IS_CONTIGUOUS(ARRAY) (Fortran 2008) . . . 698IS_IOSTAT_END(I) (Fortran 2003) . . . . . 698IS_IOSTAT_EOR(I) (Fortran 2003). . . . . . 699ISHFT(I, SHIFT) . . . . . . . . . . . 699ISHFTC(I, SHIFT, SIZE) . . . . . . . . . 700KIND(X) . . . . . . . . . . . . . . 701LBOUND(ARRAY, DIM, KIND) . . . . . . 702LEADZ(I) (Fortran 2008) . . . . . . . . . 703LEN(STRING, KIND) . . . . . . . . . . 703LEN_TRIM(STRING, KIND) . . . . . . . 704LGAMMA(X) (IBM 拡張) . . . . . . . . 705LGE(STRING_A, STRING_B) . . . . . . . 705LGT(STRING_A, STRING_B) . . . . . . . 706LLE(STRING_A, STRING_B) . . . . . . . 707LLT(STRING_A, STRING_B) . . . . . . . 708LOC(X) (IBM 拡張) . . . . . . . . . . 709LOG(X) . . . . . . . . . . . . . . 710LOG_GAMMA(X) (Fortran 2008) . . . . . . 711LOG10(X) . . . . . . . . . . . . . 712LOGICAL(L, KIND) . . . . . . . . . . 712LSHIFT(I, SHIFT) (IBM 拡張) . . . . . . . 713MASKL(I, KIND) (Fortran 2008) . . . . . . 714MASKR(I, KIND) (Fortran 2008) . . . . . . 714MATMUL(MATRIX_A, MATRIX_B, MINDIM) 715MAX(A1, A2, A3, ...) . . . . . . . . . . 717MAXEXPONENT(X) . . . . . . . . . . 718MAXLOC(ARRAY, DIM, MASK, KIND, BACK)または MAXLOC(ARRAY, MASK, KIND,BACK) . . . . . . . . . . . . . . 718MAXVAL(ARRAY, DIM, MASK) またはMAXVAL(ARRAY, MASK) . . . . . . . . 721MERGE(TSOURCE, FSOURCE, MASK) . . . . 722MERGE_BITS(I, J, MASK) (Fortran 2008) . . . 723MIN(A1, A2, A3, ...) . . . . . . . . . . 724MINEXPONENT(X) . . . . . . . . . . 725MINLOC(ARRAY, DIM, MASK, KIND, BACK)または MINLOC(ARRAY, MASK, KIND,BACK) . . . . . . . . . . . . . . 725MINVAL(ARRAY, DIM, MASK) またはMINVAL(ARRAY, MASK) . . . . . . . . 727MOD(A, P) . . . . . . . . . . . . . 729MODULO(A, P). . . . . . . . . . . . 730MOVE_ALLOC(FROM, TO) (Fortran 2003) . . . 731MVBITS(FROM, FROMPOS, LEN, TO, TOPOS) 731NEAREST(X,S) . . . . . . . . . . . . 732NEW_LINE(A) (Fortran 2003) . . . . . . . 733NINT(A, KIND). . . . . . . . . . . . 733NOT(I). . . . . . . . . . . . . . . 734NULL(MOLD) . . . . . . . . . . . . 735NUM_PARTHDS() (IBM 拡張) . . . . . . . 736NUM_USRTHDS() (IBM 拡張) . . . . . . . 737

viii XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 11: IBM XL Fortran for Linux, V15.1

NUMBER_OF_PROCESSORS(DIM) (IBM 拡張) 738PACK(ARRAY, MASK, VECTOR) . . . . . 738POPCNT(I) (Fortran 2008) . . . . . . . . 739POPPAR(I) (Fortran 2008) . . . . . . . . 740PRECISION(X) . . . . . . . . . . . . 741PRESENT(A). . . . . . . . . . . . . 742PROCESSORS_SHAPE() (IBM 拡張) . . . . . 743PRODUCT(ARRAY, DIM, MASK) またはPRODUCT(ARRAY, MASK) . . . . . . . 743QCMPLX(X, Y) (IBM 拡張) . . . . . . . 745QEXT(A) (IBM 拡張) . . . . . . . . . . 746RADIX(X) . . . . . . . . . . . . . 746RAND() (IBM 拡張) . . . . . . . . . . 747RANDOM_NUMBER(HARVEST) . . . . . . 747RANDOM_SEED(SIZE, PUT, GET,GENERATOR) . . . . . . . . . . . . 748RANGE(X) . . . . . . . . . . . . . 749RANK(A) (TS 29113) . . . . . . . . . . 750REAL(A, KIND) . . . . . . . . . . . 751REPEAT(STRING, NCOPIES) . . . . . . . 752RESHAPE(SOURCE, SHAPE, PAD, ORDER) . . 753RRSPACING(X). . . . . . . . . . . . 754RSHIFT(I, SHIFT) (IBM 拡張) . . . . . . . 754SAME_TYPE_AS(A,B) (Fortran 2003) . . . . 755SCALE(X,I) . . . . . . . . . . . . . 756SCAN(STRING, SET, BACK, KIND) . . . . . 756SELECTED_CHAR_KIND(NAME) (Fortran 2003) 757SELECTED_INT_KIND(R) . . . . . . . . 758SELECTED_REAL_KIND(P, R, RADIX). . . . 759SET_EXPONENT(X,I) . . . . . . . . . . 760SHAPE(SOURCE, KIND). . . . . . . . . 761SHIFTA(I, SHIFT) (Fortran 2008) . . . . . . 762SHIFTL(I, SHIFT) (Fortran 2008) . . . . . . 763SHIFTR(I, SHIFT) (Fortran 2008) . . . . . . 763SIGN(A, B) . . . . . . . . . . . . . 764SIGNAL(I, PROC) (IBM 拡張) . . . . . . . 765SIN(X). . . . . . . . . . . . . . . 766SIND(X) (IBM 拡張) . . . . . . . . . . 767SINH(X) . . . . . . . . . . . . . . 767SIZE(ARRAY, DIM, KIND) . . . . . . . . 768SIZEOF(A) (IBM 拡張) . . . . . . . . . 770SPACING(X). . . . . . . . . . . . . 771SPREAD(SOURCE, DIM, NCOPIES) . . . . . 772SQRT(X) . . . . . . . . . . . . . . 773SRAND(SEED) (IBM 拡張) . . . . . . . . 774STORAGE_SIZE (A, KIND) (Fortran 2008) . . . 774SUM(ARRAY, DIM, MASK) またはSUM(ARRAY, MASK) . . . . . . . . . 775SYSTEM(CMD, RESULT) (IBM 拡張) . . . . 777SYSTEM_CLOCK(COUNT, COUNT_RATE,COUNT_MAX) . . . . . . . . . . . . 778TAN(X) . . . . . . . . . . . . . . 779TAND(X) (IBM 拡張). . . . . . . . . . 780TANH(X) . . . . . . . . . . . . . . 780TINY(X) . . . . . . . . . . . . . . 781TRAILZ(I) (Fortran 2008) . . . . . . . . 782

TRANSFER(SOURCE, MOLD, SIZE) . . . . . 782TRANSPOSE(MATRIX) . . . . . . . . . 783TRIM(STRING) . . . . . . . . . . . . 784UBOUND(ARRAY, DIM, KIND) . . . . . . 785UNPACK(VECTOR, MASK, FIELD) . . . . . 786VERIFY(STRING, SET, BACK, KIND) . . . . 787

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) . . . . . . 789暗号化のプロシージャー . . . . . . . . . . 789拡張暗号化標準のプロシージャー . . . . . . 789セキュア・ハッシュ・アルゴリズムのプロシージャー . . . . . . . . . . . . . . . 791その他のプロシージャー . . . . . . . . . 793

BPERMD(MASK, SOURCE). . . . . . . . . 796CMPB(X,Y) . . . . . . . . . . . . . . 797DIVDE(X,Y) . . . . . . . . . . . . . . 797DIVWE(X,Y). . . . . . . . . . . . . . 798FCFI(I) . . . . . . . . . . . . . . . 798FCFID(I) . . . . . . . . . . . . . . . 799FCFUD(I) . . . . . . . . . . . . . . . 799FCTID(X) . . . . . . . . . . . . . . . 800FCTIDZ(X) . . . . . . . . . . . . . . 801FCTIW(X) . . . . . . . . . . . . . . 801FCTIWZ(X) . . . . . . . . . . . . . . 802FCTUDZ(X) . . . . . . . . . . . . . . 802FCTUWZ(X) . . . . . . . . . . . . . . 803FMADD(A, X, Y) . . . . . . . . . . . . 803FMSUB(A, X, Y) . . . . . . . . . . . . 804FNABS(X) . . . . . . . . . . . . . . 804FNMADD(A, X, Y) . . . . . . . . . . . 805FNMSUB(A, X, Y) . . . . . . . . . . . 806FRE(X) . . . . . . . . . . . . . . . 806FRES(X) . . . . . . . . . . . . . . . 807FRIC(A) . . . . . . . . . . . . . . . 807FRIM(A) . . . . . . . . . . . . . . . 808FRIN(A) . . . . . . . . . . . . . . . 808FRIP(A) . . . . . . . . . . . . . . . 808FRIZ(A) . . . . . . . . . . . . . . . 809FRSQRTE(X) . . . . . . . . . . . . . 809FRSQRTES(X) . . . . . . . . . . . . . 810FSEL(X,Y,Z) . . . . . . . . . . . . . . 810LOAD2R(X) . . . . . . . . . . . . . . 811LOAD4R(X) . . . . . . . . . . . . . . 812LOAD8R(X) . . . . . . . . . . . . . . 812MTFSF(MASK, R) . . . . . . . . . . . . 813MTFSFI(BF, I) . . . . . . . . . . . . . 814MULHY(RA, RB) . . . . . . . . . . . . 814POPCNTB(I) . . . . . . . . . . . . . . 814REVERSE_BYTE_ORDER(X) . . . . . . . . 815ROTATELI(RS, IS, SHIFT, MASK) . . . . . . 816ROTATELM(RS, SHIFT, MASK) . . . . . . . 817SETFSB0(BT) . . . . . . . . . . . . . 817SETFSB1(BT) . . . . . . . . . . . . . 817SFTI(M, Y) . . . . . . . . . . . . . . 818SWDIV(X,Y) . . . . . . . . . . . . . . 818

目次 ix

Page 12: IBM XL Fortran for Linux, V15.1

SWDIV_NOCHK(X,Y). . . . . . . . . . . 819TRAP(A, B, TO) . . . . . . . . . . . . 820

第 16 章 TRANSACTIONAL_MEMORY組み込みモジュール (IBM 拡張) . . . . 821トランザクション開始/終了関数 . . . . . . . 822

TM_SIMPLE_BEGIN() . . . . . . . . . 822TM_BEGIN(TM_BUFF) . . . . . . . . . 823TM_END() . . . . . . . . . . . . . 823

トランザクション打ち切り関数 . . . . . . . 823TM_ABORT() . . . . . . . . . . . . 823TM_NAMED_ABORT(CODE) . . . . . . . 824

トランザクション照会関数 . . . . . . . . . 824TM_IS_USER_ABORT(TM_BUFF). . . . . . 824TM_IS_NAMED_USER_ABORT(TM_BUFF,CODE). . . . . . . . . . . . . . . 824TM_IS_ILLEGAL(TM_BUFF) . . . . . . . 825TM_IS_FOOTPRINT_EXCEEDED(TM_BUFF) . . 826TM_NESTING_DEPTH(TM_BUFF) . . . . . 826TM_IS_NESTED_TOO_DEEP(TM_BUFF) . . . 827TM_IS_CONFLICT(TM_BUFF) . . . . . . . 827TM_IS_FAILURE_PERSISTENT(TM_BUFF) . . 828TM_FAILURE_ADDRESS() . . . . . . . . 828TM_FAILURE_CODE(TM_BUFF) . . . . . . 828

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) . . . . . . . . . 831VEC_ABS(ARG1) . . . . . . . . . . . . 831VEC_ABSS(ARG1) . . . . . . . . . . . . 832VEC_ADD(ARG1, ARG2) . . . . . . . . . 832VEC_ADD_U128 (ARG1, ARG2) . . . . . . . 833VEC_ADDC_U128 (ARG1, ARG2) . . . . . . 833VEC_ADDE_U128 (ARG1, ARG2, ARG3) . . . . 834VEC_ADDEC_U128 (ARG1, ARG2, ARG3) . . . 834VEC_ADDC(ARG1, ARG2) . . . . . . . . . 835VEC_ADDS(ARG1, ARG2) . . . . . . . . . 836VEC_ALL_EQ(ARG1, ARG2) . . . . . . . . 836VEC_ALL_GE(ARG1, ARG2) . . . . . . . . 837VEC_ALL_GT(ARG1, ARG2) . . . . . . . . 837VEC_ALL_IN(ARG1, ARG2) . . . . . . . . 838VEC_ALL_LE(ARG1, ARG2) . . . . . . . . 838VEC_ALL_LT(ARG1, ARG2) . . . . . . . . 839VEC_ALL_NAN(ARG1) . . . . . . . . . . 839VEC_ALL_NE(ARG1, ARG2) . . . . . . . . 840VEC_ALL_NGE(ARG1, ARG2) . . . . . . . . 840VEC_ALL_NGT(ARG1, ARG2) . . . . . . . . 841VEC_ALL_NLE(ARG1, ARG2) . . . . . . . . 841VEC_ALL_NLT(ARG1, ARG2) . . . . . . . . 842VEC_ALL_NUMERIC(ARG1) . . . . . . . . 842VEC_AND(ARG1, ARG2) . . . . . . . . . 843VEC_ANDC(ARG1, ARG2) . . . . . . . . . 843VEC_ANY_EQ(ARG1, ARG2) . . . . . . . . 844VEC_ANY_GE(ARG1, ARG2) . . . . . . . . 844VEC_ANY_GT(ARG1, ARG2) . . . . . . . . 845VEC_ANY_LE(ARG1, ARG2) . . . . . . . . 845VEC_ANY_LT(ARG1, ARG2) . . . . . . . . 846

VEC_ANY_NAN(ARG1) . . . . . . . . . . 846VEC_ANY_NE(ARG1, ARG2) . . . . . . . . 847VEC_ANY_NGE(ARG1, ARG2) . . . . . . . 847VEC_ANY_NGT(ARG1, ARG2) . . . . . . . 848VEC_ANY_NLE(ARG1, ARG2). . . . . . . . 848VEC_ANY_NLT(ARG1, ARG2). . . . . . . . 849VEC_ANY_NUMERIC(ARG1) . . . . . . . . 849VEC_ANY_OUT(ARG1, ARG2) . . . . . . . 850VEC_AVG(ARG1, ARG2) . . . . . . . . . 850VEC_BPERM (ARG1, ARG2) . . . . . . . . 851VEC_CEIL(ARG1) . . . . . . . . . . . . 851VEC_CIPHER_BE(ARG1,ARG2) . . . . . . . 852VEC_CIPHERLAST_BE(ARG1,ARG2) . . . . . 853VEC_CMPB(ARG1, ARG2) . . . . . . . . . 853VEC_CMPEQ(ARG1, ARG2) . . . . . . . . 854VEC_CMPGE(ARG1, ARG2) . . . . . . . . 855VEC_CMPGT(ARG1, ARG2) . . . . . . . . 855VEC_CMPLE(ARG1, ARG2) . . . . . . . . 856VEC_CMPLT(ARG1, ARG2) . . . . . . . . 857VEC_CNTLZ(ARG1) . . . . . . . . . . . 858VEC_CONVERT(V, MOLD) . . . . . . . . . 858VEC_CPSGN(ARG1, ARG2). . . . . . . . . 859VEC_CTD(ARG1, ARG2) . . . . . . . . . 859VEC_CTF(ARG1, ARG2) . . . . . . . . . . 860VEC_CTS(ARG1, ARG2) . . . . . . . . . . 860VEC_CTSL(ARG1, ARG2) . . . . . . . . . 861VEC_CTU(ARG1, ARG2) . . . . . . . . . 861VEC_CTUL(ARG1, ARG2) . . . . . . . . . 862VEC_CVF(ARG1) . . . . . . . . . . . . 862VEC_DIV(ARG1, ARG2) . . . . . . . . . . 863VEC_DSS(ARG1) . . . . . . . . . . . . 864VEC_DSSALL . . . . . . . . . . . . . 864VEC_DST(ARG1, ARG2, ARG3) . . . . . . . 864VEC_DSTST(ARG1, ARG2, ARG3) . . . . . . 865VEC_DSTSTT(ARG1, ARG2, ARG3) . . . . . . 865VEC_DSTT(ARG1, ARG2, ARG3). . . . . . . 866VEC_EQV(ARG1, ARG2) . . . . . . . . . 867VEC_EXPTE(ARG1) . . . . . . . . . . . 867VEC_EXTRACT(ARG1, ARG2). . . . . . . . 868VEC_FLOOR(ARG1) . . . . . . . . . . . 868VEC_GBB(ARG1) . . . . . . . . . . . . 869VEC_INSERT(ARG1, ARG2, ARG3) . . . . . . 869VEC_LD(ARG1, ARG2) . . . . . . . . . . 870VEC_LDE(ARG1, ARG2). . . . . . . . . . 871VEC_LDL(ARG1, ARG2). . . . . . . . . . 871VEC_LOGE(ARG1) . . . . . . . . . . . 872VEC_LVSL(ARG1, ARG2) . . . . . . . . . 872VEC_LVSR(ARG1, ARG2) . . . . . . . . . 873VEC_MADD(ARG1, ARG2, ARG3) . . . . . . 874VEC_MADDS(ARG1, ARG2, ARG3) . . . . . . 874VEC_MAX(ARG1, ARG2) . . . . . . . . . 875VEC_MERGEE(ARG1,ARG2) . . . . . . . . 875VEC_MERGEH(ARG1, ARG2) . . . . . . . . 876VEC_MERGEL(ARG1, ARG2) . . . . . . . . 877VEC_MERGEO(ARG1,ARG2) . . . . . . . . 877VEC_MFVSCR . . . . . . . . . . . . . 878

x XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 13: IBM XL Fortran for Linux, V15.1

VEC_MIN(ARG1, ARG2). . . . . . . . . . 879VEC_MLADD(ARG1, ARG2, ARG3) . . . . . . 879VEC_MRADDS(ARG1, ARG2, ARG3) . . . . . 880VEC_MSUB(ARG1, ARG2, ARG3) . . . . . . 880VEC_MSUM(ARG1, ARG2, ARG3) . . . . . . 881VEC_MSUMS(ARG1, ARG2, ARG3) . . . . . . 882VEC_MTVSCR(ARG1) . . . . . . . . . . 883VEC_MUL(ARG1, ARG2) . . . . . . . . . 883VEC_MULE(ARG1, ARG2) . . . . . . . . . 884VEC_MULO(ARG1, ARG2) . . . . . . . . . 884VEC_NABS(ARG1) . . . . . . . . . . . 885VEC_NAND(ARG1, ARG2) . . . . . . . . . 886VEC_NCIPHER_BE(ARG1,ARG2) . . . . . . . 886VEC_NCIPHERLAST_BE(ARG1,ARG2) . . . . . 887VEC_NEARBYINT(ARG1) . . . . . . . . . 887VEC_NEG(ARG1) . . . . . . . . . . . . 888VEC_NMADD(ARG1, ARG2, ARG3) . . . . . . 888VEC_NMSUB(ARG1, ARG2, ARG3) . . . . . . 889VEC_NOR(ARG1, ARG2) . . . . . . . . . 890VEC_OR(ARG1, ARG2) . . . . . . . . . . 890VEC_ORC(ARG1, ARG2) . . . . . . . . . 891VEC_PACK(ARG1, ARG2) . . . . . . . . . 891VEC_PACKPX(ARG1, ARG2) . . . . . . . . 892VEC_PACKS(ARG1, ARG2). . . . . . . . . 892VEC_PACKSU(ARG1, ARG2) . . . . . . . . 893VEC_PERM(ARG1, ARG2, ARG3) . . . . . . 894VEC_PERMI(ARG1, ARG2, ARG3) . . . . . . 894VEC_PMSUM_BE(ARG1,ARG2) . . . . . . . 895VEC_POPCNT(ARG1) . . . . . . . . . . . 896VEC_PROMOTE(ARG1, ARG2) . . . . . . . 896VEC_RE(ARG1). . . . . . . . . . . . . 897VEC_RECIPDIV(ARG1,ARG2) . . . . . . . . 897VEC_REVB(ARG1) . . . . . . . . . . . 898VEC_REVE(ARG1). . . . . . . . . . . . 899VEC_RINT(ARG1) . . . . . . . . . . . . 900VEC_RL(ARG1, ARG2) . . . . . . . . . . 900VEC_ROUND(ARG1) . . . . . . . . . . . 901VEC_ROUNDC(ARG1) . . . . . . . . . . 901VEC_ROUNDM(ARG1) . . . . . . . . . . 901VEC_ROUNDP(ARG1) . . . . . . . . . . 902VEC_ROUNDZ(ARG1) . . . . . . . . . . 902VEC_RSQRT(ARG1) . . . . . . . . . . . 902VEC_RSQRTE(ARG1) . . . . . . . . . . . 903VEC_SBOX_BE(ARG1) . . . . . . . . . . 903VEC_SEL(ARG1, ARG2, ARG3) . . . . . . . 904VEC_SHASIGMA_BE(ARG1,ARG2,ARG3) . . . . 904VEC_SL(ARG1, ARG2) . . . . . . . . . . 905VEC_SLD(ARG1, ARG2, ARG3) . . . . . . . 906VEC_SLDW(ARG1, ARG2, ARG3) . . . . . . 906VEC_SLL(ARG1, ARG2) . . . . . . . . . . 907VEC_SLO(ARG1, ARG2). . . . . . . . . . 908VEC_SPLAT(ARG1, ARG2) . . . . . . . . . 908VEC_SPLATS(ARG1) . . . . . . . . . . . 909VEC_SPLAT_S8(ARG1) . . . . . . . . . . 909VEC_SPLAT_S16(ARG1) . . . . . . . . . . 910VEC_SPLAT_S32(ARG1) . . . . . . . . . . 910

VEC_SPLAT_U8(ARG1) . . . . . . . . . . 911VEC_SPLAT_U16(ARG1). . . . . . . . . . 911VEC_SPLAT_U32(ARG1). . . . . . . . . . 911VEC_SQRT(ARG1). . . . . . . . . . . . 912VEC_SR(ARG1, ARG2) . . . . . . . . . . 912VEC_SRA(ARG1, ARG2). . . . . . . . . . 913VEC_SRL(ARG1, ARG2) . . . . . . . . . . 913VEC_SRO(ARG1, ARG2). . . . . . . . . . 914VEC_ST(ARG1, ARG2, ARG3). . . . . . . . 915VEC_STE(ARG1, ARG2, ARG3) . . . . . . . 916VEC_STL(ARG1,ARG2,ARG3) . . . . . . . . 916VEC_SUB(ARG1, ARG2). . . . . . . . . . 918VEC_SUB_U128 (ARG1, ARG2) . . . . . . . 918VEC_SUBC_U128 (ARG1, ARG2) . . . . . . . 919VEC_SUBE_U128 (ARG1, ARG2, ARG3) . . . . 919VEC_SUBEC_U128 (ARG1, ARG2, ARG3) . . . . 920VEC_SUBC(ARG1, ARG2) . . . . . . . . . 921VEC_SUBS(ARG1, ARG2) . . . . . . . . . 921VEC_SUM2S(ARG1, ARG2). . . . . . . . . 922VEC_SUM4S(ARG1, ARG2). . . . . . . . . 922VEC_SUMS(ARG1, ARG2) . . . . . . . . . 923VEC_TRUNC(ARG1) . . . . . . . . . . . 924VEC_UNPACKH(ARG1) . . . . . . . . . . 924VEC_UNPACKL(ARG1) . . . . . . . . . . 925VEC_VCLZ(ARG1) . . . . . . . . . . . 926VEC_VGBBD(ARG1) . . . . . . . . . . . 926VEC_XL(ARG1, ARG2) . . . . . . . . . . 927VEC_XL_BE(ARG1、ARG2) . . . . . . . . 928VEC_XLD2(ARG1, ARG2) . . . . . . . . . 930VEC_XLDS(ARG1, ARG2) . . . . . . . . . 930VEC_XLW4(ARG1, ARG2) . . . . . . . . . 931VEC_XOR(ARG1, ARG2) . . . . . . . . . 932VEC_XST(ARG1、ARG2、ARG3) . . . . . . . 933VEC_XST_BE(ARG1、ARG2、ARG3) . . . . . 933VEC_XSTD2(ARG1, ARG2, ARG3) . . . . . . 934VEC_XSTW4(ARG1, ARG2, ARG3) . . . . . . 935

第 18 章 言語の相互運用性機能 . . . . 937型の相互運用性 . . . . . . . . . . . . . 937組み込み型 . . . . . . . . . . . . . 937派生型 . . . . . . . . . . . . . . . 937

変数の相互運用性 . . . . . . . . . . . . 938非同期通信の相互運用可能変数 (TS 29113) . . 938

共通ブロックの相互運用性 . . . . . . . . . 940プロシージャーの相互運用性 . . . . . . . . 940オプションの引数の相互運用性 (TS 29113) . . 941割り振り可能引数およびポインター引数の相互運用性 (TS 29113) . . . . . . . . . . . 942想定長引数の相互運用性 (TS 29113). . . . . 946想定型引数の相互運用性 (TS 29113). . . . . 948想定ランク引数の相互運用性 (TS 29113) . . . 949

ISO_C_BINDING モジュール . . . . . . . . 952kind 型パラメーターとして使用するための定数 952文字定数 . . . . . . . . . . . . . . 954その他の定数 . . . . . . . . . . . . 954型 . . . . . . . . . . . . . . . . 954

目次 xi

Page 14: IBM XL Fortran for Linux, V15.1

プロシージャー . . . . . . . . . . . . 954ISO_Fortran_binding.h ヘッダー・ファイル (TS29113) . . . . . . . . . . . . . . . . 958型定義と構造体 . . . . . . . . . . . . 959マクロ . . . . . . . . . . . . . . . 961関数 . . . . . . . . . . . . . . . 962

バインディング・ラベル . . . . . . . . . . 973

第 19 章 ISO_FORTRAN_ENV 組み込みモジュール . . . . . . . . . . . . 975ISO_FORTRAN_ENV 定数 . . . . . . . . . 975

CHARACTER_KINDS (Fortran 2008) . . . . . 975CHARACTER_STORAGE_SIZE . . . . . . 975ERROR_UNIT . . . . . . . . . . . . 975FILE_STORAGE_SIZE . . . . . . . . . 976INT8 (Fortran 2008) . . . . . . . . . . 976INT16 (Fortran 2008) . . . . . . . . . . 976INT32 (Fortran 2008) . . . . . . . . . . 976INT64 (Fortran 2008) . . . . . . . . . . 977INTEGER_KINDS (Fortran 2008) . . . . . . 977INPUT_UNIT . . . . . . . . . . . . 977IOSTAT_END . . . . . . . . . . . . 977IOSTAT_EOR . . . . . . . . . . . . 978IOSTAT_INQUIRE_INTERNAL_UNIT (Fortran2008) . . . . . . . . . . . . . . . 978LOGICAL_KINDS (Fortran 2008) . . . . . . 979NUMERIC_STORAGE_SIZE. . . . . . . . 979OUTPUT_UNIT . . . . . . . . . . . . 979REAL32 (Fortran 2008) . . . . . . . . . 980REAL64 (Fortran 2008) . . . . . . . . . 980REAL128 (Fortran 2008) . . . . . . . . . 980REAL_KINDS (Fortran 2008) . . . . . . . 980

ISO_FORTRAN_ENV 関数 . . . . . . . . . 981COMPILER_OPTIONS (Fortran 2008). . . . . 981COMPILER_VERSION (Fortran 2008) . . . . 981

第 20 章 浮動小数点の制御および照会のプロシージャー . . . . . . . . . . 983fpgets fpsets . . . . . . . . . . . . . . 983効率的な浮動小数点の制御および照会のプロシージャー . . . . . . . . . . . . . . . . 984

xlf_fp_util 浮動小数点プロシージャー . . . . 986IEEE モジュールとサポート (Fortran 2003) . . . 989コンパイルと例外処理 . . . . . . . . . 990IEEE モジュールのインプリメントに関する一般規則 . . . . . . . . . . . . . . . 990IEEE 派生データ型および定数 . . . . . . . 991IEEE 演算子 . . . . . . . . . . . . . 993IEEE プロシージャー . . . . . . . . . . 993浮動小数点状況に関する規則 . . . . . . . 1018例 . . . . . . . . . . . . . . . . 1019

第 21 章 サービス・ユーティリティー・プロシージャー (IBM 拡張) . . . 1023一般的なサービスおよびユーティリティー・プロシージャー . . . . . . . . . . . . . . 1023サービスおよびユーティリティー・プロシージャーのリスト . . . . . . . . . . . . . . 1024

alarm_(time, func) . . . . . . . . . . . 1025bic_(X1, X2) . . . . . . . . . . . . 1025bis_(X1, X2) . . . . . . . . . . . . 1026bit_(X1, X2) . . . . . . . . . . . . 1026clock_() . . . . . . . . . . . . . . 1026ctime_(STR, TIME) . . . . . . . . . . 1027date() . . . . . . . . . . . . . . . 1027dtime_(dtime_struct) . . . . . . . . . . 1027etime_(etime_struct) . . . . . . . . . . 1028exit_(exit_status) . . . . . . . . . . . 1029fdate_(str) . . . . . . . . . . . . . 1029fiosetup_(unit, command, argument) . . . . . 1029flush_(lunit) . . . . . . . . . . . . . 1030ftell_(lunit) . . . . . . . . . . . . . 1031ftell64_(lunit) . . . . . . . . . . . . 1031getarg(i1,c1) . . . . . . . . . . . . . 1032getcwd_(name) . . . . . . . . . . . . 1032getfd(lunit) . . . . . . . . . . . . . 1033getgid_() . . . . . . . . . . . . . . 1033getlog_(name) . . . . . . . . . . . . 1034getpid_() . . . . . . . . . . . . . . 1034getuid_() . . . . . . . . . . . . . . 1034global_timef() . . . . . . . . . . . . 1035gmtime_(stime, tarray) . . . . . . . . . 1035hostnm_(name) . . . . . . . . . . . . 1036iargc() . . . . . . . . . . . . . . 1036idate_(idate_struct) . . . . . . . . . . . 1036ierrno_() . . . . . . . . . . . . . . 1037irand() . . . . . . . . . . . . . . 1037irtc() . . . . . . . . . . . . . . . 1038itime_(itime_struct) . . . . . . . . . . 1038jdate() . . . . . . . . . . . . . . 1038lenchr_(str) . . . . . . . . . . . . . 1039lnblnk_(str) . . . . . . . . . . . . . 1039ltime_(stime, tarray) . . . . . . . . . . 1040mclock() . . . . . . . . . . . . . . 1040qsort_(array, len, isize, compar) . . . . . . 1040qsort_down(array, len, isize) . . . . . . . 1041qsort_up(array, len, isize) . . . . . . . . 1042rtc() . . . . . . . . . . . . . . . 1042setrteopts(c1) . . . . . . . . . . . . 1043sleep_(sec) . . . . . . . . . . . . . 1043time_() . . . . . . . . . . . . . . 1043timef() . . . . . . . . . . . . . . 1044timef_delta(t) . . . . . . . . . . . . 1044umask_(cmask) . . . . . . . . . . . . 1045usleep_(msec) . . . . . . . . . . . . 1045xl__trbk() . . . . . . . . . . . . . 1045

XLF_POSIX_BINDINGS モジュール . . . . . 1046型 . . . . . . . . . . . . . . . . 1046

xii XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 15: IBM XL Fortran for Linux, V15.1

名前付き定数 . . . . . . . . . . . . 1046抽象インターフェース . . . . . . . . . 1051プロシージャー . . . . . . . . . . . 1052

第 22 章 ソース互換性の拡張 (IBM 拡張) . . . . . . . . . . . . . . . 1103レコード構造 . . . . . . . . . . . . . 1103レコード構造の宣言 . . . . . . . . . . 1104ストレージ・マッピング . . . . . . . . 1107

共用体およびマップ (IBM 拡張). . . . . . . 1107

付録. . . . . . . . . . . . . . . 1113標準間の互換性 . . . . . . . . . . . . 1113

Fortran 90 の互換性 . . . . . . . . . . 1114

古くなったフィーチャー . . . . . . . . 1115削除されたフィーチャー . . . . . . . . 1117

ASCII 文字セットと EBCDIC 文字セット . . . 1117

特記事項 . . . . . . . . . . . . . 1125商標 . . . . . . . . . . . . . . . . 1127

用語集 . . . . . . . . . . . . . . 1129

索引 . . . . . . . . . . . . . . . 1151

目次 xiii

Page 16: IBM XL Fortran for Linux, V15.1

xiv XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 17: IBM XL Fortran for Linux, V15.1

本書について

本書は、XL Fortran 資料セットに含まれる資料の 1 つで、Fortran プログラミング言語の構文、セマンティクス、および Linux オペレーティング・システムに対するIBM インプリメンテーションについて説明します。XL Fortran 実装は TS 29113

(部分サポート)、Fortran 2008 (部分サポート)、Fortran 2003 (フル・サポート)、および Fortran プログラミング言語の ISO 標準によって維持されるその他の仕様に準拠していますが、これらは数多くの拡張機能もコア言語に組み込みます。これらの拡張機能は、特定の稼働環境でのユーザビリティーを強化し、他のコンパイラーとの互換性を保証し、新しいハードウェア機能をサポートするために実装されています。

本書の対象読者本書は、Fortran によるプログラミングの経験があるユーザー向けの参考資料です。Fortran の初心者であるユーザーでも、XL Fortran に固有の言語および機能に関する情報を見つけるために本書を利用できます。ただし本書は、プログラミング概念を教えたり、特定のプログラミング慣例を奨励したりすることを目的としていません。

本書の使用法本書では、XL Fortran の標準フィーチャーと実装に固有のフィーチャーの両方を扱いますが、以下のトピックは含まれません。それらについては、別の資料に説明があります。

v インストール、システム要件、最新の更新。 「XL Fortran インストール・ガイド」および製品の README ファイルを参照してください。

v XL Fortran フィーチャーの概要。 「Getting Started with XL Fortran」を参照してください。

v コンパイラーのセットアップ、プログラムのコンパイルと実行、コンパイラー・オプション、診断機能。これらについては、「XL Fortran コンパイラー・リファレンス」を参照してください。

v 最適化、ポーティング、OpenMP/SMP プログラミング。これらについては、「XL

Fortran 最適化およびプログラミング・ガイド」を参照してください。

v コンパイラーの使用に関するオペレーティング・システムのコマンド。Linux 固有の配布マニュアル・ページのヘルプとドキュメントを参照してください。

本書の構成以下に示すのは、各セクションに分けたグループ情報で、これらのセクションによって、特定の言語トピックおよびインプリメンテーションについての詳細を説明します。

v XL Fortran の言語エレメント:

– XL Fortran for Linux

© Copyright IBM Corp. 1996, 2015 xv

Page 18: IBM XL Fortran for Linux, V15.1

– XL Fortran 言語の基本要素

– 組み込みデータ型

– 派生型

– 配列の概念

– 式および代入

– 実行制御

– プログラム単位およびプロシージャー

– XL Fortran の入出力

– 入出力の形式設定

– ステートメントおよび属性

– ディレクティブ (IBM 拡張)

– 組み込みプロシージャー

– TRANSACTIONAL_MEMORY 組み込みモジュール (IBM 拡張)

– ベクトルの組み込みプロシージャー (IBM 拡張)

– 言語の相互運用性機能 (Fortran 2003)

– ISO_FORTRAN_ENV 組み込みモジュール

– ソース互換性の拡張 (IBM 拡張)

v ハードウェア関連機能を提供するプロシージャー、およびすでに Fortran 言語に習熟したユーザー向けの追加フィーチャー:

– 浮動小数点制御および照会プロシージャー

– ハードウェア固有のディレクティブ

– ハードウェア固有の組み込みプロシージャー (IBM 拡張)

– サービス・ユーティリティー・プロシージャー (IBM 拡張)

v 付録には、旧バージョンの Fortran のユーザー向けの標準間の互換性に関する情報と、「ASCII 文字セットと EBCDIC 文字セット」マッピング・テーブルに関する情報があります。

規則活字の規則

xvi XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 19: IBM XL Fortran for Linux, V15.1

以下の表では、IBM® XL Fortran for Linux, V15.1.3 の資料で使用されている活字の規則について説明します。

表 1. 活字の規則

書体 意味 例

小文字の太字 呼び出しコマンド、実行可能ファイル名、およびコンパイラー・オプション。

コンパイラーには、さまざまなFortran 言語レベルおよびコンパイル環境をサポートするために、xlf という基本呼び出しコマンドとその他のいくつかのコンパイラー呼び出しコマンドが備わっています。

実行可能プログラムのデフォルトのファイル名は、a.out です。

イタリック パラメーターまたは変数。実際の名前と値はユーザーによって提供されます。イタリックは新規用語の導入にも使用されます。

要求された size よりも大きいものを戻す場合には、 size パラメーターの更新を確認してください。

下線 コンパイラー・オプションまたはディレクティブのパラメーターのデフォルト設定。

nomaf | maf

モノスペース プログラム・コードの例、プログラム・コードの解説、ファイル名、パス名、コマンド・ストリング、またはユーザー定義の名前。

myprogram.f をコンパイルおよび最適化するには、xlf myprogram.f -O3 と入力します。

大文字の太字 Fortran プログラミング・キーワード、ステートメント、ディレクティブ、および組み込みプロシージャー。コンパイラー・オプション/

サブオプションを呼び出すために必要な最小文字数を示すためにも大文字が使用される可能性があります。

ASSERT ディレクティブは、ディレクティブの直後に続く DO ループにのみ適用され、ネストされた DO ループには適用されません。

限定を示すエレメント (アイコンおよび大括弧分離文字)

言語エレメントの説明では、この情報は、以下のように、アイコンおよびマーク付きの大括弧分離文字を使用して Fortran 言語標準テキストを示しています。

表 2. 限定を示すエレメント

アイコン大括弧分離文字のテキスト 意味

F2008

F2008

Fortran 2008 の始まり/Fortran

2008 の終わり

テキストは、Fortran 2008 標準を実装した IBM XL

Fortran について説明します。

Fortran 2003 の始まり/Fortran

2003 の終わり

テキストは、Fortran 2003 標準を実装した IBM XL

Fortran について説明します (Fortran 2003 以降のすべての標準に適用されます)。

本書について xvii

Page 20: IBM XL Fortran for Linux, V15.1

表 2. 限定を示すエレメント (続き)

アイコン大括弧分離文字のテキスト 意味

IBM 拡張の始まり / IBM 拡張の終わり

このテキストは、標準の言語仕様に対する IBM XL

Fortran 拡張機能を説明しています。

TS 29113

TS 29113

TS 29113 の始まり/TS 29113

の終わり

このテキストは、技術仕様 29113 (TS 29113 と呼ばれる)

を実装した IBM XL Fortran について記述しています。

注: 情報に Fortran 言語標準のアイコンまたは大括弧分離文字が付いている場合は、この特定の Fortran 言語標準および以降のすべての標準に適用されます。情報にマークが付いていない場合は、すべての Fortran 言語標準に適用されます。

構文図

本書中では、ダイアグラムは XL Fortran 構文を図示します。このセクションは、そのダイアグラムを解釈したり使用したりするときに役立ちます。

v 構文図は線のパスに沿って、左から右、上から下へと読んでいきます。

��─── 記号は、コマンド、ディレクティブ、またはステートメントの開始を示します。

───� 記号は、コマンド、ディレクティブ、またはステートメント構文が次の行に続いていることを示します。

�─── 記号は、コマンド、ディレクティブ、またはステートメントが前の行から続いていることを示します。

───�� 記号は、コマンド、ディレクティブ、またはステートメントの終了を示します。

完結したコマンド、ディレクティブ、またはステートメント以外の構文単位の図であるフラグメントは、│─── 記号で始まり ───│ 記号で終わります。

IBM XL Fortran 拡張機能は、構文図の中で番号が付けられ、図のすぐ下に注記されています。

プログラム単位、プロシージャー、構文、インターフェース・ブロックおよび派生型の定義は複数の個別のステートメントで構成されます。これらの項目については、構文表記をボックスで囲み、個々の構文図は、対応する Fortran ステートメントに必要な順序で表示されます。

v 必須項目は、次のように横線 (メインパス) 上に表示されます。

�� keyword required_argument ��

v オプショナル項目は、次のようにメインパスの下側に表示されます。

xviii XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 21: IBM XL Fortran for Linux, V15.1

�� keywordoptional_argument

��

注: オプショナル項目 (構文図にはない) は角括弧 ([ および ]) で囲まれます。例えば、[UNIT=]u

v 2 つ以上の項目から選択できる場合は、縦に重ねて表示されます。

項目の中から 1 つを選択しなければならない 場合は、スタックの 1 つの項目がメインパスに表示されます。

�� keyword required_argument1required_argument2

��

項目の 1 つを選択することがオプショナルの場合は、スタック全体がメインパスの下に表示されます。

�� keywordoptional_argument1optional_argument2

��

v 主線の上にある左に戻る矢印 (反復矢印) は、スタックされた項目から複数個選択できること、あるいは単一の項目を繰り返すことができることを示します。区切り文字も示されます (それがブランク以外の場合)。

�� �

,

keyword repeatable_argument ��

v デフォルトの項目はメインパスの上に表示されます。

�� keyworddefault_argumentalternate_argument ��

v キーワードは、イタリックでない文字で示され、示されているとおりに入力する必要があります。

v 変数は、イタリック体の小文字で示されます。変数は、ユーザー指定の名前や値を表します。変数またはユーザー指定名が _list で終わっている場合、コンマで区切られたこれらの項目のリストを指定できます。

v 句読記号、括弧、算術演算子、または他のそのような記号が表示されている場合は、構文の一部として入力する必要があります。

サンプル構文図

次に示すのは解釈付きの構文図の例です。

本書について xix

Page 22: IBM XL Fortran for Linux, V15.1

構文ステートメントの読み方

構文ステートメントは左から右に読みます。

v 個々の必須引数は、特殊表記を付けずに記述されます。

v { } 記号で囲まれた選択項目からは、1 つを選択する必要があります。

v オプションの引数は、[ ] 記号で囲まれています。

v 選択項目のグループから選択できる場合は、それらの選択項目は | 文字で区切られます。

v 繰り返せる引数の後には、省略符号 (...) が続きます。

構文記述の例EXAMPLE char_constant {a|b}[c|d]e[,e]... name_list{name_list}...

次のリストは、構文ステートメントを説明しています。

v キーワード EXAMPLE を入力します。

v char_constant に値を入力します。

v a または b のいずれかの値を入力します。両方は入力しないでください。

v オプションとして、c または d のいずれかの値を入力します。

v e に少なくとも 1 つの値を入力します。複数の値を入力する場合は、それぞれの値の間にコンマが必要です。

v オプションで、name_list に name の値を少なくとも 1 つ入力します。複数の値を入力する場合は、それぞれの name の間にコンマが必要です。

注: 同じ例が構文ステートメントと構文図の両方で使用されています。

��(1)

EXAMPLE char_constant ab c

d

,

e name_list ��

注:

1 IBM 拡張

この図表は次のように解釈します。

v キーワード EXAMPLE を入力します。

v EXAMPLE は IBM 拡張です。

v char_constant に値を入力します。

v a または b のいずれかの値を入力します。両方は入力しないでください。

v オプションとして、c または d のいずれかの値を入力します。

v e に少なくとも 1 つの値を入力します。複数の値を入力する場合は、それぞれの値の間にコンマが必要です。

v name_list に name の値を少なくとも 1 つ入力します。複数の値を入力する場合は、それぞれの間にコンマが必要です。 (_list 構文は、e に対する以前の構文と同等です。

xx XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 23: IBM XL Fortran for Linux, V15.1

本書の例

本書の例は、特に断りのない限り、単純な形式でコーディングされており、ストレージの節約、エラーのチェック、高速パフォーマンスの実現、特定の成果を達成するために使用可能なすべての方法の提示などの試みはなされていません。

インストール情報の例は、例 または基本例 としてラベル付けられています。基本例 は、基本インストールまたはデフォルト・インストール時に実行する手順の説明用です。例はほとんど変更せずに、または全く変更せずに使用できます。

使用されている用語についての注記

本書の用語の中には、次のように、短縮されているものがあります。

v 用語 フリー・ソース・フォーム形式 は多くの場合、フリー・ソース・フォームと表記しています。

v 用語 固定ソース・フォーム形式 は多くの場合、固定ソース・フォーム と表記しています。

v 用語 XL Fortran は多くの場合、XLF と表記しています。

関連情報以下のセクションでは、XL Fortran に関連した情報を説明します。

IBM XL Fortran 情報XL Fortran は、以下の形式で製品資料を提供しています。

v クイック・スタート・ガイド

クイック・スタート・ガイド (quickstart.pdf) は、IBM XL Fortran for Linux,

V15.1.3 を即時に使用し始めるときに読むものです。これは、デフォルトでは、XL Fortran ディレクトリーに入っています。また、インストール DVD の¥quickstart ディレクトリーにもあります。

v README ファイル

README ファイルには、製品情報に対する変更と訂正も含め、最新の情報が含まれています。 README ファイルは、デフォルトでは XL Fortran ディレクトリー、およびインストール DVDルート・ディレクトリーとサブディレクトリーにあります。

v インストール可能な man ページ

man ページは製品に準備されているコンパイラー呼び出しとすべてのコマンド行ユーティリティーに対して提供されています。 man ページのインストールおよびアクセスについての指示は、「IBM XL Fortran for Linux, V15.1.3 インストール・ガイド」に記載されています。

v オンライン製品資料

完全に検索可能な HTML ベースの資料が IBM Knowledge Center

(http://www.ibm.com/support/knowledgecenter/SSAT4T_15.1.3/

com.ibm.compilers.linux.doc/welcome.html) で参照可能です。

本書について xxi

Page 24: IBM XL Fortran for Linux, V15.1

v PDF 文書

PDF 文書は、Web サイト http://www.ibm.com/support/

docview.wss?uid=swg27036672 でも入手できます。

以下のファイルは、XL Fortran 製品情報のフル・セットを構成しています。

表 3. XL Fortran PDF ファイル

文書タイトルPDF ファイル名 説明

IBM XL Fortran for Linux,

V15.1.3 インストール・ガイド (GC43-2642-02)

install.pdf XL Fortran のインストール方法と基本的なコンパイルおよびプログラム実行のための環境の構成方法に関する情報が含まれています。

IBM XL Fortran for Linux,

V15.1.3 はじめに(SC43-2640-02)

getstart.pdf XL Fortran 製品の概要のほか、ご使用の環境のセットアップと構成、プログラムのコンパイルとリンク、およびコンパイル・エラーのトラブルシューティングに関する情報が記載されています。

IBM XL Fortran for Linux,

V15.1.3 コンパイラー・リファレンス (SC43-2643-02)

compiler.pdf さまざまなコンパイラー・オプションおよび環境変数についての情報が含まれます。

IBM XL Fortran for Linux,

V15.1.3 ランゲージ・リファレンス (SC43-2644-02)

langref.pdf 移植性および非機密標準への準拠に対応した言語拡張機能、コンパイラー・ディレクティブ、および組み込みプロシージャーなどの、IBM がサポートする Fortran プログラミング言語についての情報が含まれます。

IBM XL Fortran for Linux,

V15.1.3 最適化およびプログラミング・ガイド(SC43-2645-02)

proguide.pdf アプリケーションの移植、言語間呼び出し、浮動小数点演算、入出力、アプリケーションの最適化と並列処理、XL Fortran 高性能ライブラリーなど、高度なプログラミングのトピックに関する情報が記載されています。

PDF ファイルを読むには、Adobe Reader を使用します。Adobe Reader を持っていない場合は、Adobe の Web サイト (http://www.adobe.com) からダウンロードできます (ライセンス条項に従う必要があります)。

IBM Redbooks® 資料、ホワイト・ペーパー、他の記事など、XL Fortran に関する詳細は、Web (http://www.ibm.com/support/docview.wss?uid=swg27036672) から入手できます。

Fortran について詳しくは、Fortran café (https://www.ibm.com/developerworks/

mydeveloperworks/groups/service/html/communityview?communityUuid=b10932b4-0edd-

4e61-89f2-6e478ccba9aa) を参照してください。

標準および仕様XL Fortran は、以下の標準および仕様をサポートするように設計されています。本書に記載されているいくつかのフィーチャーの正確な定義については、以下の標準および仕様を参照してください。

v American National Standard Programming Language FORTRAN, ANSI X3.9-1978。

v American National Standard Programming Language Fortran 90, ANSI

X3.198-1992。

xxii XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 25: IBM XL Fortran for Linux, V15.1

v ANSI/IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Std

754-1985。

v Federal (USA) Information Processing Standards Publication Fortran, FIPS PUB

69-1。

v Information technology - Programming languages - Fortran, ISO/IEC 1539-1:1991。(この情報では、非公式な名前である Fortran 90 を使用しています。)

v Information technology - Programming languages - Fortran - Part 1: Base

language, ISO/IEC 1539-1:1997。 (この情報では、非公式な名前である Fortran 95

を使用しています。)

v Information technology - Programming languages - Fortran - Part 1: Base

language, ISO/IEC 1539-1:2004。 (この情報では、非公式な名前である Fortran

2003 を使用しています。)

v Information technology - Programming languages - Fortran - Part 1: Base

language, ISO/IEC 1539-1:2010。 (この情報では、非公式な名前である Fortran

2008 を使用しています。現在、この標準に対して部分サポートを提供しています。)

v Information technology - Further interoperability of Fortran with C, ISO/IEC TS

29113:2012。 (本書では、この資料の非公式な名前である「技術仕様 29113」(別名: TS 29113) が使用されています。現時点では、この仕様には部分サポートが提供されています。)

v Military Standard Fortran DOD Supplement to ANSI X3.9-1978, MIL-STD-1753 (米国、国防総省標準)。XL Fortran は、Fortran 90 標準に順次取り込まれてもいるこの標準において文書化されている拡張のみをサポートしていることに注意してください。

v OpenMP Application Program Interface Version 3.1 (フルサポート)、OpenMP

Application Program Interface Version 4.0 (部分サポート)、および OpenMP

Application Program Interface Version 4.5 (部分サポート)。 http://www.openmp.org

で入手可能。

その他の IBM 情報v ESSL 製品資料 は、http://www.ibm.com/support/knowledgecenter/SSFHY8/

essl_welcome.html?lang=en で入手できます。

技術サポート追加の技術サポートは、XL Fortran のサポート・ページ (http://www.ibm.com/

support/entry/portal/product/rational/xl_fortran_for_linux) から利用できます。このページは、選択された大規模な技術情報および他のサポート情報に対する検索機能を備えたポータルを提供します。

必要な情報が見つからない場合は、[email protected] に E メールでお問い合わせください。

XL Fortran に関する最新情報については、製品情報サイト (http://www.ibm.com/

software/products/en/xlfortran-linux) を参照してください。

本書について xxiii

Page 26: IBM XL Fortran for Linux, V15.1

xxiv XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 27: IBM XL Fortran for Linux, V15.1

第 1 章 XL Fortran for Linux

「XL Fortran ランゲージ・リファレンス」は、XL Fortran コンパイラーを Linux

にインストールし、使用するための情報を提供する一連の資料の 1 つです。本書では、有効な XL Fortran プログラムを作成する場合に従わなければならない構文、セマンティクス、および制約事項について説明します。

Fortran (FORmula TRANslation) は、主として、数値計算が関係する工学、数学、および科学分野のアプリケーションに適した高水準プログラミング言語です。

XL Fortran は、技術仕様 29113 の一部、Fortran 2008 の一部、Fortran 2003 のすべて、および Fortran プログラミング言語に関する ISO 標準によって維持されるその他の言語仕様を実装します。 XL Fortran では、コア言語に多くの拡張機能が組み込まれてもいます。これらの拡張機能は、特定のオペレーティング環境における使用可能度を高め、その他のコンパイラーとの互換性を確保し、新しいハードウェア機能をサポートする目的でインプリメントされています。標準に準拠したコンパイラーで正しくコンパイルされるプログラムは、ハードウェアによる相違はあるものの、他のすべての準拠コンパイラーの下でも正しくコンパイルされ、実行されます。

XL Fortran 言語規則 に対する非準拠のほとんどは、コンパイラーによって検出されます。構文とセマンティクスのすべての組み合わせについての非準拠を、コンパイラーによって検出することはできません。診断によってパフォーマンスが劣化することが考えられるためです。診断されないこのような非準拠を含む XL Fortran プログラムは、そのプログラムが予期したとおりに実行されるとしても、無効なプログラムです。

Fortran 言語標準

技術仕様 29113Fortran 2008 に対する重要な補足が ISO Technical Specification on Further

Interoperability of Fortran with C であり、これは技術仕様 29113 または TS 29113

と呼ばれます。 XL Fortran コンパイラーでは、TS 29113 における以下のフィーチャーのサブセットがサポートされています。

v 946ページの『想定長引数の相互運用性 (TS 29113)』

v 949ページの『想定ランク引数の相互運用性 (TS 29113)』

v 948ページの『想定型引数の相互運用性 (TS 29113)』

v 942ページの『割り振り可能引数およびポインター引数の相互運用性 (TS

29113)』

v 941ページの『オプションの引数の相互運用性 (TS 29113)』

v 938ページの『非同期通信の相互運用可能変数 (TS 29113)』

v 958ページの『ISO_Fortran_binding.h ヘッダー・ファイル (TS 29113)』

© Copyright IBM Corp. 1996, 2015 1

Page 28: IBM XL Fortran for Linux, V15.1

Fortran 2008本書の一部には、Fortran 2008 標準に基づく情報が記載されています。この標準は、継続的に解釈、変更、および改訂することができるようになっています。 IBM

では、今後のこの標準の解釈に合うように本製品の機能の動作を変更する権利を保持しています。

Fortran のさまざまな部分の解釈に関する質問に、Fortran 標準化委員会が回答しています。そのような質問の中には、XL Fortran コンパイラーで実装された言語機能に関するものがある場合があります。これらの言語機能に関連して委員会から提出された回答によっては、XL Fortran コンパイラーの将来のリリースに変更が生じる場合があります。これらの変更の結果として、以前の製品リリースとの互換性が失われる可能性があります。

Fortran 2008 のいくつかの機能を以下に示します。

モジュール機能強化

v サブモジュールは、モジュールのための追加の構造化機能を提供します。

v モジュール・プロシージャー・インターフェース本体を宣言するか、別個のモジュール・プロシージャーを定義するには、 419ページの『FUNCTION』 ステートメントまたは 517ページの『SUBROUTINE』 ステートメントに MODULE 接頭部指定子を指定します。

パフォーマンスの向上

v DO CONCURRENT 構文は、個々のループ反復に相互依存性がないことをプログラムで指定するための手段を提供します。

v CONTIGUOUS 属性は、ポインター・ターゲットおよび想定形状仮引数のストレージ・レイアウトに関する制約事項をプログラムで指定するための手段を提供します。

データ宣言

v 名前付き定数配列の形状は、その値によって暗黙指定できます。詳しくは、『暗黙形状配列』を参照してください。

v 411ページの『FORALL』インデックス変数は、構文内で明示的に宣言された型および kind を持つことができます。

v 派生型に加えて、TYPE 型指定子が、組み込み型のエンティティーを宣言するように拡張されました。

v 複数の型境界プロシージャーを 1 つの型境界プロシージャー・ステートメントで宣言できます。

データの使用および計算

v SOURCE= 指定子または MOLD= 指定子を含む ALLOCATE ステートメントを使用して、複数の allocate_object を割り振ることができます。

v MOLD= 指定子が 319ページの『ALLOCATE』ステートメントに追加されました。また、SOURCE= または MOLD= 指定子で source_expr を指定した場合は、ALLOCATE ステートメントの境界を省略できます。

v 複素数部指定子を使用して、複素数エンティティーの実数部および虚数部に別個にアクセスできます。

2 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 29: IBM XL Fortran for Linux, V15.1

v 組み込み代入を使用して、変数をポリモアフィックにできるようになりました。

入出力

v OPEN ステートメント内の NEWUNIT= は、プログラムで選択された他の装置番号の妨げにならない装置番号を自動的に選択します。

実行制御

v BLOCK 構文には、構文有効範囲を持つオブジェクトの宣言を入れることができます。

v EXIT ステートメントは、より多くの名前付き実行可能構文内から制御権移動を行うことができます。

v STOP ステートメントで、停止コードとして整数または文字の定数式を使用できるようになりました。 STOP ステートメントはプログラムの正常終了を開始しますが、ERROR STOP ステートメントはプログラムのエラー終了を開始します。

組み込みプロシージャー

v 組み込み関数 ACOS、ASIN、ATAN、COSH、SINH、TAN、および TANH では、複素数型の引数を使用できます。

v 新しい組み込み関数 ACOSH、ASINH、および ATANH は、逆双曲線 cosine、sine、および tangent をそれぞれ計算します。

v 新しい組み込み関数 DSHIFTL および DSHIFTR は、結合左右シフトを計算します。

v 新しい組み込み関数 ERF、ERFC、および ERFC_SCALED は、誤差関数とその補数を計算します。

v EXECUTE_COMMAND_LINE サブルーチンは、コマンドを実行のためにオペレーティング・システムに渡すために使用できます。

v 新しい組み込み関数 FINDLOC は、配列で値を検索します。

v 新しい組み込み関数 GAMMA および LOG_GAMMA は、ガンマ関数とその対数を計算します。

v 新しい組み込み関数 HYPOT は、ユークリッド距離を計算します。

v 新しい組み込み関数 IS_CONTIGUOUS(ARRAY) は、配列の隣接性をテストします。

v 新しい組み込み関数 LEADZ および TRAILZ は、整数内の先頭と末尾のゼロ・ビット数を返します。

v 新しい組み込み関数 MASKL および MASKR は、単純左寄せ/右寄せマスクを返します。

v BACK= 引数が、組み込み関数 MAXLOC および MINLOC に追加されました。

v 新しい組み込み関数 POPCNT および POPPAR は、整数の 1 ビット数とそのパリティーを返します。

v 新しい組み込み関数 SHIFTA、SHIFTL、および SHIFTR は、シフト操作を実行します。

v RADIX= 引数が組み込みプロシージャー SELECTED REAL KIND に追加されました。

組み込みモジュール

第 1 章 XL Fortran for Linux 3

Page 30: IBM XL Fortran for Linux, V15.1

v ISO_FORTRAN_ENV 組み込みモジュール内の関数 COMPILER_VERSIONおよびCOMPILER_OPTIONS は、プログラム変換フェーズに関する情報を返します。

v ISO_FORTRAN_ENV 組み込みモジュールは、Fortran 環境に関連する定数CHARACTER_KINDS、INT8、INT16、INT32、INT64、INTEGER_KINDS、IOSTAT_INQUIRE_INTERNAL_UNIT、LOGICAL_KINDS、REAL32、REAL64、REAL128、および REAL_KINDS を提供します。

v RADIX= 引数が IEEE_SELECTED_REAL_KIND 組み込みプロシージャーに追加されました。

プログラムおよびプロシージャー

v POINTER 属性および INTENT(IN) 属性を持つ仮引数は、TARGET 属性を持つ非ポインター実引数に関連付けられた引数にできます。詳しくは、『仮引数がポインターの場合』を参照してください。

v 内部プロシージャーおよび内部プロシージャーに対するポインターは、実引数として使用できます。また、内部プロシージャーはプロシージャー・ポインター・ターゲットとして使用できます。

v エレメント型プロシージャーの仮引数が VALUE 属性を持たない場合、仮引数には INTENT 属性が指定されていなければなりません。

v エレメント型プロシージャーに対する参照で、実引数が配列である場合、INTENT(OUT) または INTENT(INOUT) のいずれかの仮引数に対応する実引数はすべて、配列でなければなりません。

v 分離モジュール・サブプログラムは、対応するモジュール・プロシージャー・インターフェース本体によって宣言された分離モジュール・プロシージャーを定義します。

v Fortran 2008 では、基本プロシージャーが純粋である必要性はなくなります。IMPURE 接頭部指定子を使用して、プロシージャーを明示的に宣言できます。

v 汎用解決規則が拡張され、割り振り可能仮引数とポインター仮引数、およびプロシージャー仮引数とデータ仮引数を区別するようになりました。詳しくは、 189

ページの『一義的な総称プロシージャー参照』を参照してください。

v インターフェース・ブロック内の PROCEDURE ステートメントおよびMODULE PROCEDURE ステートメントで二重コロン区切り文字 (::) を使用できます。

v モジュールまたは内部サブプログラムでは、FUNCTION キーワードおよびSUBROUTINE キーワードを END ステートメントから省略できます。

v 内部プロシージャーでは、BIND 属性を NAME= 指定子なしで指定できます。

v VALUE 属性を、想定形状または明示形状のいずれかを持つ配列仮引数で指定できます。

Fortran 2003Fortran 2003 では、Fortran 95 に対して多くの新機能および機能拡張が提供されています。 Fortran 2003 の主な新機能には、以下のような機能があります。

v 派生型の機能強化

v オブジェクト指向プログラミングのサポート: 型の拡張、 型制約プロシージャー、型の最終化、 抽象 インターフェースおよび総称 インターフェース、 ポリモアフィズム、PASS 属性

4 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 31: IBM XL Fortran for Linux, V15.1

v 有効範囲およびデータ操作の機能強化: 割り振り可能コンポーネント、VOLATILE 属性、文字型の MAX、MIN、MAXLOC、MINLOC、MAXVAL、および MINVAL 組み込み機能

v 入出力の機能強化: ユーザー定義の派生型 I/O、WAIT ステートメントなどの非同期の転送

v サブルーチンの機能強化: VALUE 属性、 プロシージャー・ポインター、 据え置き CHARACTER の長さ

v IEEE 浮動小数点標準 (IEEE 1989) の例外のサポート

v C プログラミング言語とのインターオペラビリティー

関連情報v 59ページの『割り振り可能コンポーネントおよびポインター・コンポーネント』

Fortran 95Fortran 95 言語標準は、削除された機能を除き、FORTRAN 77 および Fortran 90

言語標準と上位互換性があります。Fortran 95 標準の改善点には、以下のような事項があります。

v デフォルトの初期化

v ELEMENTAL プロシージャー

v FORALL 構文ステートメント

v POINTER 初期化

v PURE 関数

v 宣言式

Fortran 90Fortran 90 では、FORTRAN 77 に対して多くの新機能および機能拡張が提供されています。以下のトピックでは、 FORTRAN 77 言語に対して Fortran 90 で提供された主な新機能を説明しています。

v 配列の機能強化

v 制御構文の機能強化

v 派生型

v 動的処理

v 自由ソース形式

v モジュール

v パラメーター化されたデータ型

v プロシージャーの機能強化

v ポインター

FORTRAN 77FORTRAN 77 では、FORTRAN 66 に対して新機能および機能拡張が提供されています。詳しくは、以下を参照してください。

第 1 章 XL Fortran for Linux 5

Page 32: IBM XL Fortran for Linux, V15.1

v 完全な米国標準規格の FORTRAN 77 言語 (FORTRAN 77 と呼ばれる)。これは、資料「American National Standard Programming Language FORTRAN, ANSI

X3.9-1978」に定義されています。

IBM 拡張IBM 拡張では、一般に特定の標準インプリメンテーションの規則や制約事項を変更しています。本書では、Fortran 2008、Fortran 2003、Fortran 95、および Fortran 90

の各標準に対する IBM 拡張に、『規則、標準、および資料』の『規則』セクションに示すように、マークを付けています。

OpenMP API バージョン 4.5OpenMP API には、既存の技術仕様 29113、Fortran 2008、Fortran 2003、およびその他の言語仕様を補足するために使用できる、追加フィーチャーが用意されています。

OpenMP アーキテクチャー検討委員会 (ARB) は、API のさまざまな部分の解釈に関する質問に回答しています。そうした質問の中には、本バージョンの XL Fortran

コンパイラーで実装されたインターフェース機能に関連する内容が含まれることがあります。このインターフェースに関連してこの委員会から提出された回答によっては、XL Fortran コンパイラーの将来のリリースに変更が生じる場合があります。これらの変更の結果として、以前の製品リリースとの互換性が失われる可能性があります。

OpenMP API バージョン 4.5 の実装に関する情報が、以下のセクションにあります。

v 「XL Fortran 最適化およびプログラミング・ガイド」の『OpenMP 環境変数』

v 「XL Fortran 最適化およびプログラミング・ガイド」の『SMP ディレクティブ』

標準仕様書XL Fortran は、『標準仕様書』セクションに記載された標準に従って設計されています。本書に含まれているいくつかのフィーチャーに関する正確な定義については、これらの標準を参照できます。

6 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 33: IBM XL Fortran for Linux, V15.1

第 2 章 XL Fortran 言語の基本要素

このセクションでは、XL Fortran アプリケーションの基本的な面を説明します。詳しくは、以下の見出しの内容を参照してください。

文字XL Fortran の文字セットは、文字、数字、および特殊文字で構成されています。

表 4. XL Fortran の文字セット

文字 数字 特殊文字

A N a nB O b oC P c pD Q d qE R e rF S f sG T g tH U h uI V i vJ W j wK X k xL Y l yM Z m z

0123456789

ブランクタブ

= 等号+ 正符号- 負符号* アスタリスク/ スラッシュ( 左括弧) 右括弧[ 右大括弧] 左大括弧, コンマ. 小数点/ピリオド$ ドル記号' アポストロフィ: コロン! 感嘆符" 二重引用符% パーセント記号& アンパーサンド; セミコロン? 疑問符< より小> より大_ 下線

これらの文字には、照合シーケンスと呼ばれる順序があります。照合シーケンスとは、ソート、マージ、比較などの処理に関する文字シーケンスの順序の判別基準となる文字の配列です。 XL Fortran では、ASCII (情報交換用米国標準コード) を使用して、文字順序を決定しています。 ASCII 文字セットの全リストについては、1117ページの『ASCII 文字セットと EBCDIC 文字セット』を参照してください。

ブランクとタブを空白文字 と言います。空白文字の意味は、ソース形式によって決まります。詳しくは、 10ページの『行およびソース形式』を参照してください。

また、分割しないで解釈する文字列のことを字句トークンと言い、これによってプログラムの構築ブロックが形成されます。字句トークンには、キーワード、名前、リテラル定数 (複素数型以外のもの)、演算子、ラベル、区切り文字、コンマ、等号、コロン、セミコロン、パーセント記号、::、=> などがあります。

© Copyright IBM Corp. 1996, 2015 7

Page 34: IBM XL Fortran for Linux, V15.1

名前名前は、以下のエレメントのいくつか、またはすべてを並べて構成されます。

v 文字 (A - Z、a - z)

v 数字 (0 - 9)

v 下線 (_)

v ドル記号 ($)

名前の先頭の文字は、数字であってはなりません。

Fortran 2003 では、名前の最大長は 63 文字です。 Fortran 90 および Fortran 95

の場合は、最大長は 31 文字です。

IBM 拡張

XL Fortran では、名前の最大長は 250 文字です。この場合、名前の先頭を下線にすることもできますが、Linux オペレーティング・システム、および XL Fortran コンパイラーとライブラリーで、先頭が下線の予約名を使用しています。

ソース・プログラム内の英字は、文字コンテキストの中のものを除いて、すべてコンパイラーによって小文字に変換されます。文字コンテキストとは、文字リテラル定数、文字ストリング編集記述子、およびホレリス定数内の文字を示しています。

注: -qmixed コンパイラー・オプションを指定した場合、名前は小文字に変換されません。例えば、XL Fortran では、

ia Ia iA IA

は、デフォルトではすべて同じものとして処理されますが、-qmixed を指定すると、小文字と大文字が区別して扱われます。

IBM 拡張 の終り

名前によって、以下のエンティティーが識別されます。

v 変数

v 名前付き定数

v プロシージャー

v 派生型

v 構文

v CRITICAL 構文

v プログラム単位

v 共通ブロック

v 名前リスト・グループ

8 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 35: IBM XL Fortran for Linux, V15.1

指定子指定子とは、データ・オブジェクトを識別する名前の後に、ゼロ個以上のセレクター (配列エレメント・セレクター、配列セクション・セレクター、サブストリング・セレクター、 F2008 複素数部セレクター F2008 、コンポーネント・セレクターなど) が続く名前です。サブオブジェクト指定子は、以下の項目を識別します。

v 配列エレメント

v 配列セクション

v 文字サブストリング

v F2008 複素数部 F2008

v 構造体コンポーネント

演算子Fortran では、式はオペランドと演算子で構成されます。Fortran のオペレーターの詳しい説明については、 117ページの『演算子と式』を参照してください。

表 5. XL Fortran 演算子

算術演算子 論理演算子

文字演算子 1 次式

一般 関係式

ステートメントFortran ステートメントとは、字句トークンが連続したものです。ステートメントによってプログラム単位が構成されます。

XL Fortran のステートメントの最大長は、34,000 文字です。

XL Fortran でサポートされるステートメントに関する詳細については、『ステートメントおよび属性』を参照してください。

ステートメント・キーワードステートメント・キーワードは、ステートメントの構文を構成する要素です。文字シーケンスは、すべてのコンテキストで予約されているわけではありません。キーワードがそのようなコンテキストで使用される場合は、ステートメント・キーワードは、エンティティー名として解釈されます。

ステートメント・ラベルステートメント・ラベルは、1 桁から 5 桁の数字の列で、そのうちの少なくとも 1

桁はゼロ以外の数字でなければなりません。このラベルは、Fortran の有効範囲単位内のステートメントを識別するために使用することができます。固定ソース形式のステートメントの場合、ステートメントの開始行の 1 桁から 5 桁までのいずれかにステートメント・ラベルを付けることができます。自由ソース形式の場合は、こうした桁についての制約事項はありません。

第 2 章 XL Fortran 言語の基本要素 9

Page 36: IBM XL Fortran for Linux, V15.1

XL Fortran では、固定ソース形式の継続行の 1 桁から 5 桁目までに指定される文字はすべて無視されます。

同じ有効範囲単位内で、複数のステートメントに同じラベルを指定すると、あいまいさが生じ、コンパイラーはエラーを生成します。空白文字および先行ゼロは、ステートメント・ラベルの識別においては意味を持ちません。どのステートメントにもラベルは指定できますが、ステートメント・ラベル参照で参照できるのは、実行可能ステートメントまたは FORMAT ステートメントに限られます。参照が行われるようにするためには、参照するステートメントと参照されるステートメントが、同一の有効範囲単位内になければなりません。

区切り文字区切り文字は、構文のリストを囲むためにペアで使用されます。XL Fortran では、次の区切り文字をサポートしています。

v 括弧: (...)

v スラッシュ: /.../

v 配列コンストラクター: (/.../)

v 配列コンストラクター: [...]

行およびソース形式行は、水平方向の文字の並びです。これに対して、桁は垂直方向の文字の並びで、特定の桁にあるそれぞれの文字 (マルチバイト文字の場合は各バイト) の位置は行内で同じになります。

XL Fortran では、行の長さをバイト単位で表すので、これらの定義が適用されるのは 1 バイト文字を含む行だけです。マルチバイト文字の場合は、各バイトが 1 桁を占めます。

行には以下のような種類があります。

開始行 ステートメントの先頭の行です。

継続行 開始行の後に続けてステートメントを継続させる行。

コメント行 実行可能プログラムに影響を与えないので、説明の記入に使用することができます。コメント・テキストは、行の終わりまで続きます。複数のコメント行を連続して入れることができますが、 1 つのコメント行を複数の行にわたって継続させることはできません。行全体が空白文字の行、または長さがゼロの行は、テキストのないコメント行と見なされます。コメント・テキストには、文字コンテキストで使用できる文字であれば、どのような文字でも入れることができます。

開始行または継続行を継続させない場合、あるいは開始行または継続行を継続させるがその継続が文字コンテキスト内で行われない場合、同じ行のステートメント・ラベル、ステートメント・テキスト、および継続文字の右に続けてインライン・コメントを入れることができます。感嘆符 (!) はインライン・コメントの始まりを意味します。

10 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 37: IBM XL Fortran for Linux, V15.1

条件付きコンパイル行

その行がコンパイルされるのが、条件付きコンパイル行の認識が使用可能になっている場合だけであることを示します。条件付きコンパイル標識は、条件付きコンパイル行になければなりません。詳しくは、『条件付きコンパイル』を参照してください。

デバッグ行 その行がデバッグ・コード用であることを示します (固定ソース形式の場合のみ)。 XL Fortran では、デバッグ行は 1 桁めに D または X を指定する必要があります。詳しくは、『デバッグ行』を参照してください。

ディレクティブ行 XL Fortran では、コンパイラーに指示または情報を与えます。詳しくは、『コメント形式ディレクティブ』を参照してください。

IBM 拡張

XL Fortran では、ソース入力行は、固定形式と自由形式のどちらのソース形式でもかまいません。同一のプログラム単位内でソース形式を混在させるには、SOURCEFORM ディレクティブを使用してください。呼び出しコマンド f77 または fort77 を使用する場合は、固定ソース形式がデフォルトです。xlf または xlf_rを使用して .f ファイル、.F ファイル、.f77 ファイル、または .F77 ファイルをコンパイルする場合も、固定ソース形式がデフォルトです。呼び出しコマンド xlf90、xlf90_r、xlf95、xlf95_r、xlf2003、xlf2003_r、xlf2008、または xlf2008_r を使用する場合は、Fortran 90 自由ソース形式がデフォルトです。

呼び出しコマンドの詳細については、「XL Fortran コンパイラー・リファレンス」の『XL Fortran プログラムのコンパイル』を参照してください。

IBM 拡張 の終り

固定ソース形式固定ソース形式行は、1 文字から 132 文字までの文字シーケンスになりま

す。デフォルトの行サイズは、 72 文字です。これは Fortran の標準行サイズにもなっています。このデフォルトは、 -qfixed=right_margin コンパイラー・オプションを使用すれば変更できます。 XL Fortran では、1 つのステートメントに対する継続行の数に制限はありませんが、ステートメントの長さは、 34,000 文字以下でなければなりません。Fortran 2003 では、継続行数の制限は 255 行、Fortran 95 では 19

行になっています。

固定ソース形式では、右マージンを超える桁は、行の一部ではないので、行の識別、番号付けその他の目的に使用できます。

文字コンテキスト内を除き、空白文字は意味を持ちません。空白文字を 1 つの字句トークン内、または字句トークンと字句トークンの間に入れても、コンパイラーの処理には影響しません。

タブ形式設定は、XL Fortran では、開始行の 1 桁目から 6 桁目までにタブ文字があることを意味します。これは、タブ文字の次の文字の解釈を 7 桁目から始めるようにコンパイラーに指示します。

固定ソース形式の行に対する要件、および行の項目に対する要件は以下のとおりです。

第 2 章 XL Fortran 言語の基本要素 11

Page 38: IBM XL Fortran for Linux, V15.1

v コメント行は、行の先頭の 1 桁目を C、c、またはアスタリスク (*) にするか、すべてを空白文字にします。コメントは、感嘆符 (!) に続けて記入することもできます。ただし、感嘆符が 6 桁目または文字コンテキスト中にある場合を除きます。

v タブが形式設定されていない開始行の場合:

– 1 桁目から 5 桁目までは、ブランク、ステートメント・ラベルが入るか、あるいは、 1 桁目に D または X を入れ、その後にオプションでステートメント・ラベルが入ります。

– 6 桁目は、ブランクまたはゼロが入ります。

– 7 桁目から右マージンまでは、ステートメント・テキストが入ります。その後に、他のステートメントまたはインライン・コメントが続くこともあります。

v XL Fortran でタブが形式設定されている開始行の場合:

– 1 桁目から 6 桁目までは、ブランク、ステートメント・ラベルが入るか、あるいは、1 桁目に D または X を入れ、その後にオプションでステートメント・ラベルが入ります。この後にタブ文字を入れる必要があります。

– -qxflag=oldtab コンパイラー・オプションを指定した場合は、タブ文字の直後の桁から右マージンまでのすべての桁にステートメント・テキストが入ります。その後に、他のステートメントまたはインライン・コメントが続くこともあります。

– -qxflag=oldtab コンパイラー・オプションを指定しない場合は、7 桁目 (タブの後の文字に相当する) から右マージンまでのすべての桁にステートメント・テキストが入ります。その後に、他のステートメントまたはインライン・コメントが続くこともあります。

v 継続行の場合:

– 1 桁目には、C、c、またはアスタリスクを入れることはできません。 1 桁目から 5 桁目までには、最初の非ブランク文字として感嘆符を入れることはできません。

XL Fortran では、1 桁目にデバッグ行を示す D または X を入れることができます。D、X を入れない場合は、文字コンテキストで使用できる文字であれば、どのような文字でも入れることができますが、その文字は無視されます。

– 6 桁目の文字は、ゼロ以外の文字または空白文字以外の文字にしなければなりません。 6 桁目の文字は、継続文字と呼ばれます。有効な継続文字には、感嘆符およびセミコロンがあります。

– 7 桁目から右マージンまでは、継続ステートメント・テキストが入ります。その後に、他のステートメントまたはインライン・コメントが続くこともあります。

– END ステートメント、およびステートメントの先頭行にプログラム単位のEND ステートメントがあるステートメントは、どちらも継続できません。

F2008 セミコロン (;) は、文字コンテキストの中、コメントの中、または 1 桁目から 6 桁目までに使用した場合以外は、単一ソース行上のステートメントを区切る役割を果たします。 F2008 同じ行に 2 つ以上のセミコロン区切り文字があり、それらが空白文字または別のセミコロンのみで区切られている場合は、単一の区切り文字と見なされます。行の最後の文字が区切り文字である場合、またはインライ

12 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 39: IBM XL Fortran for Linux, V15.1

ン・コメントの直前の区切り文字は、無視されます。セミコロンの後の同じ行にステートメントを続ける場合、ラベルを設定することはできません。同じ行の中で、追加のステートメントをプログラム単位の END の後に続けることはできません。

デバッグ行 (IBM 拡張)デバッグ行は、固定ソース形式のみで使用可能で、デバッグ用に使用されるソース・コードが入っています。このデバッグ行は、XL Fortran では、1 桁目に文字D、または、文字 X を入れることによって指定されます。デバッグ行の処理は、コンパイラー・オプション、-qdlines、-qxlines の設定によって異なります。

v -qdlines オプションを指定すると、コンパイラーは 1 桁目の D をブランクと見なし、そうしたデバッグ行をソース・コード行として扱います。-qxlines を指定すると、コンパイラーは 1 桁目の X をブランクと見なし、その行をソース・コード行として扱います。

v -qdlines も -qxlines も指定しない場合、コンパイラーはそうしたデバッグ行をコメント行として扱います。これがデフォルト設定です。

デバッグ・ステートメントが複数の行にまたがっている場合は、継続文字および 1

桁目に D または X を指定しなければなりません。開始行がデバッグ行でない場合、任意の継続行をデバッグ行として指定することができます。ただし、その場合、 -qdlines、-qxlines コンパイラー・オプションの指定の有無にかかわらず、ステートメントが構文的に正しくなければなりません。

固定ソース形式の例

C Column Numbers:C 1 2 3 4 5 6 7C23456789012345678901234567890123456789012345678901234567890123456789012

!IBM* SOURCEFORM (FIXED)CHARACTER CHARSTR ; LOGICAL X ! 2 statements on 1 lineDO 10 I=1,10

PRINT *,'this is the index',I ! with an inline comment10 CONTINUEC

CHARSTR="THIS IS A CONTINUEDX CHARACTER STRING"

! There will be 38 blanks in the string between "CONTINUED"! and "CHARACTER". You cannot have an inline comment on! the initial line because it would be interpreted as part! of CHARSTR (character context).

100 PRINT *, IERROR! The following debug lines are compiled as source lines if! you use -qdlinesD IF (I.EQ.IDEBUG.AND.D + J.EQ.IDEBUG) WRITE(6,*) IERRORD IF (I.EQ.D + IDEBUG )D + WRITE(6,*) INFO

END

自由ソース形式自由ソース形式行では、1 行につき最大 132 文字まで指定できます。XL Fortran では、 1 つのステートメントに対する継続行の数に制限はありませんが、ステートメントの長さは、 34,000 文字以下でなければなりません。Fortran 2003 では、継続行数の制限は 255 行、Fortran 95 では 39 行になっています。

第 2 章 XL Fortran 言語の基本要素 13

Page 40: IBM XL Fortran for Linux, V15.1

項目は行の任意の桁位置から始めることができますが、行および行に関する項目について次の要件を満たさなければなりません。

v コメント行は、空白行だけで構成される行、または、感嘆符 (!) で始まる行です。ただし、感嘆符を文字コンテキスト内に入れてはなりません。

v 開始行には、次の任意の項目を次に示す順で入れることができます。

– ステートメント・ラベル

– ステートメント・テキスト。ただし、このステートメント・テキストは、開始行では必須です。

– 追加のステートメント

– アンパーサンド (&) 継続文字

– インライン・コメント

v 開始行または継続行を非文字コンテキストで継続させる場合、継続行は、開始行または継続行に続く最初のコメント行以外の行から始まるようにする必要があります。行を継続行として定義するには、直前のコメント行以外の行のステートメントの後ろにアンパーサンドを置く必要があります。

v アンパーサンドの前後の空白文字は任意ですが、次の制約事項があります。

– 継続行の最初の非ブランク文字位置にアンパーサンドを置く場合、ステートメントはアンパーサンドの次の文字位置から継続します。

– 字句トークンを継続させる場合、トークンの先頭部分の直後にアンパーサンドを置き、継続行でアンパーサンドの直後にトークンの残りの部分を続けなければなりません。

v 文字コンテキストは、次の条件が成り立つ場合に継続させることができます。

– 継続行の最後の文字がアンパーサンドで、その後にインライン・コメントが続かない。継続させるステートメント・テキストの右端の文字がアンパーサンドの場合、継続文字としてもう 1 つアンパーサンドを入力しなければなりません。

– 次の非コメント行の先頭の非ブランク文字がアンパーサンドである。

F2008 単一ソース行の複数のステートメントは、セミコロンで区切ります。ただし、セミコロンが文字コンテキスト中またはコメント中に指定されている場合を除きます。 F2008 同じ行に 2 つ以上の区切り文字があり、それらが空白文字または別のセミコロンのみで区切られている場合は、単一の区切り文字と見なされます。行の最後の文字が区切り文字である場合、またはインライン・コメントの直前の区切り文字は、無視されます。同じ行の中で、追加のステートメントをプログラム単位の END の後に続けることはできません。

空白文字空白文字は、文字コンテキスト内またはフォーマット指定内は除き、字句トークン内に入れることはできません。空白文字は、見やすくするためにトークンとトークンの間に自由に挿入できます。また、名前、定数、ラベルは、空白文字で隣接するキーワード、名前、定数、ラベルから区切るようにしなければなりません。

隣接する特定のキーワード間で空白文字が必要となる場合があります。次の表は、空白文字がオプションとなるキーワードを示しています。

14 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 41: IBM XL Fortran for Linux, V15.1

表 6. 空白文字がオプションとなるキーワード

BLOCK DATA END FILE END SUBMODULE �2�

DOUBLE COMPLEX �1� END FORALL END SUBROUTINE

DOUBLE PRECISION END FUNCTION END TYPE

ELSE IF END IF END UNION

ELSE WHERE END INTERFACE END WHERE

END ASSOCIATE END MAP �1� GO TO

END BLOCK �2� END MODULE IN OUT

END BLOCK DATA END PROGRAM SELECT CASE

END DO END SELECT SELECT TYPE �3�

END ENUM �3� END STRUCTURE

注:

�1� IBM 拡張

�2� Fortran 2008

�3� Fortran 2003

自由ソース形式の例

!IBM* SOURCEFORM (FREE(F90))!! Column Numbers:! 1 2 3 4 5 6 7!23456789012345678901234567890123456789012345678901234567890123456789012DO I=1,20

PRINT *,'this statement&& is continued' ; IF (I.LT.5) PRINT *, I

ENDDOEN&

&D ! A lexical token can be continued

IBM 自由ソース形式 (IBM 拡張)IBM 自由ソース形式の行またはステートメントは、最大で 34,000 文字までの文字シーケンスです。項目は行の任意の桁位置から始めることができますが、次の要件を満たさなければなりません。

v コメント行は、1 桁目が二重引用符で始まる行、空白文字だけで構成される行、または長さゼロの行です。コメント行は、継続行の後に続けてはなりません。コメントは、文字コンテキスト内でなければ、感嘆符に続けて記入することもできます。

v 開始行には、次の任意の項目を次に示す順で入れることができます。

– ステートメント・ラベル

– ステートメント・テキスト

– 負符号 (-) 継続文字

– インライン・コメント

v 継続行は、継続される行の直後に続け、次の任意の項目を次に示す順で入れることができます。

– ステートメント・テキスト

第 2 章 XL Fortran 言語の基本要素 15

Page 42: IBM XL Fortran for Linux, V15.1

– 継続文字

– インライン・コメント

開始行または継続行のステートメント・テキストを継続させる場合、負符号を使用して、ステートメント・テキストが次の行に継続することを示します。文字コンテキスト内で、継続させるステートメント・テキストの右端の文字が負符号の場合、継続文字としてもう 1 つ負符号を入力しなければなりません。

文字コンテキスト内を除き、空白文字は意味を持ちません。空白文字を 1 つの字句トークン内、または字句トークンと字句トークンの間に入れても、コンパイラーのトークン処理には影響しません。

IBM 自由ソース形式の例

!IBM* SOURCEFORM (FREE(IBM))"" Column Numbers:" 1 2 3 4 5 6 7"23456789012345678901234567890123456789012345678901234567890123456789012DO I=1,10PRINT *,'this is -

the index',I ! There will be 14 blanks in the string! between "is" and "the"

END DOEND

条件付きコンパイル (IBM 拡張)XL Fortran プログラムの特定の行を条件付きコンパイルするようマークするには、標識を使用します。このサポートを使用すれば、SMP 環境内だけで有効なステートメントが入っているコードを、非 SMP 環境に移植することができます。

条件付きコンパイルは、IBM 自由ソース形式ではサポートされません。

条件付きコンパイルの構文

cond_comp_sentinel

現行ソース形式によって定義される条件付きコンパイル標識です。これは、次のいずれかになります。v !$、C$、c$、または *$ (固定ソース形式の場合)

v !$ (自由ソース形式の場合)

fortran_source_line

XL Fortran のソース行です。

条件付きコンパイルの規則

一般的な規則:

有効な XL Fortran ソース行が、条件付きコンパイル標識の後に続いていなければなりません。

�� cond_comp_sentinel fortran_source_line ��

16 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 43: IBM XL Fortran for Linux, V15.1

条件付きコンパイル行には、EJECT、INCLUDE、または非コメント・ディレクティブを入れることができます。

条件付きコンパイル標識には、組み込み空白文字が入っていてはなりません。

条件付きコンパイル標識は、同一行のソース・ステートメントまたはディレクティブの後に置くことはできません。

条件付きコンパイル行を継続させる場合は、条件付きコンパイル標識が、少なくとも 1 つの継続行か、または、開始行になければなりません。

条件付きコンパイル行が認識されるようにするには、-qcclines コンパイラー・オプションを指定する必要があります。条件付きコンパイル行が認識されないようにするには、-qnocclines コンパイラー・オプションを指定します。

トリガー・ディレクティブは、条件付きコンパイル標識に優先します。例えば、-qdirective='$' オプションを指定すると、 !$ などのトリガーで始まる行は、条件付きコンパイル行ではなくコメント・ディレクティブとして扱われます。

固定ソース形式の規則:

条件付きコンパイル標識は、1 桁目に置かなければなりません。

固定ソース形式 の行の長さ、大文字小文字の区別、空白文字、継続、タブ形式設定、および桁に関するすべての規則が適用されます。

自由ソース形式の規則:

条件付きコンパイル標識は、どの桁に入れても構いません。

自由ソース形式 の行の長さ、大文字小文字の区別、空白文字、および継続に関するすべての規則が適用されます。条件付きコンパイル行を認識するようにした場合、2 つの空白文字で置き換えられます。

ステートメントの順序および実行シーケンスステートメントの順序 の表内で、縦線で区切られた箇所は、左右のステートメントを入れ替えることはできますが、横線で区切られた箇所については、ステートメントを入れ換えることはできません。

表 7. ステートメントの順序

PROGRAM、FUNCTION、SUBROUTINE、MODULE、 F2008 SUBMODULE F2008 、または BLOCK DATA の各ステートメント

USE ステートメント

IMPORT ステートメント

第 2 章 XL Fortran 言語の基本要素 17

Page 44: IBM XL Fortran for Linux, V15.1

表 7. ステートメントの順序 (続き)

FORMAT ステートメントおよび ENTRY ステートメント

IMPLICIT NONE

PARAMETER IMPLICIT ステートメント

IMPLICIT ステートメント

PARAMETER ステートメントおよび DATA ステートメ

ント

派生型定義、インターフェース・ブロック、型宣言ステートメント、列挙型定義、プロシージャー宣言、仕様ステートメント、およびステートメント関数ステートメント

DATA ステートメント 実行可能構文

CONTAINS ステートメント

内部サブプログラムまたはモジュール・サブプログラム

END ステートメント

ステートメントの順序に関する規則および制限の詳細については、 169ページの『第 8 章 プログラム単位およびプロシージャー』または 313ページの『第 11 章ステートメントおよび属性』を参照してください。

通常の実行シーケンスは、宣言関数への参照が任意の順序で処理され、それに続いて実行可能なステートメントが有効範囲単位に現れる順番で処理されます。

制御権を移動すると、通常の実行シーケンスが変更されます。実行シーケンスを制御するために使用できるステートメントとして、以下のものがあります。

v DO、IF などの制御ステートメント

v END=、ERR=、または、EOR= 指定子を含む、 READ および WRITE などの入出力ステートメント

サブプログラムによって定義されているプロシージャーを参照する場合、プログラムの実行は、プロシージャーを定義しているサブプログラムの有効範囲単位で参照される宣言関数を継続します。プログラムは、プロシージャーを定義しているENTRY、FUNCTION、または、SUBROUTINE ステートメントの後の最初の実行可能ステートメントで再開されます。サブプログラムから戻ると、プログラムの実行は、プロシージャーが参照された場所、または代替戻り指定子によって参照されるステートメントから継続されます。

本書では、特定の制御権の移動でのイベントの順序に関する記述は、エラーの発生や STOP ステートメントの実行などのイベントによって通常の順序が変更されないことを前提としています。

データ型データ型には、名前、有効な値、それらの値を表す手段として使用される定数、およびそれらの値を操作するための演算が含まれます。データ型は、組み込み型 と派生型 の 2 種類に分類されます。

派生型は、組み込みと派生データ型のどちらのデータ型も入れることができる複合データ型です。

18 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 45: IBM XL Fortran for Linux, V15.1

組み込み型とその演算は、事前定義されており、常にアクセスできます。組み込みデータ型には、数値と非数値の 2 つのクラスがあり、それぞれのクラスにいくつかの型があります。

表 8. 組み込み型

数値組み込み型 非数値組み込み型

整数 論理演算子

実数 文字演算子

複素数 ベクトル �1�

バイト �1� バイト �1�

注:

�1� IBM 拡張

型宣言: 型パラメーターおよび指定子このセクションでは、エンティティーの型宣言に関する概要を説明します。派生型および組み込み型の型宣言に関する特定の構文および規則の詳細は、ステートメント のセクションに記載されています。

XL Fortran は、個々の組み込みデータ型について 1 つ以上の表記方法を提供しています。この表現方法は、オプションで、型宣言ステートメントで kind_param を使用すれば、kind 型パラメーターの値で指定することができます。この値で、以下を示すことができます。

v 整数 データ型の範囲

v 実数 データ型の小数部の精度および指数の範囲

v 複素数 データ型の小数部の精度および指数の範囲

v 文字 データ型の表記方法

v 論理 データ型の表記方法

バイト 組み込みデータ型には、kind 型パラメーターはありません。

length 型パラメーターは、型付き文字のエンティティーの文字数を指定します。

型指定子は、型宣言ステートメントで宣言されたすべてのエンティティーの型を指定します。型指定子 (INTEGER、REAL、COMPLEX、LOGICAL、およびCHARACTER) には、kind_selector を入れることができ、これによって kind 型パラメーターが指定されます。

例えば、次に示すのは 4 バイト整数を宣言する一般的な方法の例です。

v INTEGER(4)

v INTEGER(KIND=4)

v INTEGER (デフォルトの整数サイズが 4 バイトに設定されている場合)

v F2008 TYPE(INTEGER(4)) F2008

v F2008 TYPE(INTEGER(KIND=4)) F2008

第 2 章 XL Fortran 言語の基本要素 19

Page 46: IBM XL Fortran for Linux, V15.1

v F2008 TYPE(INTEGER) (デフォルトの整数サイズが 4 バイトに設定されている場合) F2008

本書では、4 バイトの整数参照を INTEGER(4) とします。

型指定子について詳しくは、『型宣言』を参照してください。

適用可能な組み込みプロシージャー組み込み型のオブジェクトの場合、KIND 組み込みプロシージャーは、その引数のkind 型パラメーターを戻します。

LEN 組み込みプロシージャーを使用すれば、文字オブジェクトの length 型パラメーターを判別できます。

SIZEOF 組み込み関数は、データ・オブジェクトのサイズをバイト単位で戻します。

型パラメーター照会型パラメーター照会 を使用すれば、データ・オブジェクトの型パラメーターの値を確認できます。

次に示すのは、型パラメーター照会の 2 つの例です。

i%kind

string%len

型の決定個々のユーザー定義関数または名前付きエンティティーには、データ型があります。ホスト関連付けまたは使用関連付けによりアクセスされるエンティティーの型は、それぞれ、ホスト有効範囲単位内で決定されるか、またはアクセスされるモジュール内で決定されます。名前付きエンティティーの型は、以下の順序で、以下の3 つのいずれかの方法で決定されます。

1. 次のいずれかによって明示的に決める方法

v 指定した型宣言ステートメントから決める (詳しくは、 526ページの『型宣言』を参照してください)

v 関数の結果の場合は、指定した型ステートメントまたはその FUNCTION ステートメントから決める

2. 指定された IMPLICIT 型ステートメントから暗黙的に決める方法

3. 事前に定義された規則 (暗黙規定) によって暗黙的に決める方法。デフォルト(すなわち、 IMPLICIT 型ステートメントがない場合) では、名前の最初の文字が、I、J、 K、L、M、または N の場合、データ型はデフォルトの整数になります。そうでない場合は、型はデフォルトの実数になります。

特定の有効範囲単位内では、英字、ドル記号、下線を IMPLICIT ステートメントに指定していない場合、使用する暗黙のタイプは、ホスト有効範囲単位で使用されている暗黙の型と同じになります。プログラム単位およびインターフェース本体は、暗黙規定を記述する IMPLICIT ステートメントがあるホストと同様に扱われます。

リテラル定数のデータ型は、その形式によって決定されます。

20 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 47: IBM XL Fortran for Linux, V15.1

データ・オブジェクトデータ・オブジェクトは、変数、定数、定数のサブオブジェクトのいずれかです。

変数は値を持つことができ、実行可能プログラムの実行時に定義または再定義することができます。変数には次のものがあります。

v スカラー変数名

v 配列変数名

v サブオブジェクト

変数のサブオブジェクトとは、参照または定義することが可能な名前付きのオブジェクトの一部です。サブオブジェクトには次のものがあります。

v 配列エレメント

v 配列セクション

v 文字サブストリング

v 構造体コンポーネント

定数のサブオブジェクトは、定数の一部です。参照される部分は、変数の値により異なります。

定数定数は値を持ちますが、この値は実行可能プログラムの実行時に定義または再定義することはできません。名前の付いた定数を名前付き定数といいます。定数に名前を指定するには、ENUM ステートメント、または、PARAMETER 属性を使用します。名前のない定数をリテラル定数といいます。リテラル定数は、組み込み型であっても、型なしでもかまいません。型なし定数には次のものがあります。

v 16 進数

v 8 進数

v 2 進数

v ホレリス

リテラル定数のオプションの kind 型パラメーターは、数字ストリングまたはスカラー整数の名前付きの定数のみです。

符号付きのリテラル定数には、先に正符号または負符号を付けることができます。その他のリテラル定数はすべて、符号なしでなければなりません。これらの定数には、先行符号は付きません。ゼロの値は、正でも負でもありません。ゼロ、符号付きまたは符号なしのいずれとしても指定できます。

自動オブジェクト自動オブジェクトとは、サブプログラム F2008 または BLOCK 構文 F2008 内で動的に割り振られるローカル・データ・オブジェクトです。このオブジェクトは、非定数の文字長、非定数の配列境界、またはその両方を持つことができます。自動オブジェクトは、仮引数ではありません。

自動オブジェクトは、常に制御された自動ストレージ ・クラスを持っています。

自動オブジェクトは、以下のステートメントには指定できません。

第 2 章 XL Fortran 言語の基本要素 21

Page 48: IBM XL Fortran for Linux, V15.1

v COMMON

v DATA

v EQUIVALENCE

v NAMELIST

また、自動オブジェクトには、AUTOMATIC、 PARAMETER、SAVE、 STATIC属性を指定することもできません。自動オブジェクトは、型宣言ステートメント内で定数式によって初期化または定義することはできませんが、デフォルト初期設定を持つことはできます。自動オブジェクトは、メインプログラム、モジュール、

F2008 またはサブモジュール F2008 の宣言部分に入れることはできません。

ポリモアフィック・エンティティー (Fortran 2003)ポリモアフィック・エンティティーとは、プログラムの実行時に異なる型になることができるデータ・エンティティーです。プログラム実行中の特定時点におけるデータ・エンティティーの型は、そのエンティティーの動的型です。データ・エンティティーの宣言型は、明示的または暗黙的に設定を宣言された型になります。

ポリモアフィック・オブジェクトは、CLASS 型指定子を使用して宣言します。CLASS 型指定子に型名が指定されると、ポリモアフィック・オブジェクトの宣言型は、その型になります。

CLASS(*) 指定子を使用すれば、無制限のポリモアフィック・オブジェクトを宣言することができます。無制限のポリモアフィック・エンティティーは、特定の型で宣言されません。別の無制限のポリモアフィック・エンティティーを含め、他のどのエンティティーとも同じ宣言型を持つとは見なされません。

ポリモアフィック・エンティティーでないエンティティーは、型の互換性があるのは、同じ型のエンティティーに限られます。ポリモアフィック・エンティティーの場合、型の互換性はその宣言型に基づいて決まります。無制限のポリモアフィック・エンティティーでないポリモアフィック・エンティティーは、同じ型のエンティティーまたはその拡張と型互換性があります。無制限のポリモアフィック・エンティティーの場合は、宣言型があるとは見なされませんが、すべてのエンティティーと型互換性があります。

エンティティーが、ある型と型互換性があるとは、その型のエンティティーと型互換性がある場合を言います。エンティティーには別のエンティティーとの型互換性、kind 互換性、およびランク互換性 (これらを総称して TKR と呼びます) があるのは、最初のエンティティーに 2 番目のエンティティーとの型互換性があり、最初のエンティティーの kind 型パラメーターが 2 番目のエンティティーの対応するkind 型パラメーターと同じ値を持ち、両方のエンティティーが同じランクを持つ

TS 29113 か、いずれかが想定ランクである TS 29113 場合です。

ポリモアフィック・オブジェクトの宣言型のコンポーネントだけが、コンポーネント選択で指定できます。

ポリモアフィックの割り振り可能オブジェクトは、型互換のある任意の型として割り振ることができます。ポリモアフィック・ポインターまたは仮引数は、プログラムの実行時に、型互換のあるオブジェクトと関連付けられます。

22 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 49: IBM XL Fortran for Linux, V15.1

以下の表は、オブジェクトの動的型を示しています。

表 9. オブジェクトの動的型

オブジェクト 動的型

割り振り済みの割り振り可能ポリモアフィック・オブジェクト

そのオブジェクトが割り振られた型

関連付けられたポリモアフィック・ポインター

ポインターのターゲットの動的型

割り振り不可、非ポインターのポリモアフィック仮引数

仮引数の関連実引数の動的型

割り振り解除された割り振り可能な その割り振り可能オブジェクトの宣言型

関連付けが解除されたポインター そのポインターの宣言型

関連名によって指定されたエンティティー そのオブジェクトが関連付けられているセレクターの動的型

非ポリモアフィック・オブジェクト そのオブジェクトの宣言型

関連情報v 346ページの『CLASS (Fortran 2003)』

変数の定義状況変数は、定義済み、または未定義のどちらかで、その定義状況をプログラムの実行中に変更することができます。名前付き定数には値があり、この場合は、プログラムの実行中に定義または再定義することはできません。

文字、複素数、または派生型の配列 (セクションを含む)、構造体、および変数は、0

個以上のサブオブジェクトからなるオブジェクトです。変数とサブオブジェクト間、および異なる変数のサブオブジェクト間には、関連付けを設定することができます。

v すべてのサブオブジェクトが定義されると、そのオブジェクトは定義済みになります。つまり、各オブジェクトまたはサブオブジェクトは値を持っていますが、そのオブジェクトまたはサブオブジェクトが未定義になるまで、または別の値によって再定義されるまで、その値は変わりません。

v 派生型のスカラー・オブジェクトは、そのすべての非ポインター・コンポーネントが定義されている場合に限って定義済みとなります。

v 複素数または文字型のスカラー・オブジェクトは、そのすべてのサブオブジェクトが定義されている場合に限って定義済みとなります。

v オブジェクトが未定義の場合、1 つ以上のサブオブジェクトが未定義です。未定義のオブジェクトまたはサブオブジェクトは、予測可能な値を提供できません。

変数は、DATA ステートメント、型宣言ステートメント、STATIC ステートメントで初期値を設定するように指定された変数は、最初から定義済みです。また、BIND属性が設定された、 Fortran 以外の方法で初期化されている変数も、最初から定義済みです。さらに、デフォルトの初期化によって、変数の初期値定義が行われる場合があります。ゼロ・サイズの配列およびゼロ長の文字オブジェクトは、常に定義済みです。

それ以外の変数は、すべて最初は未定義状況です。

第 2 章 XL Fortran 言語の基本要素 23

Page 50: IBM XL Fortran for Linux, V15.1

定義を発生させるイベント以下のイベントは、変数を定義済みにします。

1. マスクされた配列代入ステートメント以外の組み込み代入ステートメント、 または、FORALL 代入ステートメントを実行すると、等号の前の変数は定義済みになります。

定義済みの代入ステートメントを実行すると、等号の前の全部または一部の変数が定義済みになる場合があります。

2. マスクされた配列代入ステートメント、 または、 FORALL 代入ステートメントを実行すると、代入ステートメントの配列エレメントの一部またはすべてが定義済みになる場合があります。

3. 入力ステートメントを実行すると、入力ファイルから値を割り当てられる変数はそれぞれ、データを受け取った時点で定義済みになります。単位指定子で内部ファイルを識別する WRITE ステートメントを実行すると、書き込まれる各レコードが定義済みになります。

非同期入力ステートメントを実行した場合は、対応する WAIT ステートメントが実行されるまで変数は定義済みにはなりません。

4. DO ステートメントを実行すると、DO 変数があれば定義済みになります。

5. デフォルトの初期化によって、変数が最初から定義済みになる場合があります。

6. 入出力ステートメント内の暗黙 DO リストで指定した処理の実行を開始すると、その暗黙 DO の変数は定義済みになります。

7. ASSIGN ステートメントを実行すると、ステートメント内の変数は、ステートメント・ラベルの値によって定義済みとなります。

8. 仮引数に INTENT(OUT) がなく、それに対応する実引数全体がステートメント・ラベル以外の値で定義されている場合、プロシージャーに対する参照によって、仮引数のデータ・オブジェクト全体が定義されます。

仮引数に対応する実引数の対応サブオブジェクトが定義済みの場合、プロシージャーに対する参照によって、 INTENT(OUT) が指定されていない仮引数のサブオブジェクトが定義済みになります。

9. IOSTAT= 指定子を含む I/O ステートメントを実行すると、指定された整数変数は定義済みになります。

10. IOMSG 指定子を含む I/O ステートメントを実行すると、エラー、ファイルの終わり、またはレコードの終わりが検出された時点で、指定された文字変数は定義済みになります。

11. SIZE 指定子を含む READ ステートメントを実行すると、指定された整数変数は定義済みになります。

12. XL Fortran で、ID 指定子を含む READ または WRITE ステートメントを実行すると、指定された整数変数は定義済みになります。

13. XL Fortran で、DONE= 指定子を含む WAIT ステートメントを実行すると、指定された論理変数は定義済みになります。

14. XL Fortran で、NUM= 指定子を含む同期 READ または WRITE ステートメントを実行すると、指定された整数変数は定義済みになります。

24 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 51: IBM XL Fortran for Linux, V15.1

NUM= 指定子を含む非同期 READ または WRITE ステートメントを実行した場合は、指定された整数変数は定義済みになりません。この場合、整数変数は、対応する WAIT ステートメントの実行時に定義されます。

15. INQUIRE ステートメントを実行すると、エラー条件が存在しない場合に、そのステートメントの実行時に値を割り当てられている変数はすべて定義済みになります。

16. ある文字記憶単位が定義済みになると、それに関連するすべての文字記憶単位が定義済みとなります。

数値記憶単位が定義済みになると、同じ型の関連する数値記憶単位はすべて定義済みとなります。ただし、ASSIGN ステートメントが実行される場合には、ASSIGN ステートメント内の変数に関連した変数は未定義となります。DOUBLE PRECISION 型のエンティティーが定義済みになると、その全体が関連した倍精度実数型のエンティティーはすべて定義済みとなります。

デフォルト以外の整数型、デフォルトまたは倍精度以外の実数型、デフォルト以外の論理型、デフォルト以外の複素数型、任意の長さを持つデフォルト以外の文字型、または非順序型の非ポインター・スカラー・オブジェクトは、各ケースごとに異なる未指定の単一記憶単位を占有します。型、 kind、ランクの少なくとも 1 つが他のポインターと異なるポインターは、未指定の単一記憶単位を占有します。未指定の記憶単位が定義済みとなると、関連するすべての未指定記憶単位が定義済みとなります。

17. デフォルトの複素数エンティティーが定義済みになると、一部がそれに関連したデフォルトの実数エンティティーがすべて定義済みとなります。

18. 一部が関連するデフォルトの実数型エンティティーまたは複素数型エンティティーが定義済みとなることにより、デフォルトの複素数エンティティーの両方の部分が定義済みとなり、そのデフォルトの複素数型エンティティーが定義済みとなります。

19. 部分的に関連したオブジェクトが定義済みとなることにより、数値シーケンス構造体または文字シーケンス構造体のすべてのコンポーネントが定義済みとなると、その構造体は定義済みとなります。

20. STAT= 指定子付きの ALLOCATE ステートメントまたは DEALLOCATE ステートメントを実行すると、STAT= 指定子で指定された変数が定義済みとなります。

21. ERRMSG= 指定子が設定された ALLOCATE または DEALLOCATEステートメントの実行中にエラー条件が発生すると、errmsg-variable が定義済みになります。

22. ゼロ・サイズの配列を割り振ると、その配列は定義済みとなります。

23. プロシージャーを呼び出すと、そのプロシージャー内のゼロ・サイズの自動オブジェクトがすべて定義済みとなります。

24. 定義済みのターゲットにポインターを関連付けるポインター代入ステートメントを実行すると、そのポインターは定義済みとなります。

25. 非ポインター、割り振り不可の自動オブジェクトを含むプロシージャーを呼び出すと、そのオブジェクトの非ポインター・デフォルト初期化済みサブコンポーネントがすべて定義済みになります。

第 2 章 XL Fortran 言語の基本要素 25

Page 52: IBM XL Fortran for Linux, V15.1

26. 非ポインターの割り振り不可 INTENT(OUT) 仮引数を含むプロシージャーを呼び出すと、そのオブジェクトの非ポインター・デフォルト初期化済みサブコンポーネントはすべて定義済みになります。

27. 非ポインター・コンポーネントがデフォルトの初期化によって初期化される派生型のオブジェクトを割り振ると、コンポーネントとそのサブオブジェクトは定義済みになります。

28. Fortran 95 で使用される FORALL ステートメントまたは構文では、index-name 値セットが評価されると、index-name が定義済みになります。

29. COPYIN 節にない THREADPRIVATE 非ポインター割り振り不可変数が、最初の並列領域に入るときに定義される場合、その変数の新しいスレッドのコピーがそれぞれ定義されます。

30. COPYIN 節にない THREADPRIVATE 共通ブロックが、最初の並列領域に入るときに定義される場合、その共通ブロック変数の新しいスレッドのコピーがそれぞれ定義されます。

31. COPYIN 節に指定された THREADPRIVATE 変数の場合、新しい各スレッドが、マスター・スレッドの定義、割り振り、およびその変数の関連付け状況を複写します。したがって、並列領域に入る時に変数のマスター・スレッドのコピーが定義された場合は、その変数の新しいスレッドのコピーもそれぞれ定義されます。

32. COPYIN 節に指定された THREADPRIVATE 共通ブロックの場合、新しい各スレッドが、マスター・スレッドの定義、割り振り、およびその共通ブロック内の変数の関連付け状況を複写します。したがって、並列領域に入る時に共通ブロック変数のマスター・スレッドのコピーが定義された場合は、その共通ブロック変数の新しいスレッドのコピーもそれぞれ定義されます。

33. 変数が、PARALLEL、PARALLEL DO、DO、PARALLEL SECTIONS、PARALLEL WORKSHARE、SECTIONS、または、SINGLE ディレクティブの FIRSTPRIVATE 節で指定されると、新しい各スレッドが、マスター・スレッドの定義とその変数の関連付け状況を複写します。したがって、並列領域に入る時に変数のマスター・スレッドのコピーが定義された場合は、その変数の新しいスレッドのコピーもそれぞれ定義されます。

34. そのデータ共有属性が TASK 領域で firstprivate である変数、仮引数、またはprivate 変数の場合、各タスクによって、生成するタスクの定義と変数の関連が複写されます。生成するタスクの変数のコピーが TASK 領域に対する入り口で定義されると、新しいタスクの変数のコピーもそれぞれ定義されます。

35. 各変数、または共通ブロック内の変数が、COPYPRIVATE 節で指定されている場合、 SINGLE 構文に囲まれたコードの実行後で、チーム内のスレッドが構文から離れる前に変数のすべてのコピーが以下のように定義されます。

v 変数に POINTER 属性がある場合、チーム内のその他のスレッドにある変数のコピーは、そのポインター関連付け状況が、SINGLE 構文に囲まれたコードを実行したスレッドに属する変数のコピーと同じになります。

v 変数に POINTER 属性がない場合、チーム内のその他のスレッドにある変数のコピーは、SINGLE 構文に囲まれたコードを実行したスレッドに属する変数のコピーと同じ定義になります。

36. F2008 NEWUNIT= 指定子付きの OPEN ステートメントが正しく実行されると、NEWUNIT= 指定子で指定された変数が定義済みとなります。 F2008

26 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 53: IBM XL Fortran for Linux, V15.1

37. F2008 BLOCK 構文の未保管の割り振り不能な非ポインター・ローカル変数の場合、変数を含む構文の BLOCK ステートメントを実行すると、変数のすべての非ポインター・デフォルト初期化済み最終コンポーネントが定義済みとなります。 F2008

38. VOLATILE 属性を持つオブジェクトは、プログラム内で定義が指定されていない場合でも、定義済みになることがあります。

未定義を発生させるイベント以下のイベントは、変数を未定義にします。

1. ある型の変数が定義済みとなると、別の型の関連した変数はすべて未定義になります。しかし、デフォルトの実数型の変数が、デフォルトの複素数型の変数に部分的に関連付けられている場合、実数型の変数が定義済みになっても複素数型の変数は未定義にならず、複素数型の変数が定義済みになっても実数型の変数は未定義になりません。デフォルトの複素数型の変数が、別のデフォルトの複素数型の変数に部分的に関連付けられている場合も、一方の変数が定義済みになっても、他方の変数は未定義になりません。

2. ASSIGN ステートメントを実行すると、ステートメント内の変数は、整数として未定義になります。その変数に関連した変数も未定義になります。

3. 関数の評価によって、関数の引数、またはモジュール、 F2008 サブモジュール F2008 、あるいは共通ブロック内の変数が定義済みとなり、しかも関数に対する参照が、関数の値によって式の値を決める必要のない式に現れる場合、その引数または変数は、式の計算時に未定義になります。

4. サブプログラム内の RETURN ステートメントまたは END ステートメントの実行で、その有効範囲単位に対してローカルであるすべての変数、または、再帰的に呼び出す場合、その有効範囲単位の現在のインスタンスに対してローカルであるすべての変数が未定義になります。ただし、以下のものは除きます。

a. SAVE または STATIC 属性が設定された変数

b. 無名共通ブロック内の変数

c. Fortran 90 で、名前付き共通ブロック内の変数で、サブプログラムに指定されており、かつ、サブプログラムに対する直接参照または間接参照を行う 1

つ以上の他の有効範囲単位内に指定されているもの。 XL Fortran では、このような変数がスレッド・ローカルの共通ブロックに含まれない限り未定義になりません。

d. ホスト有効範囲単位からアクセスする変数

e. Fortran 90 で、モジュールからアクセスされる変数で、そのモジュールがサブプログラムに対する直接参照または間接参照を行う 1 つ以上の他の有効範囲単位によっても直接または間接的に参照されるもの。 XL

Fortran では、このような変数は未定義になりません。

f. Fortran 90 で、名前付き共通ブロック内の変数で、当初定義されていて、その後、定義または再定義されていないもの。 XL Fortran では、このような変数は未定義になりません。

5. 入力ステートメントの実行時にエラー条件またはファイルの終わり条件が発生すると、そのステートメントの入力リストまたは名前リスト・グループで指定した変数がすべて未定義になります。

第 2 章 XL Fortran 言語の基本要素 27

Page 54: IBM XL Fortran for Linux, V15.1

6. 入出力ステートメントの実行時に、エラー条件、ファイルの終わり条件、またはレコードの終わり条件が発生し、そのステートメントに暗黙 DO リストが含まれていた場合は、そのステートメント内の暗黙 DO 変数はすべて未定義になります。

7. 定義済みの代入ステートメントを実行すると、等号の前の変数の一部または全部が未定義のままにされる場合があります。

8. 事前に作成されていないレコードを指定する直接アクセス入力ステートメントを実行すると、そのステートメントの入力リストに指定された変数がすべて未定義になります。

9. INQUIRE ステートメントを実行すると、変数 NAME=、RECL=、NEXTREC=、および POS= が未定義になる場合があります。

10. ある文字記憶単位が未定義になると、それに関連するすべての文字記憶単位が未定義になります。

数値記憶単位が未定義になると、関連したすべての数値記憶単位は未定義になります。ただし、関連した異なる型の数値記憶単位を定義したことにより、未定義になった場合を除きます (前述の(1) 参照)。

倍精度の実数型エンティティーが未定義になると、それに全体が関連している倍精度の実数型エンティティーがすべて未定義になります。

未指定の記憶単位が未定義になると、関連した未指定の記憶単位がすべて未定義になります。

11. プロシージャーに対する参照は、実引数の一部がステートメント・ラベルの値で定義されている場合、それに対応する仮引数の部分が未定義になります。

12. 割り振り可能エンティティーの割り振りが解除されると、そのエンティティーは未定義になります。デフォルトの初期化が定義されていない、サイズがゼロ以外のオブジェクトに対して ALLOCATE ステートメントが正常に実行されると、そのオブジェクトは未定義になります。

13. エラー条件が存在する場合に、INQUIRE ステートメントを実行すると、IOSTAT= または IOMSG= 指定子内 (これらの指定子がある場合) の変数を除いて、すべての照会指定子変数が未定義になります。

14. プロシージャーが呼び出されると、以下のように未定義になります。

a. 実引数に関連付けられていないオプションの仮引数は、未定義になります。

b. INTENT(OUT) を持つ非ポインター仮引数およびそれに関連した実引数は未定義になります。ただし、デフォルトの初期化が設定された非ポインター直接コンポーネントを除きます。

c. INTENT(OUT) を持つポインター仮引数およびそれに関連した実引数は、未定義の関連付け状況になります。

d. 実引数の対応するサブオブジェクトが未定義の場合には、仮引数のサブオブジェクトが未定義になります。

e. 関数結果変数は、未定義になります。ただし、関数結果変数が STATIC 属性で宣言され、かつ前回の呼び出しで定義されていた場合を除きます。

15. ポインターの関連付け状況が未定義になるか、解除されると、そのポインターは未定義になります。

28 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 55: IBM XL Fortran for Linux, V15.1

16. Fortran 95 で、FORALL ステートメントまたは構文の実行が完了すると、index-name は未定義になります。

17. RETURN または END ステートメントの実行により、ある変数が未定義になる場合、型が C_PTR の変数で、その値が、未定義になる変数の一部のC アドレスになっている場合、その変数は未定義になります。

18. TARGET 属性が設定された変数が割り振り解除になる場合、型が C_PTR の変数で、その値が、割り振り解除になる変数の一部の C アドレスになっている場合、その変数は未定義になります。

19. 変数が、PARALLEL、PARALLEL DO、DO、PARALLELSECTIONS、PARALLEL WORKSHARE、SECTIONS、または、SINGLE ディレクティブの PRIVATE または LASTPRIVATE 節のいずれかで指定されると、スレッドの最初の作成時に、その変数の新しいスレッドの各コピーが未定義になります。

20. TASK ディレクティブの PRIVATE 節で変数が指定されると、変数の各プライベート・コピーは、タスクが最初に生成されるときに未定義になります。

21. PARALLEL、PARALLEL DO、DO、PARALLEL SECTIONS、PARALLELWORKSHARE、SECTIONS、SINGLE または TASK ディレクティブのFIRSTPRIVATE 節で値が指定されると、新しい各スレッドが、マスター・スレッドの定義とその変数の関連付け状況を複写します。したがって、並列領域に入る時に変数のマスター・スレッドのコピーが未定義になっている場合は、その変数の新しいスレッドの各コピーも未定義になります。

22. INDEPENDENT ディレクティブの NEW 節で変数が指定されると、その変数は、その後の DO ループの反復の先頭にくるごとに未定義になります。

23. 非同期入力で変数が指定されると、その変数は未定義になり、対応する WAITステートメントが見つかるまで未定義のままになります。

24. THREADPRIVATE 共通ブロックまたは THREADPRIVATE 変数が COPYIN節で指定された場合、新しい各スレッドはマスター・スレッドの定義、割り振り、およびその変数の関連付け状況を複写します。したがって、並列領域に入る時に変数のマスター・スレッドのコピーが未定義になっている場合は、その変数の新しいスレッドの各コピーも未定義になります。

25. THREADPRIVATE 共通ブロック変数または THREADPRIVATE 変数に ALLOCATABLE 属性がある場合、作成される各コピーの割り振り状況は、割り振り済みではない、という状況になります。

26. THREADPRIVATE 共通ブロック変数または THREADPRIVATE 変数にPOINTER 属性があり、その初期関連付け状況が、デフォルトの初期化または明示的な初期化による関連解除である場合、各コピーの関連付け状況は、関連解除になります。そうでない場合、各コピーの関連付け状況は未定義です。

27. THREADPRIVATE 共通ブロック変数または THREADPRIVATE 変数にALLOCATABLE 属性も POINTER 属性も設定されておらず、その変数が、デフォルトの初期化または明示的な初期化によって当初定義されている場合、各コピーの定義は同じになります。そうでない場合、各コピーは未定義になります。

28. F2008 BLOCK 構文の実行が完了すると、以下のようになります。

a. BLOCK 構文の未保管のローカル変数が未定義となります。

第 2 章 XL Fortran 言語の基本要素 29

Page 56: IBM XL Fortran for Linux, V15.1

b. C_PTR 型の変数の値が、BLOCK 構文の未保管のローカル変数の C アドレスである場合、この変数が未定義となります。

F2008

29. VOLATILE 属性を持つオブジェクトは、プログラム内で未定義が指定されていない場合でも、未定義になることがあります。

変数の定義または未定義の構文コンテキスト以下のコンテキスト内での変数の指定は、変数の定義または未定義を暗黙に示します。

1. 代入ステートメントの変数。

2. NULLIFY ステートメント内の pointer_object

3. ポインター代入ステートメント内のデータ・ポインター・オブジェクトまたはプロシージャー・ポインター・オブジェクト

4. DO ステートメント内の DO 変数または暗黙 DO リストを含む入出力ステートメント

5. READ ステートメント内の入力項目

6. 名前リスト・グループ名が READ ステートメントの NML= 指定子に指定されている場合に、名前リスト・ステートメント内に名前がある変数。

7. WRITE ステートメント内の内部ファイル変数

8. 入出力ステートメント内の IOSTAT=、SIZE=、または IOMSG= 指定子

9. INQUIRE ステートメント内の指定子 (FILE=、ID=、および UNIT= を除く)

10. OPEN ステートメント内の NEWUNIT= 指定子

11. stat_variable、allocate_object、または errmsg_variable

12. 対応する仮引数に INTENT (OUT) または INTENT (INOUT) 属性がある場合に、明示的インターフェースを持つプロシージャーへの参照内の実引数

13. SELECT TYPE または ASSOCIATE 構文の関連名がいずれかの変数定義コンテキストに指定されている場合に、それらの構文のセレクターとなっている変数

割り振り状況割り振り可能オブジェクトの割り振り状況は、プログラム実行時に次のいずれかになります。

v 割り振られていない。これは、割り振り転送プロシージャーによりこの状況が設定された場合にはオブジェクトの割り振りが一度も行われたことがないことを示し、そうでない場合はオブジェクトに対して行われた最後の操作が割り振り解除であったことを示しています。

v 割り振り済み。これは、代入時の割り振りの場合、または割り振り転送プロシージャーによりこの状況が設定された場合、オブジェクトが ALLOCATE ステートメントによって割り振られたことを示しています。

v 未定義。これはオブジェクトが SAVE または STATIC 属性を持たず、RETURN または END ステートメントが実行されたが、アクセスされるべき有効範囲単位の実行がなく、割り振り済みであったことを示しています。XL

Fortran では、未定義状況は、-qxlf90=noautodealloc オプションを使用している場合に限って可能になります。

30 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 57: IBM XL Fortran for Linux, V15.1

割り振り可能オブジェクトの割り振り状況が、割り振り済みの状況である場合、そのオブジェクトを参照、または、定義することができます。割り振られていない割り振り可能オブジェクトを参照または定義することはできません。割り振り可能オブジェクトの割り振り状況が未定義の場合、そのオブジェクトに対して、参照、定義、割り振り、または割り振り解除を行うことはできません。

割り振り可能オブジェクトの割り振り状況が変更されると、それに応じて、関連した割り振り可能オブジェクトの割り振り状況も変更されます。割り振り可能変数を割り振ると、すべての関連した割り振り可能変数の据え置き型パラメーターの値が設定されます。

Fortran 標準では、モジュールの有効範囲で宣言されている割り振り可能オブジェクトの割り振り状況は、SAVE 属性がなく、RETURN または END ステートメントが実行されたが、そのモジュールを参照する有効範囲単位の実行がなかった場合に、割り振り済みであった場合、プロセッサーに依存します。

F2008 BLOCK 構文の未保管の割り振り可能ローカル変数は、実行が BLOCK 構文を終了すると、割り振りを解除されます。 F2008

XL Fortran では、そのようなオブジェクトの割り振り状況は、割り振り済みのままになります。

変数のストレージ・クラス (IBM 拡張)

注: このセクションは、変数のストレージについてのみ記載しています。名前付き定数およびそのサブオブジェクトのストレージ・クラスは、リテラル です。

基本ストレージ・クラスすべての変数は、基本的には、次の 5 つのストレージ・クラスのいずれかによって表されます。

Automaticプロシージャー内の変数のためのもので、プロシージャーが終了すれば以後は保持されません。変数はスタック・ストレージ域に常駐します。

Static プログラムが終了するまでメモリーを保持する変数のためのものです。変数はデータ・ストレージ域に常駐します。初期化されていない変数は、bss ストレージ域に常駐します。

Common共通ブロック変数のためのものです。共通ブロック変数が初期化されていれば、全ブロックがデータ・ストレージ域に常駐します。初期化されていない場合は、全ブロックが bss ストレージ域に常駐します。

controlled automatic自動オブジェクトのためのものです。変数はスタック・ストレージ域に常駐します。XL Fortran は、プロシージャーに入るときにストレージを割り振り、プロシージャーが完了すると、ストレージの割り振りを解除します。

第 2 章 XL Fortran 言語の基本要素 31

Page 58: IBM XL Fortran for Linux, V15.1

controlled割り振り可能オブジェクトのためのものです。変数はヒープ・ストレージ域に常駐します。このストレージは、明示的に割り振り、割り振り解除を行う必要があります。

2 次ストレージ・クラス以下のストレージ・クラスは、それ自体にストレージはありませんが、実行時に基本ストレージ・クラスに関連付けられます。

pointee対応する整数ポインターの値によって異なります。

Reference parameterこれは、デフォルトの引き渡し方式または %REF によって、対応する実引数がプロシージャーに渡される仮引数です。

Value parameterこれは、値によって対応する実引数がプロシージャーに渡される仮引数です。

引き渡し方式の詳細については、 221ページの『%VAL および %REF (IBM 拡張)』を参照してください。

ストレージ・クラスの割り当て変数名には、次のいずれかの方法によってストレージ・クラスが割り当てられます。

1. 明示的割り当て:

v 仮引数は、明示的なストレージ・クラス、reference parameter または value

parameter が割り当てられます。詳しくは、 221ページの『%VAL および%REF (IBM 拡張)』を参照してください。

v Pointee 変数には、明示的なストレージ・クラス、pointee が割り当てられます。

v STATIC 属性が明示的に指定された変数は、明示的なストレージ・クラス、static が割り当てられます。

v AUTOMATIC 属性が明示的に指定された変数は、明示的なストレージ・クラス、automatic が割り当てられます。

v COMMON ブロックに指定された変数は、明示的なストレージ・クラス、common が割り当てられます。

v SAVE 属性が明示的に指定された変数には、明示的なストレージ・クラス、static が割り当てられます。ただし、COMMON ステートメントにも同じ変数が指定されている場合は、ストレージ・クラス、common が割り当てられます。

v DATA ステートメントに指定された変数、または型宣言ステートメントで初期化された変数は、明示的ストレージ・クラス、static が割り当てられます。ただし、COMMON ステートメントにも同じ変数が指定されている場合は、ストレージ・クラス、common が割り当てられます。

v 文字型または派生型である関数結果変数には、明示的ストレージ・クラス、reference parameter が割り当てられます。

32 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 59: IBM XL Fortran for Linux, V15.1

v SAVE 属性または STATIC 属性のどちらもない関数結果変数には、明示的なストレージ・クラス、automatic が割り当てられます。

v 自動オブジェクトには、明示的ストレージ・クラス、controlled automatic が割り当てられます。

v 割り振り可能オブジェクトには、明示的ストレージ・クラス、controlled が割り当てられます。

上記のいずれにも該当しないが、明示的ストレージ・クラスが割り当てられる変数と EQUIVALENCE で関連付けられている変数は、その明示的ストレージ・クラスを継承します。

上記のいずれにも該当せず、明示的ストレージ・クラスが割り当てられる変数とEQUIVALENCE で関連付けられていない変数は、以下の条件を満たせば、明示的ストレージ・クラス static が割り当てられます。

v リストのない SAVE ステートメントが有効範囲単位に存在する

v 当該変数がメインプログラムの宣言部分で宣言されている

2. 暗黙的割り当て:

変数が明示的なストレージ・クラスを持たない場合、次のような暗黙的ストレージ・クラスが割り当てられます。

v 変数名の先頭が、IMPLICIT STATIC ステートメントに指定される英字、ドル記号、下線のいずれかになっている変数は、ストレージ・クラス、static が割り当てられます。

v 変数名の先頭が、IMPLICIT AUTOMATIC ステートメントに指定される英字、ドル記号、下線のいずれかになっている変数は、ストレージ・クラス、automatic が割り当てられます。

有効範囲単位内で、英字、ドル記号、下線のいずれも IMPLICIT STATIC または IMPLICIT AUTOMATIC ステートメントに指定されていない場合、暗黙的ストレージ・クラスはホストと同じになります。

モジュール F2008 またはサブモジュール F2008 の宣言部分で宣言された変数は、static ストレージ・クラスに関連付けられます。

上記のいずれにも該当しないが、暗黙的ストレージ・クラスが割り当てられる変数と EQUIVALENCE で関連付けられている変数は、その暗黙的ストレージ・クラスを継承します。

3. デフォルトの割り当て:

それ以外の変数は、すべて以下のデフォルトのストレージ・クラスが割り当てられます。

v -qsave=all コンパイラー・オプションを指定する場合は、static となります。

v 派生型の変数にデフォルトの初期化が指定されている場合は static になり、そうでない場合、-qsave=defaultinit コンパイラー・オプションが指定されていれば、automatic になります。

v -qnosave コンパイラー・オプションを指定する場合は、automatic となります。これがデフォルト設定です。

第 2 章 XL Fortran 言語の基本要素 33

Page 60: IBM XL Fortran for Linux, V15.1

呼び出しコマンドに関するデフォルト設定値の詳細については、「XL Fortran

コンパイラー・リファレンス」の『-qsave オプション』を参照してください。

型なしのリテラル定数XL Fortran では、型なし定数には組み込み型はありません。 16 進数、8 進数、2

進数、およびホレリス定数は、組み込みリテラル定数が使用される場合であれば、型宣言ステートメントでの長さ指定を除き (ただし、型なし定数は、CHARACTER型宣言の type_param_value には使用できます)、どのような状況においても使用できます。 16 進、8 進、2 進の各定数で認識される桁数は、その定数が使用されるコンテキストによって異なります。

16 進定数16 進定数の形式は、次のとおりです。

hexadecimal_number

数字 (0-9) および文字 (A-F、a-f ) で構成されるストリングです。対応する大文字と小文字は等価です。

16 進定数の Znn...nn という形式は、スラッシュで区切られたデータ初期化値としてのみ使用できます。この形式の 16 進定数が、PARAMETER 属性で事前に定義した定数の名前と同じストリングである場合、XL Fortran は、そのストリングを名前付き定数として認識します。

2x 個の 16 進数が存在する場合、x バイトで表されます。

例Z'0123456789ABCDEF'Z"FEDCBA9876543210"Z'0123456789aBcDeF'Z0123456789aBcDeF ! This form can only be used as an initialization value

関連情報

XL Fortran での定数の解釈については、 36ページの『型なし定数の使用方法』を参照してください。

8 進定数8 進定数の形式は、次のとおりです。

�� X ' hexadecimal_number 'Z " hexadecimal_number "' hexadecimal_number ' X" hexadecimal_number " Z

Z hexadecimal_number

��

34 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 61: IBM XL Fortran for Linux, V15.1

octal_number

数字 (0-7) で構成されるストリングです。

8 進数の 1 桁は 3 ビットで、データ・オブジェクトは 8 ビットの倍数なので、8

進定数のビット数がデータ・オブジェクトに必要なビット数よりも大きくなる場合があります。例えば、INTEGER(2) データ・オブジェクトは、左端の数字が 0 または 1 の場合、 6 桁の 8 進定数で表すことができ、INTEGER(4) データ・オブジェクトは、左端の数字が 0、 1、2、または、3 の場合、11 桁の定数で表すことができます。また、 INTEGER(8) は、左端の数字が 0 または 1 の場合、22 桁の定数で表すことができます。

例O'01234567'"01234567"O

関連情報

XL Fortran での定数の解釈については、 36ページの『型なし定数の使用方法』を参照してください。

2 進定数2 進定数の形式は、次のとおりです。

binary_number

0 と 1 の数字で構成されるストリングです。

8x 個の 2 進数が存在する場合、x バイトで表されます。

例B"10101010"'10101010'B

関連情報

XL Fortran での定数の解釈については、 36ページの『型なし定数の使用方法』を参照してください。

�� O ' octal_number '" octal_number "

' octal_number ' O" octal_number "

��

�� B ' binary_number '" binary_number "

' binary_number ' B" binary_number "

��

第 2 章 XL Fortran 言語の基本要素 35

Page 62: IBM XL Fortran for Linux, V15.1

ホレリス定数ホレリス定数の形式は、次のとおりです。

ホレリス定数は、プロセッサーで表示可能な空ではない文字ストリングに、その前に nH をつけた形で構成されます。ここでは、n は、H の後に続く文字数を示す符号なしの正の整数です。 n には、kind 型パラメーターを指定することはできません。ストリング中の文字数は、 1 文字から 255 文字までになります。

注: nH を指定し、n 個未満の文字を n の後に指定すると、入力行を右マージンまで拡張するために使用されるブランクがホレリス定数の一部と見なされます。ホレリス定数は、継続行で継続することができます。ホレリス定数の場合、少なくともn 個の文字が使用できる必要があります。

XL Fortran では、-qnoescape コンパイラー・オプションが指定されていない限り、ホレリス定数内のエスケープ・シーケンスも認識されます。ホレリス定数にエスケープ・シーケンスが含まれている場合、 n は、ソース・ストリング内の文字数ではなく、そのストリングの内部表記での文字数を示します。 (例えば、2H¥"¥" は、2

つの二重引用符を示すホレリス定数を表します。)

XL Fortran は、文字定数、ホレリス定数、H 編集記述子、文字ストリング編集記述子、およびコメントの中のマルチバイト文字をサポートします。このサポートは、-qmbcs オプションによって提供されます。マルチバイト文字を含む定数を、ストリング全体を保持するのに十分大きくない変数に代入すると、マルチバイト文字内で切り捨てが行われることがあります。

Unicode 文字およびファイル名もサポートされます。環境変数 LANG がUNIVERSAL に設定され、-qmbcs コンパイラー・オプションが指定されている場合、コンパイラーは、Unicode の文字およびファイル名の読み取りおよび書き込みが可能です。

XL Fortran での定数の解釈については、『型なし定数の使用方法』を参照してください。

型なし定数の使用方法型なし定数のデータ型と長さは、その型なし定数を使用するコンテキストによって決まります。XL Fortran では、それらの定数を使用し、コンテキストが明確になるまで、データ型および長さの変換は行いません。

v -qctyplss コンパイラー・オプションを指定してプログラムをコンパイルすると、文字定数式は、ホレリス定数に適用される規則に従います。

v 型なし定数は、組み込みデータ型のうちの 1 つだけをとります。

v 型なし定数を算術単項演算子または論理単項演算子と併用すると、その定数には、デフォルトの整数型が設定されます。

v 型なし定数を算術 2 項演算子、論理 2 項演算子または 2 項関係演算子と併用すると、定数はもう一方のオペランドのデータ型と同じデータ型になります。両方

�� n H character_string ��

36 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 63: IBM XL Fortran for Linux, V15.1

のオペランドが型なし定数の場合、関係演算子の両方のオペランドがホレリス定数でない限り、オペランドのデータ型はデフォルトの整数型になります。両方のオペランドがともにホレリス定数の場合は、どちらも文字データ型になります。

v 型なし定数を連結演算で使用すると、定数のデータ型は文字データ型となります。

v 型なし定数を式の代入ステートメントの右辺に使用すると、定数の型は、左辺の変数の型になります。

v 型なし定数を、特定のデータ型が要求されるコンテキストで使用すると、定数のデータ型は、その特定のデータ型になります。

v 型なし定数を、DATA ステートメント、STATIC ステートメント、または型宣言ステートメントの初期値として、あるいは PARAMETER ステートメントの名前付き定数の定数値として使用するとき、また型なし定数を文字以外の型のデータとして扱うときは、次の規則が適用されます。

– 16 進定数、8 進定数、または 2 進定数が想定された長さより短い場合、XL

Fortran は左側にゼロを追加します。想定されている長さより長い場合、コンパイラーは左側を切り捨てます。

– ホレリス定数が想定された長さより短い場合、コンパイラーは右側にブランクを追加します。想定されている長さより長い場合、コンパイラーは右側を切り捨てます。

– 型なし定数が、長さを継承した文字データ型で名前付き定数の値を指定している場合、名前付き定数の長さは、型なし定数で指定したバイト数と等しくなります。

v 型なし定数を文字型のオブジェクトとして扱う場合 (DATA、STATIC、型宣言、またはコンポーネント定義ステートメントの初期値として使用する場合は除く)、その長さは、型なし定数で表されたバイト数によって決まります。

v 型なし定数を複素定数の一部として使用すると、定数のデータ型は複素定数のもう一方の部分のデータ型になります。両方の部分とも型なし定数である場合には、定数のデータ型は、両方の型なし定数を表現するのに十分な長さを持つ実数データ型になります。

v 型なし定数を実引数として使用する場合、対応する仮引数の型は、組み込みデータ型になります。この仮引数は、プロシージャー、ポインター、配列、派生型のオブジェクト、または代替戻り指定子であってはなりません。

v 型なし定数を実引数として使用し、かつ次の事項がすべて該当する場合:

– プロシージャーが総称組み込みプロシージャーを参照している

– すべての引数が型なし定数である

– 総称プロシージャー名と同じ名前の特定の組み込みプロシージャーが存在する

以上の条件が満たされる場合、総称名の参照は、その特定プロシージャーによって解決されます。

v 型なし定数を実引数として使用し、かつ次の事項がすべて該当する場合:

– プロシージャーが総称組み込みプロシージャーを参照している

– すべての引数が型なし定数である

– 総称プロシージャー名と同じ名前の特定の組み込みプロシージャーが存在しない

第 2 章 XL Fortran 言語の基本要素 37

Page 64: IBM XL Fortran for Linux, V15.1

以上の条件が満たされる場合、型なし定数はデフォルトの整数に変換されます。特定の組み込み関数が、整数引数をとる場合、参照はその特定関数によって解決されます。特定の組み込み関数が存在しない場合は、参照は総称関数によって解決されます。

v 型なし定数を実引数として使用し、かつ次の事項がすべて該当する場合:

– プロシージャーが総称組み込みプロシージャーを参照している

– 型なし定数ではない別の引数が指定されている

以上の条件が満たされる場合、型なし定数はその引数の型になります。ただし、コンパイラー・オプション -qport=typlssarg を指定した場合は、実引数はデフォルトの整数に変換されます。選択された特定の組み込みプロシージャーは、その型が基になります。

v 型なし定数を実引数として使用し、かつプロシージャー名を総称名として設定しているが、組み込みプロシージャーではない場合、総称プロシージャーの参照は、1 つの特定プロシージャーに解決されなければなりません。定数のデータ型は、その特定プロシージャーの対応する仮引数のデータ型になります。例 2 を参照してください。

v 型なし定数を実引数として使用し、かつプロシージャー名を特定名としてのみ設定する場合、定数のデータ型は、対応する仮引数のデータ型となります。

v 型なし定数を実引数として使用し、かつ次の事項がすべて該当する場合:

– プロシージャー名が総称名または特定名のどちらとしても設定されていない

– 定数が参照によって渡された

上記の条件が満たされた場合、その定数は、ホレリス定数でない限り、デフォルトの整数サイズとなりますが、データ型は設定されません。ホレリス定数を渡すためのデフォルトでは、文字の実引数と同様になります。ただし、コンパイラー・オプション -qctyplss=arg を使用すると、ホレリス定数は整数実引数である場合と同様に渡されます。プロシージャー名を総称名または特定名として設定する方法に関する詳細は、 232ページの『プロシージャー参照の解決』を参照してください。

v 型なし定数を実引数として使用し、かつ次の事項がすべて該当する場合:

– プロシージャー名が総称名または特定名のどちらとしても設定されていない

– 定数が値によって渡された

上記の条件が満たされた場合、定数は 16 進定数、2 進定数、および 8 進定数のデフォルト整数の場合と同様に渡されます。

定数がホレリス定数で、かつデフォルト整数のサイズ未満の場合、XL Fortran は右側にブランクを追加します。定数がホレリス定数で、サイズが 8 バイトより大きい場合、XL Fortran は、右端のホレリス文字を切り捨てます。プロシージャー名を総称名または特定名として設定する方法に関する詳細は、 232ページの『プロシージャー参照の解決』を参照してください。

v 型なし定数をその他のコンテキストで使用すると、定数のデータ型は、デフォルトの整数型となります。この場合、ホレリス定数は例外となります。ホレリス定数を次の状況で使用した場合、データ型は文字データ型となります。

– H 編集記述子

– 関係演算で両方のオペランドがホレリス定数

38 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 65: IBM XL Fortran for Linux, V15.1

– 入出力リスト

v 型なし定数をデフォルトの整数として扱おうとしたものの、その値をデフォルト整数の値の範囲内で表現できない場合、その定数は、表現可能な種類にプロモートされます。

v kind 型パラメーターは、-qintlog がオンの場合でも論理定数と置き換えることができず、 -qctyplss がオンの場合でも文字定数で置き換えることができません。また、型なし定数にすることもできません。

例 1

INT=B'1' ! Binary constant is default integerRL4=X'1' ! Hexadecimal constant is default realINT=INT + O'1' ! Octal constant is default integerRL4=INT + B'1' ! Binary constant is default integerINT=RL4 + Z'1' ! Hexadecimal constant is default realARRAY(O'1')=1.0 ! Octal constant is default integer

LOGICAL(8) LOG8LOG8=B'1' ! Binary constant is LOGICAL(8), LOG8 is .TRUE.

例 2

INTERFACE SUBSUBROUTINE SUB1( A )

REAL AEND SUBROUTINESUBROUTINE SUB2( A, B )

REAL A, BEND SUBROUTINESUBROUTINE SUB3( I )

INTEGER IEND SUBROUTINE

END INTERFACECALL SUB('C0600000'X, '40066666'X) ! Resolves to SUB2

CALL SUB('00000000'X) ! Invalid - ambiguous, may! resolve to either SUB1 or SUB3

第 2 章 XL Fortran 言語の基本要素 39

Page 66: IBM XL Fortran for Linux, V15.1

40 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 67: IBM XL Fortran for Linux, V15.1

第 3 章 組み込みデータ型

組み込み型とその演算は、事前定義されており、常にアクセスできます。組み込みデータ型には、数値と非数値の 2 つのクラスがあり、それぞれのクラスにいくつかの型があります。

表 10. 組み込み型

数値組み込み型 非数値組み込み型

整数 論理演算子

実数 文字演算子

複素数 ベクトル �1�

バイト �1� バイト �1�

注:

�1� IBM 拡張

XL Fortran では、派生型もサポートしています。この派生型は、組み込みと派生データ型のどちらのデータ型も入れることができる複合データ型です。

整数

IBM 拡張

次の整数値の範囲 表は、XL Fortran で、整数データ型を使用して表すことのできる値の範囲を示しています。

表 11. 整数値の範囲

kind パラメーター 値の範囲

1 -128 から 127 まで

2 -32,768 から 32,767 まで

4 -2,147,483,648 から 2,147,483,647 まで

8 -9,223,372,036,854,775,808 から 9,223,372,036,854,775,807 まで

XL Fortran では、デフォルトの kind 型パラメーターを 4 に設定します。 kind 型パラメーターは、整数値のバイト・サイズに相当します。-qintsize コンパイラー・オプションを使用すれば、デフォルトの整数サイズを 2、4、8 バイトのいずれかに変更できます。 -qintsize オプションは、デフォルトの論理サイズに対しても同様に作用しますので注意してください。

IBM 拡張 の終り

整数の型指定子は、INTEGER キーワードがなければなりません。

符号付き整数のリテラル定数の形式は、次のとおりです。

© Copyright IBM Corp. 1996, 2015 41

Page 68: IBM XL Fortran for Linux, V15.1

kind_param

数字ストリング またはスカラー整数定数名 のいずれかです。

符号付き整数のリテラル定数は、任意指定の符号、次に小数点の付かない整数を表す 10 進数のストリング、さらに必要に応じて kind 型パラメーターの順になります。符号付き整数リテラル定数は、正、ゼロ、負のいずれかになります。符号なしでゼロでない場合、その定数は正とみなされます。

kind_param を指定する場合、リテラル定数の大きさはその kind_param で許される値の範囲内で表現可能なものでなければなりません。

IBM 拡張

XL Fortran では、kind_param が指定されておらず、しかも定数の大きさをデフォルトの整数では表せない場合には、その定数は表現可能な種類にプロモートされます。

XL Fortran では、内部的に 2 の補数表記で整数を表します。左端のビットがその数の符号になります。

IBM 拡張 の終り

整数定数の例

0 ! has default integer size-173_2 ! 2-byte constant9223372036854775807 ! Kind type parameter is promoted to 8

実数

IBM 拡張

次の表は、XL Fortran が、実数データ型で表すことのできる値の範囲を示しています。

kind パラメーター

ゼロ以外の近似絶対最小値 近似絶対最大値 近似精度 (10 進数)

4 1.175494E-38 3.402823E+38 7

8 2.225074D-308 1.797693D+308 15

16 2.225074Q-308 1.797693Q+308 31

XL Fortran では、デフォルトの kind 型パラメーターを 4 に設定します。 kind 型パラメーターは、実数値のバイト・サイズに相当します。-qrealsize コンパイラー・

��+-

� digit_ kind_param

��

42 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 69: IBM XL Fortran for Linux, V15.1

オプションを使用すれば、デフォルトの実数サイズを 4 または 8 バイトに変更できます。 -qrealsize オプションは、デフォルトの複素数サイズにも影響しますので注意してください。

XL Fortran は、REAL(4) および REAL(8) の数を内部的には ANSI/IEEE の 2 進浮動小数点形式で表します。この形式は、符号ビット (s)、偏向指数 (e)、および小数部 (f) から構成されています。 REAL(16) 表示は、REAL(8) 形式に基づいています。

REAL(4)Bit no. 0....|....1....|....2....|....3.

seeeeeeeefffffffffffffffffffffff

REAL(8)Bit no. 0....|....1....|....2....|....3....|....4....|....5....|....6...

seeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffff

REAL(16)Bit no. 0....|....1....|....2....|....3....|....4....|....5....|....6...

seeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffffBit no. .|....7....|....8....|....9....|....0....|....1....|....2....|..

seeeeeeeeeeeffffffffffffffffffffffffffffffffffffffffffffffffffff

また、この ANSI/IEEE 2 進浮動小数点形式では、プラス無限大、マイナス無限大、非数値 (NaN)(not-a-number) も値として表すことができます。NaN は、さらに、静止 NaN と信号 NaN に分類することができます。NaN 値の内部表記に関する詳細については、『XL Fortran 浮動小数点処理の実装の詳細』を参照してください。

組み込み RANGE の定義は、INT(MIN(LOG10(HUGE(X)), -LOG10(TINY(X)))) です。

REAL(8) 数の場合、HUGE 組み込み関数は 0x7FEFFFFFFFFFFFFF を返し、 TINY組み込み関数は 0x0010000000000000 を返します。したがって、INT(MIN(308.254715559916747, 307.652655568588784)) となり、範囲は 307 ということになります。 LOG スケールでは、指数の両側が対称的にはなりません。

IBM の REAL(16) 数形式は、重なり合わない異なる大きさの 2 つの REAL(8) 数で構成されています。これは、REAL(8) では、2 進の指数が、少なくとも小数部のビット数分、相違が出ることを示しています。

REAL(16) の場合、RANGE 組み込み関数は、両方の REAL(8) 数を正規化した数の範囲を返します。したがって、REAL(16) 数の場合、HUGE 組み込み関数は0x7FEFFFFFFFFFFFFF7C9FFFFFFFFFFFFF を返し、TINY 組み込み関数は0x03600000000000000000000000000000 を返します。この結果、INT(MIN(308.25471555991674389886862819788120,

291.69806579839777816211298898803388)) となり、範囲は 291 ということになります。

308 が、REAL(8) または REAL(16) の数値で表現できる最小または最大の指数です。

IBM 拡張 の終り

実数型指定子には、REAL キーワードか DOUBLE PRECISION キーワードがなければなりません。DOUBLE PRECISION 値の精度はデフォルトの実数値の 2 倍で

第 3 章 組み込みデータ型 43

Page 70: IBM XL Fortran for Linux, V15.1

す。実数型のエンティティーの宣言に関する詳細については、 496ページの『REAL』 および 381ページの『DOUBLE PRECISION』を参照してください。

実リテラル定数の形式は、次のとおりです。

v 基本実定数の後に、オプションとして、kind 型パラメーターが続く。

v 基本実定数の後に、指数と、オプションとして kind 型パラメーターが続く。

v 整定数 (kind_param を指定しない) の後に、指数と、オプションとして kind 型パラメーターが続く。

基本実定数は、オプションの符号、整数部、小数点、および小数部の順になっています。整数部と小数部はどちらも数字ストリングです。これらのいずれか一方を省略することはできますが、両方を省略することはできません。定数の近似値を出すため、XL Fortran が使用する桁数よりも多い桁数を使って基本実定数を書くこともできます。 XL Fortran では、基本実定数は 10 進数として解釈されます。

実定数の形式は、次のとおりです。

exponent

kind_param

数字ストリング またはスカラー整数定数名 のいずれかです。

�� �

digit exponent+-

digit .+ exponent-

digit

. digit+ exponent-

digit

�_ kind_param

��

�� EDQ

digit_string+-

��

44 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 71: IBM XL Fortran for Linux, V15.1

digit_string は、10 の累乗を示します。E は、デフォルトの実定数の型を指定します。ただし、kind_param も併せて指定した場合は、デフォルト型がオーバーライドされます。 D は、デフォルトの DOUBLE PRECISION 型の定数を指定します。

XL Fortran では、Q は、REAL(16) 型の定数を示します。

exponent および kind_param が共に指定された場合は、指数文字は E になります。D または Q が指定された場合、kind_param を指定することはできません。

指数および kind 型パラメーターが指定されない実リテラル定数は、デフォルトの実定数型です。

実定数の例

+0.

+5.432E02_16 !543.2 in 16-byte representation

7.E3

3.4Q-301! Extended-precision constant

複素数複素数型指定子は、次のキーワードのいずれかがなければなりません。v COMPLEX キーワードv DOUBLE COMPLEX キーワード

複素数型のエンティティーの宣言に関する詳細については、 354ページの『COMPLEX』 および 378ページの『DOUBLE COMPLEX (IBM 拡張)』を参照してください。

IBM 拡張

次の表では、複素数型の指定子に COMPLEX キーワードが指定されている場合の、対応する kind 型パラメーターおよび長さ指定の値を示しています。

kind 型パラメーター i

COMPLEX(i)

長さ指定 j

COMPLEX*j

4

8

16

8

16

32

XL Fortran では、kind 型パラメーターにより複素数エンティティーの各部分の精度が指定され、長さ指定により複素数エンティティーの全体の長さが指定されます。

IBM 拡張 の終り

複素定数の種類は、実数部分と虚数部分の定数の種類によって決まります。

DOUBLE COMPLEX 値の精度はデフォルトの複素数値の 2 倍です。

第 3 章 組み込みデータ型 45

Page 72: IBM XL Fortran for Linux, V15.1

複素数型のスカラー値は、複素数コンストラクターを使って構成することができます。複素数コンストラクターの形式は、次のとおりです。

複素数のリテラル定数は、それぞれの式が一対の定数式となっている複素数コンストラクターです。複素数コンストラクターの各部分で、変数と式を XL Fortran 拡張機能として使用できます。

Fortran 95 では、複素数コンストラクターの各部分に使用できるのは、単精度符号付き整数または実リテラル定数だけです。Fortran 2003 では、名前付き定数も使用できます。 F2008

Fortran 2008 では、複素数部指定子を使用して、複素数エンティティーの実数部と虚数部に直接アクセスできます。複素数部指定子の型は実数型であり、kind と形状は複素数部セレクターの左側に示される指定子のものとなります。複素数部セレクターは、%RE または %IM です。%RE は複素数エンティティーの実数部を選択し、%IM は複素数エンティティーの虚数部を選択します。複素数部指定子の構文を以下に示します。designator には複素数型の値を指定する必要があります。

複素数部指定子は、実数データ型の規則に従います。さらに、複素数部指定子は、代入ステートメント内で変数として使用できます。つまり、x が複素数型である場合、x%IM=0.0 は x の虚数部をゼロに設定します。 F2008

リテラル定数の両方の部分とも実数型である場合、リテラル定数の kind 型パラメーターは精度の高い方の kind パラメーターを使用し、精度の低い方の kind 型パラメーターは高い方の精度に変換されます。

両方の部分とも整数型である場合、それらはデフォルトの実数型に変換されます。一方が整数型で、もう一方が実数型である場合、整数型の方が、実数部分の精度の実数型に変換されます。

複素数型のエンティティーの宣言に関する詳細については、 354ページの『COMPLEX』 および 378ページの『DOUBLE COMPLEX (IBM 拡張)』を参照してください。

複素数の各部分は、内部的には、同じ kind 型パラメーターの実数と同じ表記になります。

複素定数の例

(3_2,-1.86) ! Integer constant 3 is converted to default real! for constant 3.0.

�� ( expression , expression ) ��

�� designator % IMRE

��

46 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 73: IBM XL Fortran for Linux, V15.1

(45Q6,6D45) ! The imaginary part is converted to extended! precision 6.Q45.

(1+1,2+2) ! Use of constant expressions. Both parts are! converted to default real.

複素数部指定子の例

COMPLEX :: x, y, zprint *, x%RE ! Prints the same value as REAL(x)print *, y%IM ! Prints the same value as AIMAG(y)z%IM = 0.0 ! Sets the imaginary part of z to zero

論理演算子

IBM 拡張

次の表は、XL Fortran が、論理データ型を使用して表すことのできる値を示しています。

kind パラメーター 値 内部表記 (16 進)

1.TRUE.

.FALSE.

01

00

2.TRUE.

.FALSE.

0001

0000

4.TRUE.

.FALSE.

00000001

00000000

8.TRUE.

.FALSE.

0000000000000001

0000000000000000

注: .TRUE. に対する 1、および.FALSE. に対する 0 以外の内部表記は未定義です。

XL Fortran では、デフォルトの kind 型パラメーターを 4 に設定します。 kind 型パラメーターは、論理値のバイト・サイズに相当します。-qintsize コンパイラー・オプションを使用すれば、デフォルトの論理サイズを 2、4、8 バイトのいずれかに変更できます。 -qintsize オプションは、デフォルトの整数サイズに対しても同様に作用しますので注意してください。 -qintlog を使用すれば、式およびステートメントで整数と論理のデータ・エンティティーを混在させることができます。

-qport=clogicals オプションを使用すると、ゼロ以外の整数が論理式で使用された場合、これらをすべて TRUE とみなすようにコンパイラーに指示することができます。-qport=clogicals オプションを使用する場合は、-qintlog オプションも併せて指定する必要があります。

IBM 拡張 の終り

第 3 章 組み込みデータ型 47

Page 74: IBM XL Fortran for Linux, V15.1

論理型指定子には、LOGICAL キーワードがなければなりません。論理型のエンティティーの宣言に関する詳細については、 452ページの『LOGICAL』を参照してください。

論理型のリテラル定数の形式は、次のとおりです。

kind_param

数字ストリング またはスカラー整数定数名 のいずれかです。

論理定数は、真または偽のいずれかの論理値をとることができます。

.TRUE. および .FALSE. の代わりに、それぞれ省略形の T および F (ピリオドなし) を使用することもできます。ただし、この省略形は、定様式入力で使用する場合、あるいは DATA ステートメント、STATIC ステートメント、または、型宣言ステートメントの初期値として使用する場合に限られます。kind 型パラメーターについては、省略形を指定することはできません。T または F が、名前付き定数として定義された場合は、それは論理リテラル定数ではなく名前付き定数として処理されます。

論理定数の例

.FALSE._4.TRUE.

文字演算子文字の型指定子には、CHARACTER キーワードがなければなりません。文字型のエンティティーの宣言に関する詳細については、 341ページの『CHARACTER』を参照してください。

文字型のリテラル定数の形式は、次のとおりです。

kind_param

数字ストリング またはスカラー整数定数名 のいずれかです。

XL Fortran では、ASCII の照合シーケンスを表すため、kind 型パラメーター値、1 をサポートしています。

文字型のリテラル定数は、二重引用符またはアポストロフィのいずれかによって区切ることができます。

�� .TRUE..FALSE. _ kind_param

��

��kind_param _

' character_string '" character_string "

��

48 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 75: IBM XL Fortran for Linux, V15.1

character_string を構成する文字は、XL Fortran で表現可能ならどのような文字でもかまいません。ただし、改行文字は、ソース行の終わりを表す文字として解釈されるので使用できません。区切り文字となるアポストロフィ (') や二重引用符 (")

は、その文字定数によって表されるデータには含まれません。一方、これらの区切り文字の間にブランクを入れた場合、そのブランクは有効な文字と解釈されます。

ストリングをアポストロフィによって区切る場合、ストリング中でアポストロフィを表すには、間にブランクを入れずにアポストロフィを 2 つ続けて使用します。ストリングを二重引用符によって区切る場合、ストリング中で二重引用符を表すには、同様に間にブランクを入れずに二重引用符を 2 つ続けて使用します。この場合、2 つの連続するアポストロフィまたは二重引用符は、1 文字として扱われます。

アポストロフィで囲んだ文字タイプのリテラル定数内に二重引用符を入れて、二重引用符を表すことができます。また、二重引用符で囲んだ文字定数内にアポストロフィを入れて、1 つのアポストロフィを表すこともできます。

文字タイプのリテラル定数の長さは、区切り文字の間の文字数です。ただし連続する一対のアポストロフィや二重引用符は、1 文字としてカウントされます。

長さがゼロの文字オブジェクトは、ストレージを使用しません。

XL Fortran では、1 文字オブジェクトが 1 バイトのストレージを必要とします。

C 言語での使用法との整合性を確保するために、 XL Fortran では、文字ストリング内で次のエスケープ・シーケンスを認識します。

エスケープ 意味

¥b バックスペース

¥f 用紙送り

¥n 改行

¥r 改行

¥t タブ

¥0 Null

¥'アポストロフィ

(ストリングは終了しません)

¥"二重引用符

(ストリングは終了しません)

¥¥ バックスラッシュ

¥x x。x は任意の文字を示します。

C コンパイラーとの互換性確保のために、プロシージャー参照内のスカラー文字定数式がヌル文字 (¥0) で終わるようにするためには、-qnullterm コンパイラー・オプションを使用してください (詳しい説明および例外については、「XL Fortran コンパイラー・リファレンス」の『-qnullterm オプション』を参照してください)。

第 3 章 組み込みデータ型 49

Page 76: IBM XL Fortran for Linux, V15.1

エスケープ・シーケンスは、すべて 1 文字を表します。

これらのエスケープ・シーケンスを単一の文字として扱いたくない場合は、-qnoescape コンパイラー・オプションを指定してください。(「XL Fortran コンパイラー・リファレンス」の『-qescape オプション』を参照してください。) バックスラッシュ (円記号 (¥)) が特別な意味を持たなくなります。

文字型のリテラル定数の最大長は、ステートメントに使用できる文字の最大数によって決まります。

-qctyplss コンパイラー・オプションを指定した場合、文字定数式はホレリス定数として扱われます。ホレリス定数については、 36ページの『ホレリス定数』を参照してください。 -qctyplss コンパイラー・オプションについては、「XL

Fortran コンパイラー・リファレンス」の『-qctyplss オプション』を参照してください。

XL Fortran では、-qmbcs コンパイラー・オプションによって、文字型のリテラル定数、ホレリス定数、H 編集記述子、文字ストリング編集記述子、およびコメント内でのマルチバイト文字をサポートします。

Unicode 文字およびファイル名もサポートされます。環境変数 LANG がUNIVERSAL に設定され、-qmbcs コンパイラー・オプションが指定されている場合、コンパイラーは、Unicode の文字およびファイル名の読み取りおよび書き込みが可能です。 詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

文字定数の例

例 1:

'' ! Zero-length character constant.

例 2:

1_"ABCDEFGHIJ" ! Character constant of length 10, with kind 1.

例 3:

'¥"¥2¥'¥A567¥¥¥¥¥'' ! Character constant of length 10 "2'A567¥¥'.

文字サブストリング文字サブストリングとは、文字ストリング (親ストリングと呼ばれる) に隣接する部分のスカラー変数名、スカラー定数、スカラー構造体コンポーネント、または配列エレメントのことです。文字サブストリングは、次の形式のサブストリング参照によって指定されます。

50 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 77: IBM XL Fortran for Linux, V15.1

int_expr1 および int_expr2

それぞれサブストリングの左端および右端の文字位置を示します。どちらの式もスカラー整数式で、サブストリング式と呼ばれます。

文字サブストリングの長さは、式 MAX(int_expr2 - int_expr1 + 1,0) を計算した結果になります。

int_expr1 が int_expr2 以下の場合、その値は次の条件を満たしていなければなりません。

v 1 ≤ int_expr1 ≤ int_expr2 ≤ length

length は、親ストリングの長さです。int_expr1 が省略されると、デフォルト値は1 になります。int_expr2 が省略されると、デフォルト値は length になります。

FORTRAN 77 では、長さが 0 の文字サブストリングは許可されません。Fortran 90 以上では、これらのサブストリングを許可します。FORTRAN 77 の規則に従って、サブストリング境界に関するコンパイル時チェックを実行するには、-qnozerosize コンパイラー・オプションを使用してください。Fortran 90 に対する準拠をチェックする場合は、-qzerosize を使用します。サブストリング境界について実行時のチェックを行うには、-qcheck オプションと -qzerosize (または、-qnozerosize) オプションの両方を使用します。 (詳細については、「XL Fortran コンパイラー・リファレンス」を参照してください。)

配列セクションのサブストリングの扱いはこれとは異なります。 104ページの『サブストリングの範囲』を参照してください。

例CHARACTER(8) ABC, X, Y, ZABC = 'ABCDEFGHIJKL'(1:8) ! Substring of a constant

X = ABC(3:5) ! X = 'CDE'Y = ABC(-1:6) ! Not allowed in either FORTRAN 77 or Fortran 90

Z = ABC(6:-1) ! Z = '' valid only in Fortran 90

バイト (IBM 拡張)XL Fortran では、タイプでは、バイト型の指定子は BYTE キーワードです。バイト型のエンティティーの宣言に関する詳細については、 333ページの『BYTE (IBM

拡張)』を参照してください。

BYTE 組み込みデータ型は、独自のリテラル定数形式を持っていません。BYTE データ・オブジェクトは、その使用によって、INTEGER(1)、LOGICAL(1)、または、CHARACTER(1) データ・オブジェクトとして処理されます。

�� scalar_variable_namearray_elementscalar_constantscalar_struct_comp

( : )int_expr1 int_expr2

��

第 3 章 組み込みデータ型 51

Page 78: IBM XL Fortran for Linux, V15.1

ベクトル (IBM 拡張)型宣言ステートメント内で、VECTOR キーワードを使用して宣言するエンティティーは、ベクトル型になります。あるエンティティーと別のエンティティーの両方が、同じ型と種類のエレメントを持つベクトルの場合、どちらも同じベクトル型になります。そうでない場合、2 つのエンティティーの型は異なります。定様式 I/O

にベクトル・オブジェクトを入れることはできません。

ベクトルの型は、以下のいずれかになります。

v PIXEL ベクトル

v エレメントに 1、2、4、または 8 の kind 型パラメーターが設定されたINTEGER ベクトル

v エレメントに 1、2、4、または 8 の kind 型パラメーターが設定されたUNSIGNED ベクトル

v エレメントに kind 型パラメーター 4 または 8 が設定された REAL ベクトル

注: VMX または VSX 命令セット拡張に対応するアーキテクチャーを -qarch オプションに指定した場合にのみ、ベクトルを宣言する必要があります。INTEGER(8)、UNSIGNED(8)、および REAL(8) 型には、VSX 命令セット拡張に対応するアーキテクチャーが必要です。

ベクトルは、常に 16 バイト・エンティティーです。

v INTEGER(1) または UNSIGNED(1) ベクトルには、16 個のエレメントが含まれます。

v INTEGER(2)、UNSIGNED(2)、または PIXEL ベクトルには 8 個のエレメントが含まれます。

v INTEGER(4)、UNSIGNED(4)、または REAL(4) ベクトルには 4 個のエレメントが含まれます。

v INTEGER(8)、UNSIGNED(8)、または REAL(8) ベクトルには 2 個のエレメントが含まれます。

kind 型のパラメーターが、INTEGER、または UNSIGNED ベクトルのエレメントに対して指定されていない場合、エレメントはデフォルトの整数 kind を持ちます。kind 型パラメーターが REAL ベクトルのエレメントに対して指定されていない場合、エレメントはデフォルトの実数 kind を持ちます。

ベクトルは、16 バイト境界に調整されなければなりません。XL Fortran は、ベクトルを自動的に 16 バイト境界に調整します。ただし、以下の場合を除きます。

v ベクトルが順序型またはレコード構造のコンポーネントである場合。

v ベクトルが BIND 属性を持つ派生型のコンポーネントであり、-qalign=bindc=packed または -qalign=bindc=bit_packed オプションでコンパイルする場合。この場合、ベクトルは 1 バイト境界に調整されます。

v ベクトルが共通ブロックのメンバーである場合。

v ベクトルが 16 バイト境界に位置合わせされていない共通ブロックのメンバーと記憶列結合されている場合。

v ベクトルが 16 バイト境界に位置合わせされていない配列エレメントと記憶列結合されている場合。

52 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 79: IBM XL Fortran for Linux, V15.1

次のベクトルの言語間相互運用 表は、ベクトルを XL C/C++ と XL Fortran との間で受け渡す時に、対応する XL C/C++ ベクトルの型を判別する場合に利用してください。

表 12. ベクトルの言語間相互運用

XL Fortran のベクトル型 XL C/C++ のベクトル型

VECTOR(INTEGER(1)) vector signed char

VECTOR(INTEGER(2)) vector signed short

VECTOR(INTEGER(4)) vector signed int、vector signed long

VECTOR(INTEGER(8)) vector signed long long

VECTOR(PIXEL) vector pixel

VECTOR(REAL(4)) vector float

VECTOR(REAL(8)) vector double

VECTOR(UNSIGNED(1)) vector unsigned char

VECTOR(UNSIGNED(2)) vector unsigned short

VECTOR(UNSIGNED(4)) vector unsigned int、vector unsigned long

VECTOR(UNSIGNED(8)) vector unsigned long long

ピクセル (IBM 拡張)PIXEL キーワードは、ピクセル型を指定します。ピクセルは、コンパイラーが 4

つの部分で解釈する、 2 バイトのエンティティーです。最初の部分は 1 ビットです。後の部分は、それぞれ 5 ビットで構成されます。また、ピクセル・リテラルはサポートされません。ピクセルの指定は、ベクトル宣言 の一部として指定する場合に限られます。

Unsigned (IBM 拡張)UNSIGNED キーワードは、符号なし整数型を指定します。-qintsize コンパイラー・オプションを使用すれば、デフォルトの整数サイズを 2 または 4 バイトのいずれかに変更できます。デフォルトの kind 型パラメーターは 4 です。符号なし整数リテラルは、サポートされません。符号なし整数型の指定は、ベクトル宣言 の一部として指定する場合に限られます。

第 3 章 組み込みデータ型 53

Page 80: IBM XL Fortran for Linux, V15.1

54 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 81: IBM XL Fortran for Linux, V15.1

第 4 章 派生型

派生型は、組み込みと派生データ型のどちらのデータ型も入れることができる複合データ型です。型定義を使用することで、派生型を定義できます。この定義では、派生型の名前、その型パラメーター、コンポーネント、およびプロシージャーを指定します。Fortran 95 の場合、型定義には、少なくとも 1 つのコンポーネントを入れなければならず、プロシージャーは入れることができません。Fortran 2003 の場合、型定義にゼロ個以上のコンポーネント、プロシージャー、および型パラメーターを入れることができます。派生型内部では、型パラメーター、コンポーネント、およびプロシージャーの名前は固有でなければなりませんが、派生型定義の有効範囲外の名前とは同じにすることができます。

Fortran 2003 の場合、派生型は型パラメーターでパラメーター化することができます。各型パラメーターは、kind 型パラメーターまたは length 型パラメーターのいずれかになるように定義します。また、型パラメーターごとにデフォルト値を指定することができます。詳しくは、 56ページの『派生型パラメーター (Fortran 2003)』を参照してください。

派生型の構文

DERIVED_TYPE_statement

構文の詳細については、 369ページの『派生型』を参照してください。

type_param_def_block

DERIVED_TYPE_statement 内に存在するすべての type_param_names に対する宣言から構成されます。詳しくは、『派生型パラメーター』を参照してください。

private_components_stmt

派生型コンポーネントのデフォルトのアクセス可能度がプライベートであることを指定します。特定の派生型に対して指定できるのは、1 つの

�� DERIVED_TYPE_statementtype_param_def_block

�private_components_stmtSEQUENCE

component_def_stmt_block�

�type_bound_procedure_block

END_TYPE_statement ��

ここで、private_components_stmt は以下のとおりです。

�� PRIVATE ��

© Copyright IBM Corp. 1996, 2015 55

Page 82: IBM XL Fortran for Linux, V15.1

private_components_stmt のみです。private_components_stmt を指定できるのは、型定義がモジュールの宣言部分内にある場合のみです。

SEQUENCESEQUENCE ステートメントを指定できるのは、1 つだけです。詳しくは、509ページの『SEQUENCE』を参照してください。

component_def_stmt_block

component_def_stmt_block は、1 つ以上の型宣言ステートメントまたはプロシージャー・コンポーネント宣言ステートメントから構成され、派生型のコンポーネントを定義します。 component_def_stmt_block 内の型宣言ステートメントが指定できる属性には、 ALLOCATABLE 、 F2008

CONTIGUOUS F2008 、 371ページの『DIMENSION』、POINTER、 478

ページの『PRIVATE』、および 486ページの『PUBLIC』 の各属性があります。詳しくは、 526ページの『型宣言』および 60ページの『プロシージャー・ポインター・コンポーネント』を参照してください。

Fortran 2003

type_bound_procedure_block

1 つの 358ページの『CONTAINS』 ステートメントと、オプションでそれに続く 1 つの BINDING_PRIVATE_stmt ステートメント、および 1 つ以上のプロシージャー・バインディング・ステートメントで構成されます。BINDING_PRIVATE_stmt は、派生型バインディングのデフォルト・アクセス可能度がプライベートであること、および特定の派生型に対して 1 つのBINDING_PRIVATE_stmt バインディング・ステートメントしか指定できないことを示します。BINDING_PRIVATE_stmt について詳しくは、 68ページの『型制約プロシージャーの構文』を参照してください。

Fortran 2003 の終り

END_TYPE_statementオプションで、TYPE ステートメントで指定したものと同じ type_name を入れます。詳しくは、 394ページの『END TYPE』を参照してください。

派生型パラメーター (Fortran 2003)DERIVED_TYPE_statement が type_param_names を持っている場合、またはその上位の型から型パラメーターを継承している場合、派生型はパラメーター化されます。この派生型に対して、型パラメーターを定義できます。

型パラメーター定義の構文

�� INTEGER , KIND :: type_param_decl_listkind_selector LEN

��

56 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 83: IBM XL Fortran for Linux, V15.1

kind_selectorkind 型パラメーターの整数型を指定します。構文についての詳細は、『INTEGER ステートメント』の kind_selector に関するセクションを参照してください。

type_param_decl

type_param_decl 内の各 type_param_name は、DERIVED_TYPE_statement 内に指定されている type_param_name パラメーターのいずれかと一致する必要があります。DERIVED_TYPE_statement 内の各 type_param_name は、派生型定義内のtype_param_decl で 1 回指定する必要があります。

派生型パラメーターは、次のパラメーターのいずれかです。

v KIND 指定子で宣言されている場合は、kind 型パラメーターです。

v LEN 指定子で宣言されている場合は、length 型パラメーターです。

派生型定義の宣言式では、派生型パラメーターを 1 次式として使用することができます。派生型定義の定数式では、kind 型パラメーターを 1 次式として使用することができます。

type_param_decl に scalar_int_initialization_expr が指定されている場合、型パラメーターには、その式が示すデフォルト値が存在します。

TYPE general_point (k, dim)INTEGER, KIND :: k = selected_real_kind(6,70)INTEGER, LEN :: dim

REAL(k) :: coordinates(dim)END TYPE general_point

型パラメーターの順序パラメーター化された派生型の型パラメーターの順序になります。これは、型パラメーター名のキーワードを使用しない派生型の指定子 (『型宣言』を参照) の場合に使用されます。

型が拡張型でない場合、その型パラメーターの順序は、DERIVED_TYPE_statement 内の型パラメーター・リストの順序になります。拡張型の型パラメーターの順序は、親の型の型パラメーターが並んだ後に、追加の型パラメーターが DERIVED_TYPE_statement 内の型パラメーター・リストの順序に従って並ぶ形になります。

派生型コンポーネント派生型のコンポーネントは、任意の組み込み型にすることができ、以前に定義した派生型でもかまいません。派生型のコンポーネントは、直接コンポーネントまたは最終コンポーネントのいずれかにすることができます。

�� type_param_name= scalar_int_initialization_expr

��

第 4 章 派生型 57

Page 84: IBM XL Fortran for Linux, V15.1

派生型の直接コンポーネントは、以下のいずれかの条件を満たすコンポーネントです。

v その派生型のコンポーネント

v ALLOCATABLE 属性も POINTER 属性も持たない派生型コンポーネントの直接コンポーネント

最終コンポーネントは、以下の 3 つの条件のいずれかを満たすコンポーネントです。

v 組み込みデータ型のコンポーネント。

v ALLOCATABLE または POINTER 属性が設定されているコンポーネント。

v 派生型コンポーネントの最終コンポーネントであり、 ALLOCATABLE属性および POINTER 属性のどちらも持たない。

派生型の定義の各非割り振り可能コンポーネントに対して、デフォルトの初期化を指定することができます。割り振り可能コンポーネントは常に、割り振り解除の状態に初期化されます。

単一の型宣言ステートメント内や単一のプロシージャー・コンポーネント宣言ステートメント内で、同じ属性が複数回登場してはなりません。

コンポーネントに対して ALLOCATABLE および POINTER のどちらの属性も指定しない場合、そのコンポーネントは、組み込み型であるか事前に定義された派生型である必要があります。

配列コンポーネントに対して ALLOCATABLE およびPOINTER のどちらの属性も指定しない場合、その配列の境界を次元ごとに明示的に指定する必要があります。各境界は、宣言関数または次の組み込み関数への参照を含まない式にする必要があります。ALLOCATED、ASSOCIATED、EX-TENDSTYPE OF、PRESENT、または SAME TYPE AS。各宣言照会参照は、値が変数値に依存しない定数式です。

コンポーネントを定義する際、型パラメーターの値は、コロンであるか、宣言関数への参照または組み込み関数 ALLOCATED、ASSO-CIATED、EXTENDS TYPEOF、PRESENT、または SAME TYPE AS への参照が含まれない式である必要があります。各宣言照会参照は、値が変数値に依存しない定数式です。

派生型のコンポーネントは、オブジェクトのいずれかの最終コンポーネントが I/O

ステートメントの有効範囲単位でアクセスできない場合、 ユーザー定義のI/O プロシージャーで派生型オブジェクトを処理しない限り、 I/O リスト項目として指定することはできません。 派生型オブジェクトは、ポインターまたは割り振り可能であるコンポーネントを持っている場合、 ユーザー定義の入出力プロシージャーでオブジェクトを処理しない限り、 データ転送ステートメント内に指定することはできません。

58 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 85: IBM XL Fortran for Linux, V15.1

割り振り可能コンポーネントおよびポインター・コンポーネントコンポーネントは、それに ALLOCATABLE 属性がある場合は割り振り可能です。POINTER 属性があれば、そのコンポーネントはポインターになります。コンポーネントには ALLOCATABLE 属性と POINTER 属性を両方とも指定することはできません。

ポインター・コンポーネントは、データ・ポインターにもプロシージャー・ポインターにもすることができます。データ・ポインター・コンポーネントの型は、そのコンポーネントを含む型と同じであってもかまいません。

割り振り可能コンポーネントは、ポインター・コンポーネントと同様、最終コンポーネントとして定義されます。その理由は、値 (存在する場合) が構造体の残りとは別個に保管され、構造体の作成時には (オブジェクトが割り振り解除されているために) このストレージが存在しないからです。ポインター・コンポーネントと同様、割り振り可能コンポーネントを含む変数は、その変数がユーザー定義の派生型入出力プロシージャーによって処理される場合を除き、入出力リストに直接入れることは禁じられています。

割り振り可能配列もそうですが、割り振り可能コンポーネントはストレージ関連付けコンテキストを禁じられています。このため、ポインターまたは割り振り可能コンポーネントを含む変数を、COMMON または EQUIVALENCE には入れることができません。ただし、 SEQUENCE 型には割り振り可能コンポーネントが許可されており、これによって、同じ型を複数の有効範囲単位に別個に定義することができます。

文字型または派生型のコンポーネントに ALLOCATABLE または POINTER 属性がある場合、それは長さを据え置くことができます。

例MODULE REAL_POLYNOMIAL_MODULE

TYPE REAL_POLYNOMIALREAL, ALLOCATABLE :: COEFF(:)

END TYPEINTERFACE OPERATOR(+)

MODULE PROCEDURE RP_ADD_RP, RP_ADD_REND INTERFACE

CONTAINSFUNCTION RP_ADD_R(P1,R)

TYPE(REAL_POLYNOMIAL) RP_ADD_R, P1REAL RINTENT(IN) P1,RALLOCATE(RP_ADD_R%COEFF(SIZE(P1%COEFF)))RP_ADD_R%COEFF = P1%COEFFRP_ADD_R%COEFF(1) = P1%COEFF(1) + R

END FUNCTIONFUNCTION RP_ADD_RP(P1,P2)

TYPE(REAL_POLYNOMIAL) RP_ADD_RP, P1, P2INTENT(IN) P1, P2INTEGER MALLOCATE(RP_ADD_RP%COEFF(MAX(SIZE(P1%COEFF), SIZE(P2%COEFF))))M = MIN(SIZE(P1%COEFF), SIZE(P2%COEFF))RP_ADD_RP%COEFF(:M) = P1%COEFF(:M) + P2%COEFF(:M)IF (SIZE(P1%COEFF)>M) THEN

RP_ADD_RP%COEFF(M+1:) = P1%COEFF(M+1:)ELSE IF (SIZE(P2%COEFF)>M) THEN

RP_ADD_RP%COEFF(M+1:) = P2%COEFF(M+1:)END IF

第 4 章 派生型 59

Page 86: IBM XL Fortran for Linux, V15.1

END FUNCTIONEND MODULE

PROGRAM EXAMPLEUSE REAL_POLYNOMIAL_MODULETYPE(REAL_POLYNOMIAL) P, Q, RP = REAL_POLYNOMIAL((/4,2,1/)) ! Set P to (X**2+2X+4)Q = REAL_POLYNOMIAL((/1,1/)) ! Set Q to (X+1)R = P + Q ! Polynomial additionPRINT *, 'Coefficients are: ', R%COEFF

END

関連情報v 『プロシージャー・ポインター・コンポーネント』

プロシージャー・ポインター・コンポーネントプロシージャー・ポインター・コンポーネントの構文

procedure_interface

declaration_type_spec または明示的インターフェースを持つプロシージャーの名前です。詳しくは、 526ページの『型宣言』を参照してください。

procedure_interface が declaration_type_spec であり、指定された型がパラメーター化された派生型である場合、使用されるすべてのパラメーターはコンパイル時に既知である必要があります。

procedure_component_attr_spec_list

以下に示す属性を指定します。

v POINTER

v PASS

v NOPASS

v access_spec

procedure_entity_name

宣言されているプロシージャー・ポインターの名前です。

null_init

NULL 組み込み関数への参照です。

PASS 属性は、型制約プロシージャーまたはプロシージャー・ポインター・コンポーネントのオブジェクト受け渡し仮引数を定義します。NOPASS が指定されると、プロシージャーにはオブジェクト受け渡し仮引数は設定されません。

PASS と NOPASS の両方を同じ procedure_component_attr_spec_list 節に指定することはできません。

�� PROCEDURE ( )procedure_interface ::

, procedure_component_attr_spec_list ::

� procedure_entity_name=> null_init

��

60 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 87: IBM XL Fortran for Linux, V15.1

プロシージャー・ポインター・コンポーネントに暗黙的なインターフェースがあるか、引数がない場合は、 NOPASS を指定します。

PASS(arg-name) が指定された場合、インターフェースには、arg-name という名前の仮引数が設定され、これがオブジェクト受け渡し仮引数になります。

オブジェクト受け渡し仮引数は、ポインターであってはならず、割り振り不可でなければなりません。さらに、そのすべての length 型パラメーターが設定される必要があります。

PASS、NOPASS のいずれも指定されないか、または、PASS に arg-name が指定されない場合、最初の仮引数が、オブジェクト受け渡し仮引数になります。

各 procedure_component_attr_spec_list には POINTER を指定する必要があります。

関連情報v 208ページの『プロシージャー・ポインター (Fortran 2003)』

v 70ページの『オブジェクト受け渡し仮引数』

配列のコンポーネント派生型コンポーネントは、配列にできます。詳しくは、 99ページの『配列セクション』、 104ページの『配列セクションと構造体コンポーネント』、 86ページの『配列宣言子』、および 526ページの『型宣言』を参照してください。

非ポインター、割り振り不可の配列コンポーネントは、定数の次元宣言子または型パラメーターの設定が可能な宣言式で宣言することができます。

注: ポインターおよび割り振り可能配列コンポーネントは、deferred_shape_spec_list

配列宣言で宣言しなければなりません。詳しくは、 91ページの『据え置き形状配列』を参照してください。

F2008 CONTIGUOUS 属性が指定されている場合、コンポーネントは POINTER属性を持つ配列である必要があります。 F2008

コンポーネントのデフォルト初期化割り振り可能コンポーネントに対してデフォルトの初期化を指定することはできません。割り振り可能コンポーネントは常に、割り振り解除の状態に初期化されます。

非ポインター・コンポーネントに対するデフォルトの初期化は、等号の後ろに定数式を付けるか、または、initial_value_list をスラッシュで囲むことによって指定できます。initial_value_list をスラッシュで囲む方法は、標準の派生型宣言内のコンポーネント、またはレコード構造内のコンポーネントに対して使用できます。

ポインター・コンポーネントに対するデフォルトの初期化には、矢印 (=>) に続けて、引数のない NULL 組み込みの参照を使用します。デフォルトの初期化は、派生型のゼロ以上のコンポーネントに対して指定することができますが、すべてのコンポーネントに指定する必要はありません。

第 4 章 派生型 61

Page 88: IBM XL Fortran for Linux, V15.1

データ・オブジェクトは、その型のいずれかの直接コンポーネントが初期化される場合は、デフォルトの初期化を持ちます。 そのようなオブジェクトをポインティング先にすることはできません。ポインティング先について詳しくは、 474

ページの『POINTER (integer) (IBM 拡張)』を参照してください。

非ポインター・コンポーネントがデフォルトの初期化を持つ型である場合、コンポーネントに対して指定されたデフォルトの初期化により、その型のコンポーネントに対して指定されたデフォルトの初期化がオーバーライドされます。

共通ブロック内の、デフォルトの初期化を持つオブジェクトは、IBM 拡張として使用できます。

明示的初期化とは異なり、SAVE 属性はデフォルトの初期化によって暗黙指定されることはありません。 また、-qsave=defaultinit オプションを指定すると、デフォルトの初期化で SAVE 属性が暗黙指定されます。

ストレージが関連付けられた記憶単位にデフォルトの初期化がある場合、デフォルトの初期化を提供するオブジェクトまたはサブオブジェクトは、すべて同じ型、型パラメーター、および境界でなければならず、その記憶単位に対して同じ値を提供しなければなりません。

直接コンポーネントは、型定義内で対応するコンポーネント定義に対してデフォルトの初期化を指定していれば、そのコンポーネントのアクセス可能度に関係なく、初期値を受け取ることになります。

デフォルトの初期化の対象となる可能性があるデータ・オブジェクトの場合、その非ポインター・コンポーネントは、初期時には未定義であるか、または対応するデフォルトの初期化式によって定義されます。デフォルトの初期化があるそのポインター・コンポーネントの関連付け状況は関連付け解除になっており、他のすべてのポインター・コンポーネントの関連付け状況は未定義です。

デフォルトの初期化を持つ変数に静的ストレージ・クラスがある場合、アプリケーションの実行時にその変数のデフォルトの初期化が行われます。

関数の結果の変数、INTENT(OUT) 仮引数、または SAVE 属性がないローカル変数にデフォルトの初期化がある場合、その変数の宣言を含むプロシージャーの実行時にデフォルトの初期化が行われます。

コンポーネントにデフォルトの初期化を持つオブジェクトを割り振ると、そのコンポーネントは次のようになります。

v コンポーネントが非ポインターの場合、定義済みになる

v コンポーネントがポインターの場合、関連解除される

ENTRY ステートメントが設定されたサブプログラムでは、デフォルトの初期化は、 ENTRY ステートメントが参照するプロシージャー名の引数リストにある仮引数に対してだけ実行されます。仮引数に OPTIONAL 属性がある場合、デフォルトの初期化は、この仮引数がある場合に限って実行されます。

デフォルトの初期化が指定された派生型のモジュール・データ・オブジェクトが、デフォルト初期化候補になるためには、SAVE 属性を指定する必要があります。

62 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 89: IBM XL Fortran for Linux, V15.1

コンポーネントの順序コンポーネントの順序は、親でない派生型コンポーネントのシーケンスが、リスト指示および名前リストで形式設定された入出力に属する場合のそのシーケンスの順序、およびコンポーネント・キーワードを使用しない構造体コンストラクターのシーケンスの順序になります。

型が拡張型でない場合、そのコンポーネント順序は、派生型定義でのコンポーネントの宣言順になります。 拡張型 のコンポーネント順序は、その親の型、そして、その後に追加コンポーネントが拡張派生型定義での宣言順で続きます。

コンポーネントの参照特定の構造体コンポーネントは、コンポーネント指定子 を使用して参照することができます。スカラーのコンポーネント指定子の構文は、次のとおりです。

scalar_struct_comp:

name 派生型のオブジェクトの名前です。

comp_name

派生型コンポーネントの名前です。

int_expr

添え字式と呼ばれるスカラー整数または実数式です。

separator

「%」または 「.」 で示される区切り文字です。

構造体コンポーネントは、右端の comp_name と同じ型、型パラメーター、およびPOINTER 属性 (ある場合) を持ちます。また、親オブジェクトに INTENT、TARGET、および PARAMETER 属性があれば、これらを継承します。

注:

v それぞれの comp_name は、直前の name または comp_name の宣言型のコンポーネントでなければなりません。

v name、および右端を除く各 comp_name は、派生型でなければなりません。

v int_expr_list 内の添え字式の数は、先行する name または comp_name のランクと等しくなっていなければなりません。

v name はデータ・オブジェクトの名前でなければなりません。

�� name( int_expr_list )

� � separator comp_name( int_expr_list )

��

第 4 章 派生型 63

Page 90: IBM XL Fortran for Linux, V15.1

v name または最大で 1 つの comp_name のみが、非ゼロのランクを持つことができます。 name または comp_name が非ゼロのランクを持つ場合、右側のcomp_name は ALLOCATABLE または POINTER 属性を持つことはできません。

v 構造体コンポーネントのランクは、非ゼロランクがあればそれを持つ comp_name

の名前のランクです。それ以外の場合、ランクはゼロです。

v 右端の comp_name の宣言型が抽象型である場合、構造体コンポーネントはポリモアフィックでなければなりません。

名前リストのフォーマット設定では、区切り文字は % 記号でなければなりません。

式に、区切り文字としてピリオドを使用する構造体コンポーネント、または 2 項演算のいずれかに解釈される可能性がある形式があり、その名前の演算子が有効範囲単位内でアクセス可能な場合、 XL Fortran ではその式を 2 項演算として処理します。そのような解釈が望ましくない場合、 % 記号を使用してその部分への参照を解除するか、または、自由ソース形式であれば、ピリオドと comp_name との間に空白を挿入してください。

例 1: ピリオドを区切り文字としてあいまいな使い方をしている場合

MODULE MODSTRUCTURE /S1/

STRUCTURE /S2/ BLUEINTEGER I

END STRUCTUREEND STRUCTUREINTERFACE OPERATOR(.BLUE.)

MODULE PROCEDURE BLUEEND INTERFACE

CONTAINSINTEGER FUNCTION BLUE(R1, I)

RECORD /S1/ R1INTENT(IN) :: R1INTEGER, INTENT(IN) :: IBLUE = R1%BLUE%I + I

END FUNCTION BLUEEND MODULE MOD

PROGRAM PUSE MODRECORD /S1/ R1R1%BLUE%I = 17I = 13PRINT *, R1.BLUE.I ! Calls BLUE(R1,I) - prints 30PRINT *, R1%BLUE%I ! Prints 17

END PROGRAM P

例 2: 区切り文字の混合使用

STRUCTURE /S1/INTEGER I

END STRUCTURESTRUCTURE /S2/

RECORD /S1/ CEND STRUCTURERECORD /S2/ R

64 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 91: IBM XL Fortran for Linux, V15.1

R.C%I = 17 ! OKR%C.I = 3 ! OKR.C.I = 19 ! OKEND

例 3: 派生型に対するパーセントとピリオドの機能

STRUCTURE /S/INTEGER I, J

END STRUCTURETYPE DT

INTEGER I, JEND TYPE DTRECORD /S/ R1TYPE(DT) :: R2R1.I = 17; R1%J = 13R2.I = 19; R2%J = 11END

コンポーネントおよびプロシージャーのアクセス可能度派生型コンポーネントのデフォルトのアクセス可能度は、PUBLIC です。PRIVATE コンポーネント・ステートメントを使用すると、このデフォルトのアクセス可能度がプライベートに変更されます。

派生型の各コンポーネントに PRIVATE 属性または PUBLIC 属性を使用すると、デフォルトのアクセス可能性をオーバーライドできます。コンポーネントがプライベートである場合、そのコンポーネント名は、派生型自体がパブリックである場合も含め、派生型定義を含むモジュールによる場合に限ってアクセス可能になります。

Fortran 2003

プロシージャー・バインディングのデフォルトのアクセス可能度は、PUBLIC です。 BINDING_PRIVATE_stmt を使用すると、このデフォルトのアクセス可能度がプライベートに変更されます。プロシージャー・バインディングに PRIVATE またはPUBLIC 属性を使用すれば、デフォルトのアクセス可能度をオーバーライドできます。プロシージャー・バインディングがプライベートである場合、そのプロシージャー・バインディングは、派生型自体がパブリックである場合も含め、定義するモジュール内に限ってアクセス可能になります。

Fortran 2003 の終り

順序派生型デフォルトでは、派生型コンポーネントの定義順序によって、記憶順序が暗黙指定されることはありません。ただし、SEQUENCE ステートメントを指定すると、その派生型は、順序派生型となります。順序派生型では、その派生型のオブジェクトの記憶順序が、コンポーネントの順序によって指定されます。順序派生型のコンポーネントが派生型である場合、その派生型も順序派生型でなければなりません。

第 4 章 派生型 65

Page 92: IBM XL Fortran for Linux, V15.1

重要:

順序派生型を使用すると、データの並びが揃わなくなることがあります。これは、アプリケーションのパフォーマンスに悪影響を与える場合があります。使用に際しては、十分注意してください。

拡張可能派生型 (Fortran 2003)

拡張可能な型は、新たな型を拡張できる非順序、相互処理不可の派生型です。拡張可能な型は、レコード構造構文を使用して定義することはできません。拡張可能な型は、以下の 1 つ以上の型にさらに分類することができます。

基本型 それ自体の拡張は行いますが、別の型の拡張は行いません。

拡張型 それ自体の拡張だけでなく、その親の型が拡張となっているすべての型を拡張します。

親の型 その型から拡張するすべての型に対して、コンポーネントとプロシージャー・バインディングを提供します。親の型は、拡張型が派生される拡張可能な型です。

拡張型は、EXTENDS 属性で定義します。EXTENDS 属性指定には、親の型の名前が含まれます。 EXTENDS 属性の指定に関する詳細は、 369ページの『派生型』を参照してください。

拡張型は、その親の型から、すべての型パラメーター、コンポーネント、およびオーバーライドされておらず最終的でないプロシージャー・バインディングを継承します。

また、拡張型は、親の型からアクセス不能のコンポーネントおよびバインディングも継承します。それらは、拡張型の中でもアクセス不能のままです。プライベート・エンティティーは、拡張する型が参照結合でアクセスされる場合、アクセス不能になります。

基本型は、型パラメーター、コンポーネント、およびバインディングを持つ必要はありません。拡張型は、親の型を超える数の型パラメーター、コンポーネント、およびバインディングを持つ必要はありません。

型の場合は、その型または親によって定義された可能性のある型パラメーターを使用する必要はありません。

拡張型は、親の型と同じ型および型パラメーターのスカラーで、非ポインター、割り振り不可の親コンポーネントを持ちます。このコンポーネントの名前は、親の型の名前と同一で、アクセス可能度も同じ設定になります。

拡張型に宣言する型パラメーターまたはコンポーネントは、親の型の型パラメーターまたはコンポーネントと同じ名前にすることはできません。

拡張型の例TYPE :: POINT ! A base type

REAL :: X, YEND TYPE POINT

66 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 93: IBM XL Fortran for Linux, V15.1

TYPE, EXTENDS(POINT) :: COLOR_POINT ! An extension of TYPE(POINT)INTEGER :: COLOR ! Components X and Y, and component name

END TYPE COLOR_POINT ! POINT, inherited from parent

この例で、型 COLOR_POINT は、親の型 POINT から、コンポーネント X および Y

を継承します。これらのコンポーネントは、親の型で持っていたすべての属性をそのまま保持します。追加のコンポーネントおよびプロシージャー・バインディングを拡張型の派生型定義で宣言することができます。拡張可能な型の上記の例では、型 COLOR_POINT に、追加コンポーネント、COLOR が 1 つ設定されています。型POINT は、非順序型で、別の型の拡張にはなっておらず、したがって、基本型です。型 COLOR_POINT は拡張型で、その親の型は POINT となっています。

COLOR_POINT には、親コンポーネント POINT があります。親コンポーネント、POINT は、コンポーネント X および Y を持つ構造体です。この親のコンポーネントは、親の型から継承された対応するコンポーネントに関連付けられた継承です。ある型の上位コンポーネントとは、その型の親コンポーネント、または親コンポーネントの上位コンポーネントです。COLOR_POINT の上位コンポーネントは、親コンポーネント、POINT です。

型パラメーターのコードの例については、 526ページの『型宣言』セクションを参照してください。

抽象型および据え置きバインディング (Fortran 2003)抽象型は、ABSTRACT 属性が設定された型です。ポリモアフィックでないオブジェクトは、抽象型で宣言することはできません。

DEFERRED 属性を持つバインディングは、据え置きバインディングと呼ばれます。据え置きバインディングは、プロシージャーの実装を型の拡張に合わせて遅らせます。この据え置きバインディングは、抽象型定義でのみ指定することができます。動的型のポリモアフィック・オブジェクトは、抽象型にすることはできません。したがって、据え置きバインディングを呼び出すことはできません。抽象型の拡張は、その拡張が据え置きバインディングを含んでいないまたは継承していない場合は、抽象にする必要はありません。

型定義に据え置きバインディングが含まれるか、または継承する場合、ABSTRACT属性を指定する必要があります。ABSTRACT を指定する場合、その型は拡張可能でなければなりません。

抽象型の例

TYPE, ABSTRACT :: FILE_HANDLECONTAINSPROCEDURE(OPEN_FILE), DEFERRED, PASS(HANDLE) :: OPEN...

END TYPE

INTERFACESUBROUTINE OPEN_FILE(HANDLE)IMPORT FILE_HANDLE

CLASS(FILE_HANDLE), INTENT(IN):: HANDLEEND SUBROUTINE OPEN_FILEEND INTERFACE

第 4 章 派生型 67

Page 94: IBM XL Fortran for Linux, V15.1

派生型の値特定の派生型の値のセットは、そのコンポーネントのコンポーネント値の可能なすべてのシーケンスで構成されます。次の表は、さまざまなタイプのコンポーネントのコンポーネント値の一覧を示しています。

表 13. コンポーネント値

コンポーネント コンポーネント値

ポインター ポインター関連付け

割り振り解除された割り振り可能な 割り振り状況

割り振り済みの割り振り可能オブジェクト 割り振り状況、動的型および型パラメーター、境界、および値

非ポインター、割り振り不可のコンポーネント

型制約プロシージャー (Fortran 2003)派生型定義のプロシージャー部分では、特定のプロシージャー、総称インターフェース、および最終サブルーチンを特定の型にバインドできます。

型制約プロシージャーの構文派生型定義における型制約プロシージャー部分の構文は、次のとおりです。

CONTAINS詳しくは、 358ページの『CONTAINS』を参照してください。

BINDING_PRIVATE_stmt

BINDING_PRIVATE_stmt を指定できるのは、型定義がモジュールの宣言部分内にある場合のみです。

specific_binding

プロシージャーを該当する型にバインドします。あるいは、抽象型の場合、据え置きバインディングを指定します。 69ページの『特定バインディング』を参照してください。

generic_binding

総称インターフェースを定義します。 71ページの『総称バインディング』を参照してください。

�� CONTAINSBINDING_PRIVATE_stmt

� specific_bindinggeneric_bindingfinal_binding

��

ここで、BINDING_PRIVATE_stmt は以下のとおりです。

�� PRIVATE ��

68 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 95: IBM XL Fortran for Linux, V15.1

final_binding

最終サブルーチンのリストを定義します。 73ページの『最終バインディング』を参照してください。

プロシージャーは、型定義の有効範囲内でバインディング名を指定するか、総称バインディングの場合は、演算子によって指定できます。バインディング名は、型名のプロシージャー名で、特定の型のコンポーネントと同様の方法で参照されます。特定バインディングの場合、この名前は、binding_name になります。総称指定がgeneric_name となっている総称バインディングの場合、この名前は generic_name

になります。最終バインディング、または、総称指定が generic_name でない総称バインディングの場合、バインディング名は設定されません。

特定バインディングspecific_binding の構文

特定バインディングの構文は、次のとおりです。

interface_name

型制約プロシージャーのインターフェースを定義します。 interface_name

は、抽象インターフェースの名前、または明示的インターフェースを持つプロシージャーの名前になります。 interface_name を指定した場合は、procedure_name は指定してはなりません。このインターフェース名は、バインディングに DEFERRED 属性がある場合に限って指定できます。

attribute

バインディングには、1 つ以上の属性を設定でき、それらはバインディング属性と呼ばれます。同一のバインディングに対して、同じバインディング属性を複数回指定することはできません。 attribute_list 内に指定できるバインディング属性のリストには、以下のような属性を指定できます。

PASS プロシージャーのオブジェクト受け渡し仮引数を定義します。

NOPASSプロシージャーにオブジェクト受け渡し仮引数が設定されないことを指定します。バインディングのインターフェースに、定義される

�� PROCEDURE( interface_name ) , attribute_list ::

::

� �

,(1)

binding_name=> procedure_name

��

注:

1 Fortran 2008

第 4 章 派生型 69

Page 96: IBM XL Fortran for Linux, V15.1

型の仮引数がない場合、NOPASS を使用してください。 PASS とNOPASS の両方を同一のバインディングに指定することはできません。

access_spec

PUBLIC または PRIVATE になります。

NON_OVERRIDABLE拡張型でバインディングがオーバーライドされないようにします。DEFERRED 属性が設定されたバインディングには、NON_OVERRIDABLE を指定してはなりません。

DEFERRED当該プロシージャーを据え置きとするマークが付けられます。据え置きバインディングを指定する必要があるのは、ABSTRACT 属性が設定された派生型定義に限られます。DEFERRED バインディング属性が設定されたプロシージャーには、interface_name を指定する必要があります。オーバーライドするバインディングにDEFERRED 属性を設定できるのは、それがオーバーライドするバインディングが据え置きバインディングの場合に限られます。NON_OVERRIDABLE と DEFERRED の両方のバインディング属性を同一のプロシージャーに指定することはできません。詳しくは、 67ページの『抽象型および据え置きバインディング (Fortran

2003)』と 75ページの『プロシージャーのオーバーライド』を参照してください。

binding_name

特定の型のバインディングの名前です。

procedure_name

型制約プロシージャーのインターフェースを定義します。 procedure_name

は、アクセス可能なモジュール・プロシージャーの名前、または、明示的インターフェースを持つ外部プロシージャーの名前になります。=>procedure_name も interface_name も指定されない場合、procedure_name

は binding_name と同じになります。=>procedure_name がある場合、二重コロンの区切り文字を指定し、interface_name は指定しないようにしてください。

オブジェクト受け渡し仮引数

オブジェクト受け渡し仮引数は、型制約プロシージャー、または、プロシージャー・ポインター・コンポーネントに適用されます。

v PASS (arg-name) を指定した場合、プロシージャー・ポインター・コンポーネントまたは名前付き型制約プロシージャーのインターフェースに arg-name と同じ名前の仮引数が設定されます。この場合、オブジェクト受け渡し仮引数は、その指定名の引数になります。

v PASS、NOPASS のいずれも指定しないか、arg-name を付けずに PASS を指定した場合、プロシージャー・ポインター・コンポーネントまたは型制約プロシージャーの最初の仮引数が、オブジェクト受け渡し仮引数になります。

オブジェクト受け渡し仮引数は、スカラー、非ポインター、割り振り不可のダミー・データ・オブジェクトで、定義される型と同じ宣言型でなければなりません。

70 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 97: IBM XL Fortran for Linux, V15.1

すべての length 型パラメーターを想定する必要があります。この仮引数は、定義される型が拡張可能である場合に限って、ポリモアフィックでなければなりません。

特定バインディングが設定された型制約プロシージャーの例では、型 POINT に特定バインディングが設定された型制約プロシージャーが含まれています。LENGTH が型制約プロシージャーで、 POINT_LENGTH がモジュール・プロシージャーの名前です。

特定バインディングが設定された型制約プロシージャーの例MODULE smapleTYPE :: POINT

REAL :: X, YCONTAINS

PROCEDURE, PASS :: LENGTH => POINT_LENGTHEND TYPE

CONTAINSREAL FUNCTION point_length (a, b)

CLASS (POINT), INTENT (IN) :: a, bpoint_length = SQRT ( (a%X - b%X)**2 + (a%Y - b%Y)**2 )

END FUNCTION point_lengthEND MODULE

総称バインディングgeneric_binding の構文

generic_binding の構文は、次のとおりです。

generic_spec は、次のいずれかになります。

generic_name

OPERATOR(defined-operator)各バインディングのインターフェースは、 192ページの『定義済み演算子』に指定されたとおりでなければなりません。

ASSIGNMENT(=)各バインディングのインターフェースは、 193ページの『定義済み代入』に指定されたとおりでなければなりません。

dtio_generic_spec

各バインディングのインターフェースは、 250ページの『ユーザー定義の派生型入出力プロシージャー・インターフェース (Fortran 2003)』に指定されたとおりでなければなりません。

generic_spec が generic_name の場合、generic_name は、その型の非総称バインディングの名前にすることはできません。1 つの派生型定義内で、同じgeneric_spec を複

�� GENERIC :: generic_spec, PRIVATE, PUBLIC

=> binding_name_list ��

第 4 章 派生型 71

Page 98: IBM XL Fortran for Linux, V15.1

数の総称バインディングに使用できます。その場合、同じ generic_spec のすべての指定について、同じアクセス可能度にする必要があります。また、binding_name_list

の各バインディング名は、その型の特定バインディング名でなければなりません。

generic_spec が generic_name でない場合は、binding_name_list 内の各特定バインディング名は、オブジェクト受け渡し仮引数がなければなりません。指定できるバインディング属性は、PRIVATE か、PUBLIC のいずれか 1 つだけになります。以下に示すのは、 generic_spec が ASSIGNMENT(=) となっている総称バインディングの例です。

例! See example of a procedure with a specific binding for definition of COLOR_POINTTYPE, EXTENDS(color_point) :: point_info! An extension of TYPE(COLOR_POINT)

REAL :: color_codeCONTAINSPROCEDURE, NOPASS:: get_color_codePROCEDURE :: info1 => color_to_infoPROCEDURE :: point1 => point_to_infoGENERIC :: ASSIGNMENT(=) => info1, point1

END TYPE point_info

CONTAINSELEMENTAL SUBROUTINE color_to_info(a, b)

CLASS(point_info), INTENT(OUT) :: aTYPE(color_point), INTENT(IN):: ba%color_point = ba%color_code = get_color_code(b%color)

END SUBROUTINEELEMENTAL SUBROUTINE point_to_info(a, b)

CLASS(point_info), INTENT(OUT) :: aTYPE(point), INTENT(IN):: ba%color_point = color_point(point=b, color=1)a%color_code = get_color_code(1)

END SUBROUTINE

以下は型パラメーターの例で、length パラメーターの使用方法を示しています。この例で示すように、複数の kind パラメーターの値に対して、複数のプロシージャーを定義する必要があります。

! Separate specific bindings may be needed for multiple possible kind parameters:TYPE :: GRAPH (PREC,NNODES)

INTEGER, KIND :: PRECINTEGER, LEN :: NNODESREAL(PREC) :: XVAL(NNODES), YVAL(NNODES)

CONTAINSPROCEDURE, PASS :: FINDMAX_Y_4PROCEDURE, PASS :: FINDMAX_Y_8GENERIC :: FINDMAX_Y => FINDMAX_Y_4, FINDMAX_Y_8

END TYPE GRAPH

CONTAINSINTEGER FUNCTION FINDMAX_Y_4(G)

CLASS(GRAPH(4,*)) :: GFINDMAX_Y_4 = MAXLOC(G%XVAL,1)

END FUNCTION FINDMAX_Y_4

INTEGER FUNCTION FINDMAX_Y_8(G)CLASS(GRAPH(8,*)) :: GFINDMAX_Y_8 = MAXLOC(G%XVAL,1)

END FUNCTION FINDMAX_Y_8

72 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 99: IBM XL Fortran for Linux, V15.1

最終バインディングfinal_binding の構文

派生型は、その派生型に最終サブルーチン、または、最終化可能な型が設定された非ポインター、割り振り不可のコンポーネントがある場合、最終化が可能です。非ポインター・データ・エンティティーは、そのエンティティーの型が最終化可能であれば、最終化できます。 final_binding の形式は、次のとおりです。

FINAL最終サブルーチンのリストを指定します。最終サブルーチンは、その型のデータ・エンティティーが最終化される場合に実行することができます。

final_subroutine_name_list

final_subroutine_name は、仮引数を 1 つだけ持つモジュール・プロシージャーにする必要があります。この引数は、オプションではなく、定義される派生型の非ポインター、割り振り不可、非ポリモアフィックな変数でなければなりません。すべての length 型パラメーターが想定されます。kind パラメーターごとに個別の最終サブルーチンを定義する必要があります。また、仮引数は、INTENT(OUT) であってはなりません。final_subroutine_name

は、以前にその型の最終サブルーチンとして指定したものであってはなりません。さらに、最終サブルーチンには、その型の別の最終サブルーチンの仮引数と同じ kind 型パラメーターおよびランクが設定された仮引数があってはなりません。

最終サブルーチンは型の拡張からは継承されず、オーバーライドすることはできません。

次に示すのは、最終サブルーチンが設定された拡張型の例です。

最終サブルーチンが設定された拡張型の例MODULE mTYPE :: t1

REAL a,bEND TYPETYPE, EXTENDS(t1) :: t2

REAL, POINTER :: c(:), d(:)CONTAINS

FINAL :: t2fEND TYPETYPE, EXTENDS(t2) :: t3 (k)

INTEGER, KIND :: kREAL(k), POINTER :: e

CONTAINSFINAL :: t3f4, t3f8

END TYPE

CONTAINSSUBROUTINE t2f(x) ! Finalizer for TYPE(t2)'s extra components

TYPE(t2) :: x

�� FINAL final_subroutine_name_list::

��

第 4 章 派生型 73

Page 100: IBM XL Fortran for Linux, V15.1

print *, 'entering t2f'IF (ASSOCIATED(x%c)) THEN

print *, ' c allocated, cleaning up'DEALLOCATE(x%c)

END IFIF (ASSOCIATED(x%d)) THEN

print *, ' d allocated, cleaning up'DEALLOCATE(x%d)

END IFEND SUBROUTINESUBROUTINE t3f4(y) ! Finalizer for TYPE(t3)'s extra components, where kind is 4

TYPE(t3(4)) :: yprint *, 'entering t3f4'IF (ASSOCIATED(y%e)) THEN

print *, ' e (k=4) allocated, cleanup up'DEALLOCATE(y%e)

END IFEND SUBROUTINESUBROUTINE t3f8(y) ! Second finalizer for TYPE(t3), with kind = 8

TYPE(t3(8)) :: yprint *, 'entering t3f8'IF (ASSOCIATED(y%e)) THEN

print *, ' e (k=8) allocated, cleanup up'DEALLOCATE(y%e)

END IFEND SUBROUTINE! If we had a type t3 with kind parameter k=16, we would probably! want yet another finalizer with an argument of the appropriate! type and parameters, but it does not have to be defined.

END MODULE

PROGRAM my_mainCALL calc_span

END PROGRAM

SUBROUTINE calc_spanUSE mTYPE(t1) x1TYPE(t2) x2TYPE(t3(4)) x3TYPE(t3(8)) x3a

ALLOCATE(x2%c(1:5), SOURCE=[1.0, 5.0, 10.0, 15.0, 20.0])ALLOCATE(x3%e, SOURCE=2.0)ALLOCATE(x3a%e, SOURCE=3.0_8)

x2%c = x2%c + x3%e + x3a%eprint *, 'calcs are=', x2%c

! Returning from this subroutine does! nothing to x1. It is not finalizable.! The Fortran compiler places calls to the finalizers at the! end of a subroutine for the local variables of calc_span,! as if the following calls were being made:! CALL t2f(x2)! CALL t3f4(x3)! CALL t2f(x3%t2)! CALL t3f8(x3a)! CALL t2f(x3a%t2)! Note that the specific order of invocation (x2 before x3 before x3a) may vary.

END SUBROUTINE

このプログラムの出力は、次のようになります。

calcs are= 6.000000000 10.00000000 15.00000000 20.00000000 25.00000000

entering t2f

74 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 101: IBM XL Fortran for Linux, V15.1

c allocated, cleaning up

entering t3f8

e (k=8) allocated, cleanup up

entering t2f

entering t3f4

e (k=4) allocated, cleanup up

entering t2f

関連情報v 76ページの『最終化 (Fortran 2003)』

プロシージャーのオーバーライド型定義に指定した非総称バインディングの名前が、親の型から継承したバインディングと同じ名前の場合、型定義に指定したバインディングが、親の型から継承したバインディングをオーバーライドします。

オーバーライドするバインディングとオーバーライドされるバインディングは、以下の条件を満たす必要があります。

v どちらのバインディングにもオブジェクト受け渡し仮引数があるか、どちらにもない。

v オーバーライドされるバインディングが純粋である場合、オーバーライドするバインディングも純粋となっている。

v どちらのバインディングもエレメント型であるか、どちらもエレメント型でない。

v どちらのバインディングにも同数の仮引数がある。

v オブジェクト受け渡し仮引数がある場合、名前と位置が一致している。

v 位置が一致する仮引数は、オブジェクト受け渡し仮引数の型を除き、名前と特性が同じになっている。

v どちらのバインディングも、同じ結果特性を持つサブルーチンか関数である。

v オーバーライドされるバインディングが PUBLIC の場合、オーバーライドするバインディングは PRIVATE になっていない。

プロシージャーのオーバーライドの例

TYPE :: POINTREAL :: X, YCONTAINSPROCEDURE, PASS :: LENGTH => POINT_LENGTH

END TYPE POINTTYPE, EXTENDS (POINT) :: POINT_3D

REAL :: ZCONTAINSPROCEDURE, PASS :: LENGTH => POINT_3D_LENGTH

END TYPE POINT_3D...

同じモジュールのモジュール・サブプログラム部分:

REAL FUNCTION POINT_LENGTH (A, B)CLASS (POINT), INTENT (IN) :: A, BPOINT_LENGTH = SQRT ( (A%X - B%X)**2 + (A%Y - B%Y)**2 )

END FUNCTION POINT_LENGTH

第 4 章 派生型 75

Page 102: IBM XL Fortran for Linux, V15.1

REAL FUNCTION POINT_3D_LENGTH ( A, B )CLASS (POINT_3D), INTENT (IN) :: ACLASS (POINT), INTENT (IN) :: BSELECT 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 SELECTPRINT *, 'In POINT_3D_LENGTH, dynamic type of argument is incorrect.'STOP

END FUNCTION POINT_3D

型定義で指定された総称バインディングに、継承されたバインディングと同じgeneric_spec があり、それが条件を満たしていない場合、そのバインディングは総称インターフェースを拡張し、 189ページの『一義的な総称プロシージャー参照』に指定された要件を満たさなければなりません。

型定義の総称バインディングに、親から継承された dtio_generic_spec と同じものが指定されている場合、そのバインディングは、dtio_generic_spec の総称インターフェースを拡張し、 189ページの『一義的な総称プロシージャー参照』に指定された要件を満たさなければなりません。

ある型のバインディングとその型の拡張のバインディングは、以下の場合に対応します。

v 拡張バインディングが型バインディングと同じである場合。

v 拡張バインディングが対応するバインディングをオーバーライドする場合。

v 拡張バインディングが、継承された対応バインディングである場合。

最終化 (Fortran 2003)

最終化プロセス最終化が行われるのは、最終化可能なエンティティーだけです。あるエンティティーが最終化される場合、次のステップが順に実行されます。

1. エンティティーの動的型に最終サブルーチンがあり、その最終サブルーチンの仮引数の kind 型パラメーターとランクが最終化されるエンティティーと同じである場合、その最終サブルーチンが実引数としてエンティティーと共に呼び出されます。または、仮引数の kind 型パラメーターとランクが最終化されるエンティティーと同じエレメント型最終サブルーチンがある場合、その最終サブルーチンが実引数としてエンティティーと共に呼び出されます。これらのいずれでもない場合、サブルーチンはこの時点では呼び出されません。

2. 型定義に指定された各最終化可能コンポーネントが、最終化されます。最終化されるエンティティーが配列の場合、そのエンティティーの各エレメントの最終化可能なそれぞれのコンポーネントが個別に最終化されます。

3. エンティティーが拡張型で、親の型が最終化可能である場合、エンティティーの親コンポーネントが最終化されます。

最終化を起動するいずれかのイベントの結果として、複数のエンティティーが最終化の対象となる場合、それらのエンティティーは、任意の順に最終化できます。

76 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 103: IBM XL Fortran for Linux, V15.1

最終サブルーチンは、既に最終化されたオブジェクトを参照したり、定義したりすることはできません。そのオブジェクトが最終化されなかった場合、そのオブジェクトはその定義状況を保持し、未定義にはなりません。

最終化が行われる条件最終化は、ポインターが割り振り解除された場合に、そのポインターのターゲットに対して行われます。あるオブジェクトがポインター割り振りによって割り振られ、その後、そのオブジェクトに対するすべてのポインターのポインター関連付け状況が変更されたために到達不能になった場合は、そのオブジェクトに対する最終化は行われません。

割り振り可能エンティティーの最終化は、そのエンティティーが割り振り解除になった時点で行われます。

仮引数または関数結果ではない、非ポインター、割り振り不可のオブジェクトの最終化は、そのオブジェクトが RETURN または END ステートメントの実行によって定義解除される直前に行われます。

実行可能構文によって参照される構造体コンストラクターにより作成されたエンティティーの最終化は、その参照を含む最も内側の実行可能構文の実行後に行われます。

実行可能構文によって参照される配列コンストラクターにより作成されたエンティティーの最終化は、その参照を含む最も内側の実行可能構文の実行後に行われます。

実行可能構文によって参照される関数の結果の最終化は、その参照を含む最も内側の実行可能構文の実行後に行われます。

有効範囲単位内の宣言式によって参照される関数結果の最終化は、その有効範囲単位内の最初の実行可能ステートメントが実行される前に行われます。

プロシージャーの INTENT(OUT) 仮引数に関連付けられた実引数で、非ポインター、割り振り不可のオブジェクトの最終化は、プロシージャーが呼び出されたときに行われます。

組み込み代入ステートメントの変数の最終化は、式の評価後、その変数の定義前に行われます。

F2008 BLOCK 構文の未保管の割り振り不能な非ポインター・ローカル変数の最終化は、実行が BLOCK 構文を終了する直前に実行されます。 F2008

最終化されないエンティティープログラムの実行が、割り振り失敗などのエラーによって終了した場合、もしくはSTOP、 F2008 ERROR STOP、 F2008 または END PROGRAM の各ステートメントの実行によって終了した場合、終了直前にあったエンティティーは最終化されません。

非ポインター、割り振り不可のオブジェクトで、SAVE 属性を持つオブジェクトは、RETURN または END ステートメントの実行を直接的な起因として最終化が行われることはありません。

第 4 章 派生型 77

Page 104: IBM XL Fortran for Linux, V15.1

派生型の宣言型の決定2 つのデータ・オブジェクトを、同じ派生型定義を参照することによって宣言している場合には、これらのデータ・オブジェクトの派生型は同じです。

これらのデータ・オブジェクトが別々の有効範囲単位内にある場合でも、両者が同じ派生型を持つことができます。次のいずれかの条件が満たされる場合は、ホスト関連付けまたは使用関連付けによって派生型定義にアクセスできるか、またはデータ・オブジェクトが自己の派生型定義を参照します。

v これらのデータ・オブジェクトが、標準の派生型宣言を使用して宣言され、両方の名前が同じであり、両方が SEQUENCE プロパティーを持っているか、またはBIND 属性を持っており、しかも両方が PRIVATE アクセス可能性とその型パラメーターを持たず、かつ順序、名前、属性が一致するコンポーネントを持っている。または、

v 2 つのデータ・オブジェクトが、名前なしではないレコード構造宣言を使用して宣言され、型の名前が同じで、%FILL コンポーネントを持っておらず、かつ順序と属性が一致するコンポーネントを持っており、しかも %FILL コンポーネントが 2 つのデータ・オブジェクトの同じ位置に指定されている。

BIND 属性または SEQUENCE プロパティーを指定する派生型定義は、プライベートと宣言される定義、あるいはプライベートであるコンポーネントを持つ定義とは異なります。

例 1:

PROGRAM MYPROG

TYPE NAME ! Sequence derived typeSEQUENCECHARACTER(20) LASTNAMECHARACTER(10) FIRSTNAMECHARACTER(1) INITIAL

END TYPE NAMETYPE (NAME) PER1

CALL MYSUB(PER1)PER1 = NAME('Smith','John','K') ! Structure constructorCALL MYPRINT(PER1)

CONTAINSSUBROUTINE MYSUB(STUDENT) ! Internal subroutine MYSUB

TYPE (NAME) STUDENT ! NAME is accessible via host association...

END SUBROUTINE MYSUBEND

SUBROUTINE MYPRINT(NAMES) ! External subroutine MYPRINTTYPE NAME ! Same type as data type in MYPROG

SEQUENCECHARACTER(20) LASTNAMECHARACTER(10) FIRSTNAMECHARACTER(1) INITIAL

END TYPE NAMETYPE (NAME) NAMES ! NAMES and PER1 from MYPROGPRINT *, NAMES ! have the same data type

END SUBROUTINE

78 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 105: IBM XL Fortran for Linux, V15.1

例 2:

MODULE MODSTRUCTURE /S/INTEGER IINTEGER, POINTER :: PEND STRUCTURERECORD /S/ R

END MODULEPROGRAM P

USE MOD, ONLY: RSTRUCTURE /S/

INTEGER JINTEGER, POINTER :: Q

END STRUCTURERECORD /S/ R2R = R2 ! OK - same type name, components have same attributes and

! type (but different names)END PROGRAM P

構造体コンストラクター構造体コンストラクターを利用すれば、値のリストから派生型のスカラー値を構成することができます。構造体コンストラクターは、参照される派生型の定義の前に指定することはできません。

derived_type_spec特定の派生型パラメーターおよび型パラメーターの指定に使用します。

type_name

派生型の名前です。抽象名であってはなりません。

type_param_spec は、次のようになります。

注: type_param_value の指定がなければ、型パラメーターの値は、そのデフォルト値になります。詳しくは、 56ページの『派生型パラメーター (Fortran 2003)』 を参照してください。

�� derived_type_spec ( )component_spec_list

��

�� type_name ( )type_param_spec_list

��

�� type_param_valuetype_param_keyword =

��

第 4 章 派生型 79

Page 106: IBM XL Fortran for Linux, V15.1

type_param_keyword

型のパラメーターの名前です。

type_param_value

構造体コンストラクター内のスカラー整数式でなればなりません。

注: derived_type_spec は、データ・エンティティー、プロシージャー・インターフェースなどの宣言にも使用されます。このようなケースでは、length パラメーターである type_param_value は、スカラー整数式だけでなく、* または : のいずれかにすることもできます。

component_spec は、次のようになります。

component_keyword

その型のコンポーネント名です。

expr 式です。各種類の式は、 113ページの『第 6 章 式および代入』に定義されています。

type_name および expr が指定される型のすべてのコンポーネントは、構造体コンストラクターを含む有効範囲単位でアクセス可能でなければなりません。

コンポーネント・キーワード (component_keyword) がない場合、各 expr は、対応するコンポーネントにコンポーネント順に割り当てられます。コンポーネント・キーワードが指定された場合は、 expr は、そのキーワードによって指名されたコンポーネントに割り当てられます。非ポインター・コンポーネントの場合、コンポーネントの宣言型と型パラメーター、および expr が、組み込み代入の変数と式の場合と同じように一致する必要があります。必要に応じて、組み込み型の各値が、組み込み代入の規則に従って、型および型パラメーターが派生型の対応するコンポーネントと一致する値に変換されます。非ポインターで、割り振り不可のコンポーネントの場合、式の形状がコンポーネントの形状と一致する必要があります。

component_spec がコンポーネントに指定された場合、そのコンポーネントが継承関連されているコンポーネントに対しては、component_spec を指定できません。 1 つのコンポーネントに対して指定できる component_spec は、1 つ以下です。

デフォルトの初期化が指定されているコンポーネントに対応する expr がない場合、デフォルトの初期化は、そのコンポーネントに適用されます。

component_keyword = 指定子を component_spec で省略できるのは、コンストラクター内の先行する各 component_spec で同じように component_keyword = 指定子が省略されている場合に限られます。

type_param_keyword = 指定子を type_param_spec で省略できるのは、コンストラクター内の先行する各 type_param_spec で同じように type_param_keyword = 指定子が省略されている場合に限られます。

�� exprcomponent_keyword =

��

80 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 107: IBM XL Fortran for Linux, V15.1

ポインターとなっているコンポーネントは、ポインターのコンポーネントと同じ型で宣言できます。構造体コンストラクターが、ポインターを含む派生型に対して作成された場合、ポインター・コンポーネントに対応する式は、ポインター代入ステートメント内のそのようなポインターとして使用可能なターゲットとなり得るオブジェクトに対して評価を行わなければなりません。

派生型のコンポーネントが割り振り可能な場合、対応するコンストラクター式は、引数なしの組み込み関数 NULL() への参照、または、割り振り可能エンティティーになるか、あるいは対応するコンストラクター式の評価の結果が同じランクのエンティティーになります。式が組み込み関数 NULL() への参照である場合、コンストラクターの対応するコンポーネントの状況は「割り振り解除済み」です。式が割り振り可能エンティティーの場合、対応するコンストラクターのコンポーネントは、割り振り可能エンティティーと同じ割り振り状況になり、割り振り済みである場合は、同じ動的型、境界 (境界がある場合)、および値になります。コンポーネントのlength パラメーターが据え置きの場合、その値は式の対応するパラメーターと同じです。それ以外の場合は、対応するコンストラクターのコンポーネントは、割り振り状況が割り振り済みとなり、式と同じ境界 (境界がある場合) と値になります。

派生型が、レコード構造宣言を使用して宣言され、%FILL コンポーネントを持っている場合、その型の構造体コンストラクターは使用できません。

派生型が有効範囲単位内でアクセス可能で、かつ、クラス 1 のローカル・エンティティーがあって、それがその有効範囲単位内でアクセス可能な同名の派生型ではない場合、その型の構造体コンストラクターをその有効範囲内で使用することはできません。

derived_type_spec が総称名と同じ型名である場合、総称参照として解決可能な関数参照に対して、component_spec_list を有効な actual_arg_spec_list にすることはできません。

割り振り可能コンポーネントを含む派生型の構造コンストラクターでは、割り振り可能コンポーネントに対応する式は、以下のいずれかでなければなりません。

v 引数のない組み込み関数 NULL の参照。割り振り可能コンポーネントは、「割り振り解除済み」という割り振り状況を受け取ります。

v 同じランクの割り振り可能変数。割り振り可能コンポーネントには変数の割り振り状況があり、それが「割り振り済み」の場合は、同じ動的タイプ、境界、および値を持ちます。コンポーネントの長さ据え置きパラメーターは、変数の対応するパラメーターと同じ値を持ちます。

v 同じランクのエンティティーとして評価する他のすべての式。割り振り可能コンポーネントには「割り振り済み」の割り振り状況があり、式と同じ境界および値を持ちます。

例 1:

MODULE PEOPLETYPE NAME

SEQUENCE ! Sequence derived typeCHARACTER(20) LASTNAMECHARACTER(10) FIRSTNAMECHARACTER(1) INITIAL

第 4 章 派生型 81

Page 108: IBM XL Fortran for Linux, V15.1

END TYPE NAME

TYPE PERSON ! Components accessible via use! association

INTEGER AGEINTEGER BIRTHDATE(3) ! Array componentTYPE (NAME) FULLNAME ! Component of derived type

END TYPE PERSONEND MODULE PEOPLE

PROGRAM TEST1USE PEOPLETYPE (PERSON) SMITH, JONESSMITH = PERSON(30, (/6,30,63/), NAME('Smith','John','K'))

! Nested structure constructorsJONES%AGE = SMITH%AGE ! Component designatorCALL TEST2CONTAINS

SUBROUTINE TEST2TYPE T

INTEGER EMP_NOCHARACTER, POINTER :: EMP_NAME(:) ! Pointer component

END TYPE TTYPE (T) EMP_RECCHARACTER, TARGET :: NAME(10)EMP_REC = T(24744,NAME) ! Pointer assignment occurs

END SUBROUTINE ! for EMP_REC%EMP_NAMEEND PROGRAM

例 2:

PROGRAM LOCAL_VARTYPE DT

INTEGER AINTEGER :: B = 80

END TYPE

TYPE(DT) DT_VAR ! DT_VAR%B IS INITIALIZEDEND PROGRAM LOCAL_VAR

例 3:

MODULE MYMODTYPE DT

INTEGER :: A = 40INTEGER, POINTER :: B => NULL()

END TYPEEND MODULE

PROGRAM DT_INITUSE MYMODTYPE(DT), SAVE :: SAVED(8) ! SAVED%A AND SAVED%B ARE INITIALIZEDTYPE(DT) LOCAL(5) ! LOCAL%A LOCAL%B ARE INITIALIZED

END PROGRAM

例 4:

PROGRAM NEW_LOCALTYPE DT

INTEGER :: A = 20INTEGER :: B = 80END TYPE

TYPE(DT):: DT_VAR = DT()

82 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 109: IBM XL Fortran for Linux, V15.1

TYPE(DT):: DT_VAR2 = DT(B=40)TYPE(DT):: DT_VAR3 = DT(B=10, A=50)

PRINT *, 'DT_VAR =', DT_VARPRINT *, 'DT_VAR2=', DT_VAR2PRINT *, 'DT_VAR3=', DT_VAR3

END PROGRAM NEW_LOCAL

! The expeceted output is :DT_VAR = 20 80DT_VAR2= 20 40DT_VAR3= 50 10

第 4 章 派生型 83

Page 110: IBM XL Fortran for Linux, V15.1

84 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 111: IBM XL Fortran for Linux, V15.1

第 5 章 配列の概念

配列とは、スカラー・データを順序付けて並べたシーケンスです。同じ配列内のエレメントは、すべて同じデータ型、および型パラメーターになります。

XL Fortran では、一般に配列言語と呼ばれる、配列を操作するための機能セットを提供しています。このセクションでは、配列および配列言語についての背景情報を説明します。

313ページの『第 11 章 ステートメントおよび属性』に記載されている多くのステートメントには、配列に関する特別な機能および規則があります。

このセクションでは、DIMENSION (次元) 属性を頻繁に引用します。 371ページの『DIMENSION』を参照してください。

組み込み関数は、その多くが配列に関するものです。それらの関数は、主として625ページの『変換組み込み関数』に分類されています。

配列の基本全体配列 は、配列の名前によって示されます。

! In this declaration, the array is given a type and dimensionREAL, DIMENSION(3) :: A! In these expressions, each element is evaluated in each expressionPRINT *, A, A+5, COS(A)

全体配列は、名前付き定数または変数のいずれかになります。

次元

Fortran 2008 では、最大 15 次元までの配列を作成できます。

XL Fortran では、最大 20 次元までの配列を作成できます。

次元の境界配列内の各次元には、上限および下限があり、これらの境界によって、その次元の添え字として使用できる値の範囲が決められています。次元の境界は、正、負、またはゼロのいずれかの値になります。

XL Fortran では、次元の境界は、-(2**63) から 2**63-1 の範囲内で、正、負、またはゼロのいずれかの値になります。

境界の下限が、対応する上限より大きい場合、その配列はゼロ・サイズ配列となります。ゼロ・サイズ配列には、エレメントはありませんが、配列のプロパティーは持っています。そのような次元の場合、組み込み照会関数 LBOUND およびUBOUND の戻り値は、それぞれ 1 と 0 になります。

配列宣言子で境界が指定される場合、

© Copyright IBM Corp. 1996, 2015 85

Page 112: IBM XL Fortran for Linux, V15.1

v 下限は宣言式です。省略された場合、デフォルト値は 1 になります。

v 上限は宣言式またはアスタリスク (*) で、デフォルト値はありません。

関連情報v 115ページの『宣言式』

次元のエクステント次元のエクステントとは、その次元内のエレメント数のことで、上限の値から下限の値を引いて 1 を加えることによって求められます。

INTEGER, DIMENSION(5) :: X ! Extent = 5REAL :: Y(2:4,3:6) ! Extent in 1st dimension = 3

! Extent in 2nd dimension = 4

最小エクステントはゼロで、これは下限が上限より大きい次元の場合になります。

配列内のエレメントの理論上の最大数は、2**63-1 エレメントとなります。ハードウェアのアドレッシングを考慮すると、全体の大きさ (バイト数) がこの値を超えるデータ・オブジェクトの組み合わせを宣言することは現実的にはないと思われます。

共通、等価、または引数のいずれかの関連付けによって関連付けられた異なる配列宣言子は、異なるランクとエクステントを持つ場合があります。

配列のランク、形状、およびサイズランク

配列のランクとは、配列が持つ次元数のことです。

INTEGER, DIMENSION (10) :: A ! Rank = 1REAL, DIMENSION (-5:5,100) :: B ! Rank = 2

スカラーは、ランク 0 と見なされます。

形状

配列の形状は、配列のランクおよびエクステントから派生します。これは、エレメントが対応する次元のエクステントを表す、ランク 1 の配列で表すことができます。

INTEGER, DIMENSION (10,10) :: A ! Shape = (/ 10, 10 /)REAL, DIMENSION (-5:4,1:10,10:19) :: B ! Shape = (/ 10, 10, 10 /)

サイズ

配列のサイズとは、配列に含まれるエレメントの総数のことです。サイズは、すべての次元のエクステントの積に等しくなります。

INTEGER A(5) ! Size = 5REAL B(-1:0,1:3,4) ! Size = 2 * 3 * 4 = 24

配列宣言子配列宣言子は、配列のランク、またはランクと形状を指定します。

86 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 113: IBM XL Fortran for Linux, V15.1

すべての名前付き配列は、宣言が必要で、有効範囲単位内で、同じ名前に対して複数の配列宣言子を設定することはできません。配列宣言子は、以下の「配列宣言子が使用可能なステートメントおよび属性」の表に記載されたステートメントまたは属性で指定できます。

表 14. 配列宣言子が使用可能なステートメントおよび属性

ALLOCATABLE �1� AUTOMATIC �2� COMMON

DIMENSION CONTIGUOUS �3� PARAMETER

POINTER (整数) �2� POINTER PROTECTED �1�

STATIC �2� TARGET 型宣言

VOLATILE

注:�1� Fortran 2003

�2� IBM 拡張�3� Fortran 2008

以下に例を示します。

DIMENSION :: A(1:5) ! Declarator is "(1:5)"REAL, DIMENSION(1,1:5) :: B ! Declarator is "(1,1:5)"INTEGER C(10) ! Declarator is "(10)"

配列宣言子の形式は、次のとおりです。

�� ( array_spec ) ��

array_spec

配列の仕様です。これは、次元宣言子のリストで、それぞれが配列の上限と下限を設定するか、または、実行時のその一方または両方が設定されることを指定します。各次元には、1 つの次元宣言子が必要となります。

array_spec は次のいずれかになります。explicit_shape_spec_list

assumed_shape_spec_list

deferred_shape_spec_list

implied_shape_spec_list

assumed_size_spec

TS 29113 assumed_rank_spec TS 29113

各 array_spec は異なる種類の配列を宣言します。詳しくは、 85ページの『第 5 章 配列の概念』セクションのトピックを参照してください。

明示的形状配列明示的形状配列とは、各次元の境界が明示的に指定されている配列のことです。

第 5 章 配列の概念 87

Page 114: IBM XL Fortran for Linux, V15.1

Explicit_shape_spec_list

�� �

,

upper_boundlower_bound :

��

lower_bound、upper_bound

これらは、宣言式です。

境界が定数以外の式である配列は、サブプログラムまたは F2008 BLOCK 構文F2008 内で宣言する必要があります。定数以外の境界は、サブプログラムまたはF2008 BLOCK 構文 F2008 の入り口で決定されます。下限が省略されると、そのデフォルト値は 1 になります。

ランクは、指定された上限境界の数です。明示的形状仮引数の形状は、対応する実引数の形状と異なる場合があります。

サイズは、指定された境界によって決まります。

明示的形状仮引数のサイズは、実引数のサイズと同じである必要はありませんが、仮引数のサイズを実引数のサイズより大きくすることはできません。

F2008 VALUE 属性を明示的形状配列で指定できます。 F2008

例INTEGER A,B,C(1:10,-5:5) ! All bounds are constantA=8; B=3CALL SUB1(A,B,C)ENDSUBROUTINE SUB1(X,Y,Z)

INTEGER X,Y,Z(X,Y) ! Some bounds are not constantEND SUBROUTINE

関連情報

151ページの『BLOCK 構文 (Fortran 2008)』

538ページの『VALUE (Fortran 2003)』

自動割り付け配列自動割り付け配列とは、サブプログラム F2008 または BLOCK 構文 F2008 で宣言された明示的形状配列です。仮引数やポインティング先配列ではなく、定数以外の指定式となっている境界が 1 つ以上あります。境界の評価は、サブプログラム

F2008 または BLOCK 構文 F2008 の入り口で行われます。境界の決定後、その境界が、サブプログラム F2008 または BLOCK 構文 F2008 の実行中に変更されることはありません。

自動割り付け配列の例

88 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 115: IBM XL Fortran for Linux, V15.1

INTEGER XCOMMON XX = 10CALL SUB1(5)END

SUBROUTINE SUB1(Y)INTEGER XCOMMON XINTEGER YREAL Z (X:20, 1:Y) ! Automatic array. Here the bounds are made

! available through dummy arguments and common! blocks, although Z itself is not a dummy

END SUBROUTINE ! argument.

関連情報

v 自動データ・オブジェクトの一般的な情報は、 21ページの『自動オブジェクト』および 31ページの『変数のストレージ・クラス (IBM 拡張)』を参照してください。

調整可能配列調整可能配列とは、1 つ以上の定数以外の境界を持つ明示的形状配列の仮引数のことをいいます。

調整可能配列の例

SUBROUTINE SUB1(X, Y)INTEGER X, Y(X*3) ! Adjustable array. Here the bounds depend on a

! dummy argument, and the array name is also passed in.END SUBROUTINE

ポインティング先配列 (IBM 拡張)ポインティング先配列は、整数 POINTER ステートメントのみで使用可能な明示的形状配列または想定サイズ配列です。

配列がサブプログラム内で宣言されている場合、ポインティング先配列の宣言子には、変数しか入れることができず、その変数は、次のいずれかでなければなりません。

v 仮引数

v 共通ブロックのメンバー

v 使用に関連付けられている

v ホストに関連付けられている

境界は、サブプログラムの入り口で計算され、サブプログラムの実行中は一定に保たれます。

-qddim コンパイラー・オプションを使用してコンパイルすると、配列宣言子内に入れることができる変数に関する制限が緩和され、メインプログラム内の宣言子に変数名を入れることができるようになります。また、配列が参照されるたびに、指定された定数以外の境界がすべて再計算されるため、境界式で使用される変数の値を単に変更するだけでポインティング先配列のプロパティーを変更できます。

-qddim を使用して配列宣言子の制限を緩和した例

第 5 章 配列の概念 89

Page 116: IBM XL Fortran for Linux, V15.1

@PROCESS DDIMINTEGER PTE, N, ARRAY(10)POINTER (P, PTE(N))N = 5P = LOC(ARRAY(2)) !PRINT *, PTE ! Print elements 2 through 6 of ARRAYN = 7 ! Increase the sizePRINT *, PTE ! Print elements 2 through 8 of ARRAYEND

想定形状配列想定形状配列とは、各次元のエクステントが、関連付けられた実引数から抽出される仮引数配列のことです。

Assumed_shape_spec_list

�� �

,

:lower_bound

��

lower_bound

ここには、宣言式が入ります。

それぞれの下限は、1 にデフォルト設定されるか、明示的に指定することができます。境界の各上限は、指定された下限 (実引数配列の下限ではない) に対してその次元のエクステントを加え、1 を引いた値が、サブプログラムの入り口で設定されます。

次元のエクステントは、いずれも関連付けられた実引数の対応する次元のエクステントになります。

ランクは、assumed_shape_spec_list 内のコロンの数になります。

形状は、関連した実引数配列から想定されます。

サイズは、宣言されたサブプログラムの入り口で決められ、関連した実引数配列のサイズに等しくなります。

注: 想定形状配列を仮引数として持つサブプログラムには、明示インターフェースが必要です。

F2008 VALUE 属性を想定形状配列で指定できます。 F2008

例INTERFACE

SUBROUTINE SUB1(B)INTEGER B(1:,:,10:)

END SUBROUTINEEND INTERFACEINTEGER A(10,11:20,30)CALL SUB1 (A)

90 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 117: IBM XL Fortran for Linux, V15.1

ENDSUBROUTINE SUB1(B)INTEGER B(1:,:,10:)! Inside the subroutine, B is associated with A.! It has the same extents as A but different bounds (1:10,1:10,10:39).END SUBROUTINE

関連情報

151ページの『BLOCK 構文 (Fortran 2008)』

538ページの『VALUE (Fortran 2003)』

据え置き形状配列据え置き形状配列とは、割り振り可能配列または配列ポインターのことで、境界をプログラムの実行中に定義または再定義できます。

Deferred_shape_spec_list

�� �

,

: ��

各次元のエクステント (ならびに関連する境界、形状、サイズのプロパティー) は、配列が割り振られるか、ポインターが定義済みの配列に関連付けられるまでは未定義です。そのように処理されるまでは、配列のどの部分も定義したり参照したりすることはできません。ただし特定の状態での引数としては可能です。

配列ポインターは、以下のいずれかによって指定された境界を持つことができます。

v ポインターの代入

v ALLOCATE ステートメント

v それが仮引数である場合は、非ポインター実引数または関連するポインター引数を持つ引数関連付け

割り振り可能配列は、以下のいずれかによって指定された境界を持つことができます。

v ALLOCATE ステートメント

v それが仮引数である場合は、割り振られた引数を持つ引数関連付け

ランクは、deferred_shape_spec_list 内のコロンの数になります。

deferred_shape_spec_list は、assumed_shape_spec_list と変わらないように見えるときもありますが、据え置き形状配列と想定形状配列は同じものではありません。据え置き形状配列には ALLOCATABLE 属性または POINTER 属性のいずれかがなければなりませんが、想定形状配列は、ALLOCATABLE 属性、POINTER 属性のいずれもない仮引数でなければなりません。据え置き形状配列の境界およびそれに関連した実際のストレージは、配列を再割り振りしたり、ポインターを別の配列に関

第 5 章 配列の概念 91

Page 118: IBM XL Fortran for Linux, V15.1

連させることによっていつでも変更できますが、想定形状配列の場合、これらのプロパティーは対象となるサブプログラムの実行中は変更されません。

関連情報:

v 30ページの『割り振り状況』

v 144ページの『データ・ポインターの代入』

v 178ページの『ポインター関連付け』

v 318ページの『ALLOCATABLE (Fortran 2003)』

v 637ページの『ALLOCATED(X)』

v 642ページの『ASSOCIATED(POINTER, TARGET)』

割り振り可能配列ALLOCATABLE 属性を持つ据え置き形状配列は、割り振り可能配列と呼ばれます。配列の境界と形状は、以下のいずれかのタスクを実行するときに決定されます。

v ALLOCATE ステートメントを使用してストレージを割り振る

v 引数関連付けを実行する

以下の例では、割り振り可能配列を宣言し、その境界を決定します。

INTEGER, ALLOCATABLE, DIMENSION(:, :, :) :: arrALLOCATE(arr(10, -4:5, 20)) ! Bounds of arr are now defined (1:10, -4:5, 1:20)DEALLOCATE(a)ALLOCATE(arr(5, 5, 5)) ! Change the bounds of arr

-qinitalloc を使用してプログラムをコンパイルすると、割り振り可能配列 arr のすべてのエレメントがゼロに初期化されます。

92 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 119: IBM XL Fortran for Linux, V15.1

関連情報v 318ページの『ALLOCATABLE (Fortran 2003)』

v 319ページの『ALLOCATE』

v 367ページの『DEALLOCATE』

v -qinitallocオプション

配列ポインターPOINTER 属性を持つ配列は、配列ポインターと呼ばれます。この配列の境界と形状は、以下の方法で配列がターゲットと関連付けられたときに決定されます。

v ポインターの代入

v 引数関連付け

v ALLOCATE ステートメントの実行

以下の例では、配列ポインターを宣言し、その境界とストレージの関連付けを決定します。

REAL, POINTER, DIMENSION(:, :) :: bREAL, TARGET, DIMENSION(5, 10) :: c, d(10, 10)b => c ! Bounds of b are now defined (1:5, 1:10)b => d ! b now has different bounds and is associated with different storage

以下の ALLOCATE ステートメントを使用し、-qinitalloc オプションを使用してプログラムをコンパイルすると、配列ポインター b のすべてのエレメントがゼロに初期化されます。

マイグレーションのためのヒント:

コンパイル時に配列のサイズがわからない場合、最大サイズで宣言せずに、配列を割り振り可能にしておけば、不必要なメモリーを使用せずに済みます。

FORTRAN 77 ソース

INTEGER A(1000),B(1000),C(1000)C 1000 is the maximum size

WRITE (6,*) "Enter the size of the arrays:"READ (5,*) N

...DO I=1,N

A(I)=B(I)+C(I)END DOEND

Fortran 90 またはそれ以上の場合のソース:

INTEGER, ALLOCATABLE, DIMENSION(:) :: A,B,CWRITE (6,*) "Enter the size of the arrays:"READ (5,*) NALLOCATE (A(N),B(N),C(N))

...A=B+CEND

第 5 章 配列の概念 93

Page 120: IBM XL Fortran for Linux, V15.1

ALLOCATE(b(5, 5)) ! Change bounds and storage association again

関連情報v 178ページの『ポインター関連付け』

v 319ページの『ALLOCATE』

v -qinitallocオプション

暗黙形状配列 (Fortran 2008)暗黙形状配列は、宣言内の定数式から形状を継承する名前付き定数です。

Implied_shape_spec_list

�� �

,

*lower_bound:

��

lower_bound

宣言式

暗黙形状配列の宣言には、暗黙形状の指定と定数式が含まれています。定数式は配列でなければなりません。

ランクは、implied_shape_spec_list 内の暗黙形状指定の数です。

次元のエクステントは、いずれも定数式の対応する次元のエクステントと同じです。

各下限は、implied_shape_spec_list 内の対応する下限です。下限が指定されていない次元の場合、下限はデフォルト値の 1 になります。各上限は、下限にエクステントを足した数値から 1 を引いたものです。

例! Array imp1 is a rank-one array. Its upper bound is 5.INTEGER, PARAMETER :: imp1(4:*) = [1, 2]

! Array imp2 is a rank-one array. Its upper bound is 4.INTEGER, PARAMETER :: onetofour(4) = [1, 2, 3, 4]INTEGER, PARAMETER, DIMENSION(*) :: imp2 = onetofour

! Array imp3 is a rank-two array. Its shape is (/2, 2/) and the upper bounds forthe two dimensions are 2 and 11.REAL, PARAMETER :: imp3(*, 10:*) = RESHAPE([1, 2, 3, 4], [2, 2])

関連情報v 「XL Fortran ランゲージ・リファレンス」の定数式

94 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 121: IBM XL Fortran for Linux, V15.1

想定サイズ配列想定サイズ配列は、関連付けられた実引数からサイズが継承されるが、ランクとエクステントは異なる場合のある仮引数配列です。

Assumed_size_spec

��

*, lower_bound :

upper_bound ,lower_bound :

��

lower_bound、upper_bound

これらは、宣言式です。

いずれかの境界が定数ではない場合、その配列はサブプログラム内で宣言してください。また、定数以外の境界は、サブプログラムの入り口で指定されます。下限が省略されると、そのデフォルト値は 1 になります。

最後の次元には上限が設定されず、代わりに、アスタリスクが指定されます。エレメントに対する参照が実配列の最後を超えないようにしてください。

ランクは、その宣言内の upper_bound 指定の数に 1 を加えたものに等しくなりますが、これは関連付けられた実配列のランクと異なる場合があります。

サイズは、想定サイズ配列に関連付けられた実引数から想定されます。

vTS 29113 実引数がスカラーであり、想定サイズ仮引数が想定された型である場

合、想定サイズ配列には 1 つのみエレメントがあります。 TS 29113

v 実引数が文字以外の配列である場合、想定サイズ配列のサイズは、実配列のサイズとなります。

v 実引数が文字以外の配列からの配列エレメントで、このエレメントで始まる配列に残っているサイズが S の場合、仮引数配列のサイズは S になります。配列エレメントは、配列エレメントの順序に従って処理されます。

v 実引数が文字配列、配列エレメント、または配列エレメント・サブストリングのいずれかの場合、次のようになります。以下のように仮定します。– A: 文字配列に対する文字ストリング内の開始オフセット– T: 元の配列の文字ストリング内の全長– S: 文字ストリング内の仮引数配列内のエレメントの長さ

この場合、仮引数のサイズは、次のようになります。

MAX( INT (T - A + 1) / S, 0 )

以下に例を示します。

CHARACTER(10) A(10)CHARACTER(1) B(30)CALL SUB1(A) ! Size of dummy argument array is 10

第 5 章 配列の概念 95

Page 122: IBM XL Fortran for Linux, V15.1

CALL SUB1(A(4)) ! Size of dummy argument array is 7CALL SUB1(A(6)(5:10)) ! Size of dummy argument array is 4 because there

! are just under 4 elements remaining in ACALL SUB1(B(12)) ! Size of dummy argument array is 1, because the

! remainder of B can hold just one CHARACTER(10)END ! element.SUBROUTINE SUB1(ARRAY)

CHARACTER(10) ARRAY(*)...

END SUBROUTINE

例 1

INTEGER X(3,2)DO I = 1,3

DO J = 1,2X(I,J) = I * J ! The elements of X are 1, 2, 3, 2, 4, 6

END DOEND DOPRINT *,SHAPE(X) ! The shape is (/ 3, 2 /)PRINT *,X(1,:) ! The first row is (/ 1, 2 /)CALL SUB1(X)CALL SUB2(X)ENDSUBROUTINE SUB1(Y)

INTEGER Y(2,*) ! The dimensions of y are the reverse of x abovePRINT *, SIZE(Y,1) ! We can examine the size of the first dimension

! but not the last one.PRINT *, Y(:,1) ! We can print out vectors from the firstPRINT *, Y(:,2) ! dimension, but not the last one.

END SUBROUTINESUBROUTINE SUB2(Y)

INTEGER Y(*) ! Y has a different rank than X above.PRINT *, Y(6) ! We have to know (or compute) the position of

! the last element. Nothing prevents us from! subscripting beyond the end.

END SUBROUTINE

TS 29113

例 2

REAL r1CALL sub(r1)!You can pass a scalar as the actual argument that corresponds!to an assumed-size dummy argument of assumed-type.CONTAINS

SUBROUTINE sub(arg)TYPE(*) :: arg(3, 2:*)

ENDEND

TS 29113

注:

1. 想定サイズ配列は、それが形状を必要としないサブプログラム参照内での実引数でない限りは、実行可能な構文内で全体配列として使用することはできません。

96 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 123: IBM XL Fortran for Linux, V15.1

! A is an assumed-size array.PRINT *, UBOUND(A,1) ! OK - only examines upper bound of first dimension.PRINT *, LBOUND(A) ! OK - only examines lower bound of each dimension.! However, 'B=UBOUND(A)' or 'A=5' would reference the upper bound of! the last dimension and are not allowed. SIZE(A) and SHAPE(A) are! also not allowed.

2. 想定サイズ配列のセクションが、その最後のセクションの添え字として、添え字トリプレットを持っている場合、上限を指定する必要があります。(配列セクションおよび添え字トリプレットについては、この後のセクションで説明します。)

! A is a 2-dimensional assumed-size arrayPRINT *, A(:, 6) ! Triplet with no upper bound is not last dimension.PRINT *, A(1, 1:10) ! Triplet in last dimension has upper bound of 10.PRINT *, A(5, 5:9:2) ! Triplet in last dimension has upper bound of 9.

想定ランク・オブジェクト (TS 29113)想定ランク・オブジェクトは、関連付けられた実引数から実行時に想定されたランクを持つ仮引数オブジェクトです。想定ランク・オブジェクトに対応する実引数は、配列であってもスカラーであってもかまいません。

Assumed_rank_spec

�� .. ��

想定ランク仮引数がスカラー実引数と関連付けられている場合は、その想定ランク仮引数のランクはゼロであり、その形状はゼロ・サイズの配列です。

制約事項:

v 想定ランク仮引数に対応する想定型実引数は、想定形状または想定ランクでなければなりません。

v 想定ランク・オブジェクトは、VALUE 属性を持つことはできません。

v 想定ランク・オブジェクトは、次のような形で使用される場合を除いて、指定子内や式内で使用することはできません。

– 想定ランクである仮引数に対応する実引数としての使用。

– ISO_C_BINDING 組み込みモジュール内での C_LOC 関数の引数としての使用。

– 組み込み照会関数への参照内での最初の引数としての使用。

例REAL :: a0REAL :: a1(10)REAL :: a2(10, 20)REAL, POINTER :: a3(:,:,:)

CALL sub1(a0)CALL sub1(a1)CALL sub1(a2)CALL sub1(a3)

第 5 章 配列の概念 97

Page 124: IBM XL Fortran for Linux, V15.1

CONTAINSSUBROUTINE sub1(a)

REAL :: a(..)PRINT *, RANK(a)

END

END

出力は次のようになります。

0123

関連情報v 110ページの『連続性 (Fortran 2008)』v 702ページの『LBOUND(ARRAY, DIM, KIND)』v 750ページの『RANK(A) (TS 29113)』v 785ページの『UBOUND(ARRAY, DIM, KIND)』v 538ページの『VALUE (Fortran 2003)』v 949ページの『想定ランク引数の相互運用性 (TS 29113)』

配列エレメント配列エレメントは、配列を構成するスカラー・データのことです。各エレメントは、そのデータ型、型パラメーター、および INTENT、PARAMETER、TARGET、 PROTECTED、ASYNCHRONOUS、および VOLATILE

属性を、その親配列から継承します。POINTER および ALLOCATABLE属性は継承されません。

構文

配列エレメントは、配列エレメント指定子 によって指定します。配列エレメント指定子の形式は、次のとおりです。

array_name

配列の名前です。

array_struct_comp

右端の comp_name が配列になっている構造体コンポーネントです。

subscript

スカラー整数式です。

XL Fortran では、subscript はスカラー実数式にすることもできます。

�� array_name ( subscript_list )array_struct_comp

��

98 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 125: IBM XL Fortran for Linux, V15.1

規則v 添え字の数は、配列内の次元の数と等しくなければなりません。

v array_struct_comp がある場合、構造体コンポーネントの各部分は、右端を除いて、ランクがゼロでなければなりません (つまり、配列名や配列セクションであってはなりません)。

v 各添え字式の値は、対応する次元の下限を下回ったり、上限を超えるようなことがあってはなりません。

v subscript 値は、各添え字式の値と配列の次元によって異なります。この値によって、配列エレメント指定子で指定される配列のエレメントが決まります。

配列エレメントの順序

配列のエレメントは、配列エレメント順序 と呼ばれる順序で、ストレージ内に並べられています。この順序では、最初の次元の添え字がまず変更され、それから、残りの次元の添え字が順次変更されます。

例えば、A(2, 3, 2) と宣言された配列は、次のようなエレメントの並びになります。

配列エレメントの位置 配列エレメントの順序------------------------- -------------------

A(1,1,1) 1A(2,1,1) 2A(1,2,1) 3A(2,2,1) 4A(1,3,1) 5A(2,3,1) 6A(1,1,2) 7A(2,1,2) 8A(1,2,2) 9A(2,2,2) 10A(1,3,2) 11A(2,3,2) 12

関連情報57ページの『派生型コンポーネント』104ページの『配列セクションと構造体コンポーネント』

配列セクション配列セクションは、配列の選択された部分です。配列セクションとは、配列からエレメントを指定したり、その配列の各エレメントから指定のサブストリングや派生型のコンポーネントを指定する配列サブオブジェクトのことです。配列セクションもまた配列の 1 つです。

注: この導入セクションでは、構造体コンポーネントを含まない簡単なケースについて説明しています。 104ページの『配列セクションと構造体コンポーネント』では、構造体コンポーネントにもなっている配列セクションの指定に関する追加規則について説明しています。

第 5 章 配列の概念 99

Page 126: IBM XL Fortran for Linux, V15.1

section_subscript

特定の次元に沿ったエレメントの一部の集合を指定します。次の組み合わせから構成されます。

subscript

スカラー整数式です。詳しくは、 98ページの『配列エレメント』を参照してください。

XL Fortran では、subscript はスカラー実数式にすることもできます。

subscript_triplet, vector_subscript

指定された次元内の添え字のシーケンスを指定します。詳しくは、101ページの『添え字トリプレット』および 103ページの『ベクトル添え字』を参照してください。

注:

v 配列セクションと配列エレメントを区別するために、少なくともいずれかの次元は、添え字トリプレットまたはベクトル添え字でなければなりません。 例 1 を参照してください。

v 配列セクションには、配列内で連続する配列エレメントのセットと、連続しない配列エレメントのセットのどちらも含めることができます。詳しくは、 110ページの『連続性 (Fortran 2008)』を参照してください。

substring_range

int_expr1, int_expr2

サブストリング式と呼ばれるスカラー整数式で、 50ページの『文字サブストリング』で定義されています。この式により、配列セクション内の各エレメントのサブストリングの左端および右端の文字位置をそれぞれ指定します。substring_range オプションがある場合、そのセクションは文字オブジェクトの配列からでなければなりません。詳しくは、 104ページの『サブストリングの範囲』 を参照してください。

�� array_name ( section_subscript_list )substring_range

��

�� subscriptsubscript_tripletvector_subscript

��

�� ( : )int_expr1 int_expr2

��

100 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 127: IBM XL Fortran for Linux, V15.1

配列セクションは、個々の添え字、添え字トリプレット、およびベクトル添え字の値のシーケンスで指定された配列エレメントを桁の順番に並べて形成されます。 例2 を参照してください。

例 1

INTEGER, DIMENSION(5,5,5) :: AA(1,2,3) = 100A(1,3,3) = 101PRINT *, A(1,2,3) ! A single array element, 100.PRINT *, A(1,2:2,3) ! A one-element array section, (/ 100 /)PRINT *, A(1,2:3,3) ! A two-element array section,

! (/ 100, 101 /)

例 2

SECTION = A(1:3, (/5, 6, 5/), 4) の場合

v 最初の次元の数字のシーケンスは、1、2、3 となります。

v 次の次元の数字のシーケンスは、5、6、5 となります。

v 3 番目の次元の添え字は、定数 4 になります。

このセクションは、A の次のエレメントでこの順序で構成されます。

A(1,5,4) | | SECTION(1,1)A(2,5,4) |----- First column -----| SECTION(2,1)A(3,5,4) | | SECTION(3,1)A(1,6,4) | | SECTION(1,2)A(2,6,4) |----- Second column ----| SECTION(2,2)A(3,6,4) | | SECTION(3,2)A(1,5,4) | | SECTION(1,3)A(2,5,4) |----- Third column -----| SECTION(2,3)A(3,5,4) | | SECTION(3,3)

例 3

配列セクションのその他の例を次に示します。

INTEGER, DIMENSION(20,20) :: A! These references to array sections require loops or multiple! statements in FORTRAN 77.PRINT *, A(1:5,1) ! Contiguous sequence of elementsPRINT *, A(1:20:2,10) ! Noncontiguous sequence of elementsPRINT *, A(:,5) ! An entire columnPRINT *, A( (/1,10,5/), (/7,3,1/) ) ! A 3x3 assortment of elements

関連情報v 57ページの『派生型コンポーネント』

添え字トリプレット添え字トリプレットは、2 つの添え字と 1 つのストライドで構成されています。添え字トリプレットは、単一の次元での配列エレメント位置に対応する数字のシーケンスを定義します。

第 5 章 配列の概念 101

Page 128: IBM XL Fortran for Linux, V15.1

subscript1

特定の次元について、指標のシーケンスの最初の値を指定する添え字です。

これを省略すると、その次元の配列境界の下限が使用されます。

subscript2

特定の次元について、指標のシーケンスの最後の値を指定する添え字です。

これを省略すると、その次元の配列境界の上限が使用されます。想定サイズ配列のセクションを指定する場合、最後の次元については、これが必須となります。

stride スカラー整数式です。この式で、選択された次のエレメントの添え字を示すために増分する数の幅 (ストライド) を指定します。

XL Fortran では、ストライドはスカラー実数式にすることもできます。

ストライドを省略すると、その値は 1 になります。ストライドは、ゼロ以外の値でなければなりません。

v 正のストライドは、最初の添え字 (subscript1) から始まり、2 番目の添え字 (subscript2) を超えない最大の整数に至るまで、そのストライドで指定した値ずつ増える整数のシーケンスを指定します。最初の添え字が 2 番目の添え字より大きい場合、シーケンスは空になります。

v ストライドが負の場合、シーケンスは、最初の添え字で始まり、2 番目の添え字以上の最小の整数に至るまで、そのストライドで示された増分値で数字が順次減少します。2 番目の添え字が最初の添え字より大きい場合、シーケンスは空になります。

シーケンスでの値の計算については、 154ページの『DO ステートメントの実行』で示された手順に従います。

配列セクションの配列エレメントを選択する時に使用したすべての値が宣言された境界の範囲内にあれば、添え字トリプレット内の添え字は、その次元について宣言された境界の範囲内である必要はありません。

INTEGER A(9)PRINT *, A(1:9:2) ! Count from 1 to 9 by 2s: 1, 3, 5, 7, 9.PRINT *, A(1:10:2) ! Count from 1 to 10 by 2s: 1, 3, 5, 7, 9.

! No element past A(9) is specified.

例REAL, DIMENSION(10) :: AINTEGER, DIMENSION(10,10) :: BCHARACTER(10) STRING(1:100)

PRINT *, A(:) ! Print all elements of array.PRINT *, A(:5) ! Print elements 1 through 5.PRINT *, A(3:) ! Print elements 3 through 10.

PRINT *, STRING(50:100) ! Print all characters in

�� :subscript1 subscript2 : stride

��

102 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 129: IBM XL Fortran for Linux, V15.1

! elements 50 through 100.

! The following statement is equivalent to A(2:10:2) = A(1:9:2)A(2::2) = A(:9:2) ! LHS = A(2), A(4), A(6), A(8), A(10)

! RHS = A(1), A(3), A(5), A(7), A(9)! The statement assigns the odd-numbered! elements to the even-numbered elements.

! The following statement is equivalent to PRINT *, B(1:4:3,1:7:6)PRINT *, B(:4:3,:7:6) ! Print B(1,1), B(4,1), B(1,7), B(4,7)

PRINT *, A(10:1:-1) ! Print elements in reverse order.

PRINT *, A(10:1:1) ! These two arePRINT *, A(1:10:-1) ! both zero-sized.END

ベクトル添え字ベクトル添え字は、ランク 1 の整数の配列式で、式のエレメントの値に対応する添え字のシーケンスを指定します。

ベクトル添え字は、XL Fortran の場合、ランク 1 の実数配列式にすることもできます。

シーケンスは、値の順番に従って並べる必要はありません。また、値が重複してもかまいません。

INTEGER A(10), B(3), C(3)PRINT *, A( (/ 10,9,8 /) ) ! Last 3 elements in reverse orderB = A( (/ 1,2,2 /) ) ! B(1) = A(1), B(2) = A(2), B(3) = A(2) alsoEND

ベクトル添え字に同じ値の複数のエレメントがある場合、そのベクトル添え字がある配列セクションは、 30ページの『変数の定義または未定義の構文コンテキスト』で言及されているどの状態にも指定することはできません。

注:

1. 内部ファイルとして使用される配列セクションには、ベクトル添え字は使えません。

2. ベクトル添え字を持つ配列セクションを実引数として渡す場合には、関連した仮引数を定義または再定義することはできません。

3. ベクトル添え字を持つ配列セクションは、ポインター代入ステートメントのターゲットにすることはできません。

4. F2008 XL Fortran では、ベクトル添え字を含むサイズがゼロでない配列セクションは、不連続とみなされます。詳しくは、『連続性』を参照してください。

F2008

! We can use the whole array VECTOR as a vector subscript for A and BINTEGER, DIMENSION(3) :: VECTOR= (/ 1,3,2 /), A, BINTEGER, DIMENSION(4) :: C = (/ 1,2,4,8 /)A(VECTOR) = B ! A(1) = B(1), A(3) = B(2), A(2) = B(3)A = B( (/ 3,2,1 /) ) ! A(1) = B(3), A(2) = B(2), A(3) = B(1)PRINT *, C(VECTOR(1:2)) ! Prints C(1), C(3)END

第 5 章 配列の概念 103

Page 130: IBM XL Fortran for Linux, V15.1

サブストリングの範囲サブストリングの範囲を持つ配列セクションの場合、結果における各エレメントは、その配列セクションの対応するエレメントの指定文字ストリングになります。右端の配列名またはコンポーネント名は、文字型でなければなりません。

PROGRAM SUBSTRINGTYPE DERIVED

CHARACTER(10) STRING(5) ! Each structure has 5 strings of 10 chars.END TYPE DERIVEDTYPE (DERIVED) VAR, ARRAY(3,3) ! A variable and an array of derived type.

VAR%STRING(:)(1:3) = 'abc' ! Assign to chars 1-3 of elements 1-5.VAR%STRING(3:)(4:6) = '123' ! Assign to chars 4-6 of elements 3-5.

ARRAY(1:3,2)%STRING(3)(5:10) = 'hello'! Assign to chars 5-10 of the third element in! ARRAY(1,2)%STRING, ARRAY(2,2)%STRING, and

END ! ARRAY(3,2)%STRING

配列セクションと構造体コンポーネント配列セクションと構造体コンポーネントがどのように相互処理されるかを理解するには、 57ページの『派生型コンポーネント』の構文について理解しておく必要があります。

このセクションの初めで配列セクションとして定義した内容は、実際には、可能な配列セクションの一部の定義に過ぎません。配列名または section_subscript_list を設定された配列名は、構造体コンポーネントのサブオブジェクトである場合があります。

このサブオブジェクト、struct_sect_subobj は、次のような構文になります。

object_name

派生型のオブジェクトの名前です。

section_subscript_list、substring_range

99ページの『配列セクション』で定義されているものと同じです。

comp_name

派生型コンポーネントの名前です。

�� object_name( section_subscript_list )

� � % comp_name. ( section_subscript_list )

�substring_range

��

104 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 131: IBM XL Fortran for Linux, V15.1

「%」または「.」区切り文字です。

注: . (ピリオド) 区切り文字は、IBM 拡張です。

注:

1. 最後のコンポーネントの型によって配列の型が決まります。

2. 構造体コンポーネントの 1 つの部分だけがゼロ以外のランクを持つことができます。右端の comp_name に、ゼロ以外のランクを持つ section_subscript_list を設定するか、あるいは、別の部分がゼロ以外のランクを持たなければなりません。

3. ゼロ以外のランクを持つ部分から右側のすべての部分には、ALLOCATABLE および POINTER 属性を設定できません。

TYPE BUILDING_TLOGICAL RESIDENTIAL

END TYPE BUILDING_T

TYPE STREET_TTYPE (BUILDING_T) ADDRESS(500)

END TYPE STREET_T

TYPE CITY_TTYPE (STREET_T) STREET(100,100)

END TYPE CITY_T

TYPE (CITY_T) PARISTYPE (STREET_T) STYPE (BUILDING_T) RESTAURANT! LHS is not an array section, no subscript triplets or vector subscripts.PARIS%STREET(10,20) = S! None of the parts are array sections, but the entire construct! is a section because STREET has a nonzero rank and is not! the rightmost part.PARIS%STREET%ADDRESS(100) = BUILDING_T(.TRUE.)

! STREET(50:100,10) is an array section, making the LHS an array section! with rank=1, shape=(/51/).! ADDRESS(123) must not be an array section because only one can appear! in a reference to a structure component.PARIS%STREET(50:100,10)%ADDRESS(123)%RESIDENTIAL = .TRUE.END

配列セクションのランクおよび形状構造体コンポーネントのサブオブジェクトではない配列セクションの場合、そのランクは section_subscript_list 内の添え字トリプレットおよびベクトル添え字の数です。形状配列内のエレメントの数は、添え字トリプレットとベクトル添え字の数と同じで、その形状配列内の各エレメントは、対応する添え字トリプレットまたはベクトル添え字によって指定されたシーケンス内の整数値の数です。

構造体コンポーネントのサブオブジェクトである配列セクションの場合、そのランクと形状は、配列名または配列セクションとなっているコンポーネント部分のランクおよび形状と同じです。

DIMENSION :: ARR1(10,20,100)TYPE STRUCT2_T

LOGICAL SCALAR_COMPONENTEND TYPETYPE STRUCT_T

TYPE (STRUCT2_T), DIMENSION(10,20,100) :: SECTION

第 5 章 配列の概念 105

Page 132: IBM XL Fortran for Linux, V15.1

END TYPE

TYPE (STRUCT_T) STRUCT

! One triplet + one vector subscript, rank = 2.! Triplet designates an extent of 10, vector subscript designates! an extent of 3, thus shape = (/ 10,3 /).ARR1(:, (/ 1,3,4 /), 10) = 0

! One triplet, rank = 1.! Triplet designates 5 values, thus shape = (/ 5 /).STRUCT%SECTION(1,10,1:5)%SCALAR_COMPONENT = .TRUE.

! Here SECTION is the part of the component that is an array,! so rank = 3 and shape = (/ 10,20,100 /), the same as SECTION.STRUCT%SECTION%SCALAR_COMPONENT = .TRUE.

配列コンストラクター配列コンストラクターとは、指定されたスカラー値の順序列のことです。配列コンストラクターは、そのエレメント値が順序列内で指定されたランク 1 の配列を構成します。組み込み関数を使えば、1 より大きいランクの配列を構成できます。詳しくは、 753ページの『RESHAPE(SOURCE, SHAPE, PAD, ORDER)』を参照してください。

構文

i_d_type_spec

intrinsic_type_spec または derived_type_spec です。使用できる型指定のリストについては、 526ページの『型宣言』を参照してください。

配列コンストラクターでは、BYTE を intrinsic_type_spec に指定することはできません。

ac_value

配列エレメントに値を指定する式または暗黙 DO リストです。

規則

i_d_type_spec は、配列コンストラクターの型および型パラメーターを指定します。各 ac_value 式は、型および型パラメーターを持つ変数に対する組み込み代入と互換性がなければなりません。各値は、配列コンストラクターの型パラメーターに変換されます。

�� (/ac_spec/)[ ac_spec ]

��

ここで、ac_spec は、次のようになります。

��

i_d_type_spec ::,

ac_valuei_d_type_spec ::

��

106 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 133: IBM XL Fortran for Linux, V15.1

v 組み込みの型を指定する場合、配列コンストラクターの ac_value 式は、指定する組み込みの型と互換性のある型でなければなりません。

v 派生型を指定する場合、配列コンストラクターのすべての ac_value 式が、その派生型でなければならず、かつ、その型パラメーター値も指定する型パラメーター値と同種のものでなければなりません。

i_d_type_spec が省略された場合、配列コンストラクターの各 ac_value 式に、同じ型および型パラメーターを設定する必要があります。

i_d_type_spec に ac_value がない場合、ゼロ・サイズ、ランク 1 の配列が作成されます。

ac_value は、以下の規則に従ってコンパイルされます。

v スカラー式の場合、その値は配列コンストラクターのエレメントを指定します。

v 配列式の場合、式のエレメントの値は、配列エレメントの順に、配列コンストラクターのエレメントの対応するシーケンスを指定します。

v 暗黙 DO リストの場合、DO 構文と同様で、そのリストが展開され、implied_do_variable の制御に従って、ac_value シーケンスが形成されます。

ac_value がポリモアフィック・エンティティーの場合は、宣言型が使用されます。制限のないポリモアフィック・エンティティーには宣言型がないため、これをac_value に使用することはできません。 -qxlf2003=dynamicacval を使用してプログラムをコンパイルする場合は、動的型の ac_value が使用されるため、ac_value に制限のないポリモアフィック・エンティティーを使用できます。

ac_value でのポリモアフィック・エンティティーの使用について詳しくは、例 2 を参照してください。

制限のないポリモアフィック・エンティティー、およびこれらのエンティティーの宣言型と動的型について詳しくは、『ポリモアフィック・エンティティー』を参照してください。

例 1: さまざまな配列コンストラクター

INTEGER, DIMENSION(5) :: a, b, c, d(2, 2)CHARACTER(5), DIMENSION(3) :: color

! Assign values to all elements in aa = (/1, 2, 3, 4, 5/)

! Assign values to some elementsa(3:5) = (/0, 1, 0/)

! Construct temporary logical maskc = MERGE(a, b, (/T, F, T, T, F/))

! The array constructor produces a rank-one array, which! is turned into a 2x2 array that can be assigned to d.d = RESHAPE(SOURCE = (/1, 2, 1, 2/), SHAPE = (/2, 2/))

第 5 章 配列の概念 107

Page 134: IBM XL Fortran for Linux, V15.1

! Here, the constructor linearizes the elements of d in! array-element order into a one-dimensional result.PRINT *, a((/d/))

! Without a type_spec,each character literal must be of length 5color = ['RED ', 'GREEN', 'BLUE ']

! With a type_spec, padding and truncation of each character literal occurscolor = [CHARACTER(5) :: 'RED', 'GREEN', 'BLUE']

例 2: ac_value にポリモアフィック・エンティティーを使用する場合

PROGRAM PolyAcValuesTYPE base

INTEGER :: iEND TYPE

TYPE, EXTENDS(base) :: childINTEGER :: j

END TYPE

TYPE(base) :: baseType = base(3)TYPE(child) :: childType = child(4, 6)

! Declare a polymorphic entity of base typeCLASS(base), ALLOCATABLE :: baseClass! Declare an unlimited polymorphic entity. It has no declared type.! Its dynamic type can be any derived type or intrinsic typeCLASS(*), ALLOCATABLE :: anyClass! Declare a deferred-shape array of unlimited polymorphic entitiesCLASS(*), ALLOCATABLE :: anyClassArr(:)

! Allocate a child item to baseClass. The dynamic type of bassClass is child.ALLOCATE(baseClass, source = childType)! Polymorphic entities used in the array constructorALLOCATE(anyClassArr(2), source = [baseClass, baseClass])

! Because the compiler uses the declared type, which is base, and the result! is "Base item: 4 4". If you specify -qxlf2003=dynamicacval, the compiler uses! the dynamic type, which is child, and the result is "Child item: 4,6 4,6".CALL printAny(anyClassArr, 2)DEALLOCATE(anyClassArr)DEALLOCATE(baseClass)

! Allocate a base item to anyClass. The dynamic type of anyClass is base.ALLOCATE(anyClass, source = baseType)! Unlimited polymorphic entities used in the array constructorALLOCATE(anyClassArr(2), source = [anyClass, anyClass])

! If you specify -qxlf2003=dynamicacval, the use of unlimited polymorphic! entities in the array constructor is valid, and the compiler uses the! dynamic type, which is base. The result is "Base item: 3 3"; Otherwise,! a severe error is issued at compile time.CALL printAny(anyClassArr, 2)DEALLOCATE(anyClassArr)DEALLOCATE(anyClass)

CONTAINSSUBROUTINE printAny(printItem, len)

CLASS(*) :: printItem(len)

DO i = 1, lenSELECT TYPE (item => printItem(i))

TYPE IS (base)PRINT *, 'Base item: ', item

108 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 135: IBM XL Fortran for Linux, V15.1

TYPE IS (child)PRINT *, 'Child item: ', item

END SELECTEND DO

END SUBROUTINEEND PROGRAM

関連情報v -qxlf2003=dynamicacvalオプション

v 22ページの『ポリモアフィック・エンティティー (Fortran 2003)』

配列コンストラクターの暗黙 DO リスト配列コンストラクター内の暗黙 DO ループは、一定の規則に従った、あるいは周期的な値シーケンスを作成し、各エレメントを個々に指定する手間を省く場合に便利です。

ループによって生成された値のシーケンスが空の場合、ランクが 1 のゼロ・サイズ配列が形成されます。

implied_do_variable

名前付きのスカラー整数変数、 または実数変数 です。

実行不能ステートメントでは、型は整数でなければなりません。制限式expr1 または expr2 では、implied_do_variable の値を参照しないでください。このループ処理では、 363ページの『DATA』に記載された暗黙 DOに対する規則と同じ規則に従い、暗黙 DO 変数の型に基づいて、整数または実数の演算を使用します。

この変数は、暗黙 DO の有効範囲を持ちますが、指定する配列コンストラクターの暗黙 DO の中の別の暗黙 DO 変数と同じ名前が入っていてはなりません。

M = 0PRINT *, (/ (M, M=1, 10) /) ! Array constructor implied-DOPRINT *, M ! M still 0 afterwardsPRINT *, (M, M=1, 10) ! Non-array-constructor implied-DOPRINT *, M ! This one goes to 11PRINT *, (/ ((M, M=1, 5), N=1, 3) /)! The result is a 15-element, one-dimensional array.! The inner loop cannot use N as its variable.

expr1, expr2, および expr3

スカラー整数式、 または、実数 式になります。

PRINT *, (/ (I, I = 1, 3) /)! Sequence is (1, 2, 3)PRINT *, (/ (I, I = 1, 10, 2) /)! Sequence is (1, 3, 5, 7, 9)PRINT *, (/ (I, I+1, I+2, I = 1, 3) /)! Sequence is (1, 2, 3, 2, 3, 4, 3, 4, 5)

�� ( ac_value_list , implied_do_variable = expr1 , expr2, expr3

) ��

第 5 章 配列の概念 109

Page 136: IBM XL Fortran for Linux, V15.1

PRINT *, (/ ( (I, I = 1, 3), J = 1, 3 ) /)! Sequence is (1, 2, 3, 1, 2, 3, 1, 2, 3)

PRINT *, (/ ( (I, I = 1, J), J = 1, 3 ) /)! Sequence is (1, 1, 2, 1, 2, 3)

PRINT *, (/2,3,(I, I+1, I = 5, 8)/)! Sequence is (2, 3, 5, 6, 6, 7, 7, 8, 8, 9).! The values in the implied-DO loop before! I=5 are calculated for each iteration of the loop.

連続性 (Fortran 2008)連続オブジェクトには、メモリーの連続するブロックが割り当てられています。連続オブジェクトを使用すると、オブジェクトのメモリー・レイアウトに依存する最適化をより簡単に行うことができます。

以下のいずれかの要件を満たしているオブジェクトは、連続していると見なされます。

v CONTIGUOUS 属性を持つオブジェクトである。

v 配列ポインターでも想定形状配列でもない全体配列である。

v ALLOCATE ステートメントによって割り当てられた配列である。

v 連続するターゲットに関連付けられたポインターである。

v 連続配列に関連付けられた引数である想定形状配列である。

v 以下の要件をすべて満たす、サイズがゼロでない配列セクションである。

– 基本オブジェクトが連続している。

– vector_subscript を持たない。

– 配列エレメントの順序に従って並んだセクションのエレメントが、配列エレメント順に連続している基本オブジェクト・エレメントのサブセットである。

– 配列が文字型で、substring_range が使用されている場合に、substring_range が親ストリングのすべての文字を指定している。

– 右端の comp_name だけがゼロ以外のランクである。

– 複素数型の配列の実数部でも虚数部でもない。

オブジェクトが配列サブオブジェクトで、以下の要件をすべて満たす場合、そのオブジェクトは連続していると見なされません。

v オブジェクトに 2 つ以上のエレメントがある。

v 配列エレメントの順序に従って並んだオブジェクトのエレメントが、基本オブジェクトのエレメントの中で連続していない。

v オブジェクトが長さがゼロの文字型ではない。

v オブジェクトが、サイズがゼロの配列と長さがゼロの文字だけで構成される派生型ではない。

注: 上記のシナリオに加えて、XL Fortran が、それ自体のルールに基づいて、オブジェクトが連続しているかどうかを判別します。

110 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 137: IBM XL Fortran for Linux, V15.1

単純連続

単純連続配列とは、XL Fortran コンパイラーがコンパイル時に連続していると判断できる配列です。

section_subscript_list は、以下のすべての要件を満たしている場合に限り、単純連続配列セクションを指定します。

v vector_subscript を持たない。

v subscript_triplet のうち最後のものを除くすべてがコロンである。

v 最後の subscript_triplet に stride が設定されていない。

v subscript である section_subscript が前に付く subscript_triplet がない。

配列サブオブジェクト指定子は、以下のいずれかの要件を満たしている場合に限り、単純連続と見なされます。

v CONTIGUOUS 属性を持つ object_name。

v ポインターではなく、想定形状配列ではなく、 TS 29113 また割り振り不可の想定

ランク・オブジェクトでもない TS 29113 object_name。

v 右端の part_name が配列である構造体コンポーネント。右端の part_name にCONTIGUOUS 属性が設定されているか、これがポインターではない。

v 以下の要件をすべて満たす配列セクション。

– 複素数部指定子 ではない。

– substring_range を持たない。

– 右端の comp_name がゼロ以外のランクである。

– 右端の part_name に CONTIGUOUS 属性が設定されているか、これが想定形状でもポインターでもない。

– section_subscript_list を持たないか、単純連続セクションを指定するsection_subscript_list を持つ。

配列変数は、以下のいずれかの要件を満たしている場合に限り、単純連続と見なされます。

v 単純連続である配列サブオブジェクト指定子である。

v CONTIGUOUS 属性を持つポインターを返す関数への参照である。

注: 上記のシナリオに加えて、XL Fortran が、それ自体のルールに基づいて、コンパイル時に連続性を判別する場合があります。

関連情報v 配列セクションv CONTIGUOUS

配列を含む式配列は、スカラーと同じ種類の式および演算で使用できます。組み込み演算、代入、またはエレメント型プロシージャーは 1 つ以上の配列に適用できます。

第 5 章 配列の概念 111

Page 138: IBM XL Fortran for Linux, V15.1

組み込み演算の場合、2 つ以上の配列オペランドを含む式では、各配列の対応するエレメントを割り当てまたは評価できるように、配列は同じ形状でなければなりません。定義済みオペレーションの場合は、配列は異なる形状でもかまいません。同じ形状を持つ配列間には、整合性 があります。整合性のあるエンティティーが予期されるコンテキストでは、スカラー値を使用することもできます。これは、どの配列とも整合性がとれ、各配列エレメントがスカラー値を持つ配列と同様に処理されます。

例INTEGER, DIMENSION(5,5) :: A,B,CREAL, DIMENSION(10) :: X,Y! Here are some operations on arraysA = B + C ! Add corresponding elements of both arrays.A = -B ! Assign the negative of each element of B.A = MAX(A,B,C) ! A(i,j) = MAX( A(i,j), B(i,j), C(i,j) )X = SIN(Y) ! Calculate the sine of each element.! These operations show how scalars are conformable with arraysA = A + 5 ! Add 5 to each element.A = 10 ! Assign 10 to each element.A = MAX(B, C, 5) ! A(i,j) = MAX( B(i,j), C(i,j), 5 )

END

関連情報623ページの『エレメント型組み込みプロシージャー』130ページの『組み込み代入』545ページの『WHERE』では、配列内の一部のエレメントだけに値を割り当てる方法を示しています。141ページの『FORALL 構文』

112 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 139: IBM XL Fortran for Linux, V15.1

第 6 章 式および代入

式および代入の概要式とは、データの参照または計算のことで、オペランド、演算子、および括弧で構成されます。式を計算すると、宣言型、動的型、形状、および型パラメーターを持った値が生成されます。

オペランド は、スカラーまたは配列のいずれかです。演算子 は、組み込みまたは定義済み演算子のいずれかです。単項演算の形式は次のとおりです。

v 演算子 オペランド

2 項演算の形式は次のとおりです。

v operand1 operator operand2

括弧内の式は、データ・エンティティーとして扱われます。括弧は、式の明示的解釈を指定する場合に使用されます。また、式に複数の代替形式がある場合にこれを限定するために括弧を使用することもできます。これは、式の計算時に中間値の大きさと精度を制御するためのものです。例として、次の 2 つの式を考えます。

(I*J)/KI*(J/K)

この 2 つの式は、数学的には等価ですが、評価の結果としては異なる計算値が出ることもあります。

1 次式1 次式 は、最も単純な形式の式です。これは、次のいずれかのエレメントです。

v %kind などの型パラメーター照会

v 型パラメーター名

v データ・オブジェクト

v 配列コンストラクター

v 構造体コンストラクター

v 複素数コンストラクター

v 関数参照

v 括弧の付いた式

1 次式がデータ・オブジェクトの場合、想定サイズ配列にはできません。

1 次式の例12.3 ! Constant'ABCDEFG'(2:3) ! Subobject of a constantVAR ! Variable name(/7.0,8.0/) ! Array constructorEMP(6,'SMITH') ! Structure constructorSIN(X) ! Function reference(T-1) ! Expression in parentheses

© Copyright IBM Corp. 1996, 2015 113

Page 140: IBM XL Fortran for Linux, V15.1

型、パラメーター、および形状1 次式の型、型パラメーター、および形状は、次のように決定されます。

v データ・オブジェクトまたは関数参照の場合、そのオブジェクトまたは関数参照の型、型パラメーター、および形状をそれぞれ獲得します。総称関数参照の型、パラメーターおよび形状は、その実引数の型、パラメーター、およびランクによって決定されます。

v 型パラメーター照会または型パラメーター名は、kind 型パラメーターを持つスカラー整数です。

v 構造体コンストラクターはスカラーで、その型およびパラメーターは、構造体コンストラクターの derived_type_spec によって決定されます。

v 配列コンストラクターは、コンストラクター式の数によって形状が決まり、その型およびパラメーターは、コンストラクター式の型およびパラメーターによって決定されます。

v 括弧で囲んだ式は、その式の型、パラメーター、および形状を獲得します。

ポインターが演算に 1 次式として入れられ、そのポインターがポインター以外の仮引数に関連付けられている場合、ターゲットが参照されます。1 次式の型、パラメーター、および形状は、ターゲットの型、パラメーターおよび形状になります。ポインターがターゲットと関連していない場合、そのポインターは、対応する仮引数がポインターとなるプロシージャー参照内の実引数、またはポインター代入ステートメント内のターゲットとしてのみ指定できます。関連付けが解除されたポインターは、ASSOCIATED 組み込み照会関数に対する実引数としても指定できます。

組み込み演算 [ expr1] op expr2 がある場合、その演算の形状は、op が単項式か、expr1 がスカラーの場合、expr2 の形状となります。そうでない場合、その形状はexpr1 の形状になります。

式の型および形状は、演算子および式の 1 次式の型と形状によって決まります。式の型は、組み込み型または派生型です。組み込み型の式には、kind パラメーターがあり、これが文字型の場合には、さらに length パラメーターもあります。派生型の式には、kind パラメーターと length パラメーターを両方とも入れることができます。

定数式定数式とは、各演算が組み込みで、各 1 次式が次のいずれかである式のことです。

注: Fortran 2003 では、定数式は初期化式と呼ばれています。

v 定数または定数のサブオブジェクト

v 各コンポーネントが定数式である構造体コンストラクター

v 各エレメントおよび各暗黙 DO の境界とストライドに関して、その 1 次式が、定数式または暗黙 DO 変数のいずれかの式である配列コンストラクター

v 割り振り可能コンポーネントに対応する各式が、組み込み関数 NULL に対する参照であり、その他すべての式が定数式となっている構造体コンストラクター。

v 各引数が定数式であるエレメント型組み込み関数の参照

v 非定数式によって想定または定義される型パラメーターが設定された引数のない組み込み関数 NULL に対する参照

114 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 141: IBM XL Fortran for Linux, V15.1

v 各引数が定数式となっているベクトル組み込み関数 VEC_CONVERT に対する参照。

v 各引数が定数式となっている、COMMAND_ARGUMENT_COUNT およびNULL 以外の変換組み込み関数に対する参照。

v 各引数が定数式となっている、組み込みモジュール IEEE_ARITHMETIC からの変換組み込み関数 IEEE_SELECTED_REAL_KIND に対する参照。

v 派生型定義の中にある、定義される型、またはその親の型の kind 型パラメーター

v 各指定子または関数引数が定数式か、または定数式でない式によって想定、据え置き、および定義されないプロパティーを持つ変数のいずれかである宣言照会。

v data-implied-DO 内の data-i-DO 変数

v 対応する acimplied-DO コントロールの各 scalar-int-expr が定数式である配列コンストラクター内の ac-DO 変数

v 括弧の付いた定数式

各添え字、セクション添え字、サブストリング開始点、サブストリング終点、および型パラメーター値が定数式の場合もこれらの規則が適用されます。

定数式に、同じ宣言部分に指定された TYPE パラメーターまたはオブジェクトの配列境界に依存する宣言照会が含まれる場合、その型パラメーターまたは配列境界は、宣言部分の前の部分で指定しなければなりません。前の部分の指定は、同じステートメントの宣言照会 の左側でもかまいませんが、同じエンティティー宣言内であってはなりません。

さまざまな定数式の例を以下に示します。

-48.9name('Pat','Doe')TRIM('ABC ')(MOD(9,4)**3.5)3.4**3KIND(57438)(/'desk','lamp'/)'ab'//'cd'//'ef'

定数式にエレメント型組み込み関数 SIN が使用されている例:

integer, parameter :: foo = 42.0 * sin(0.5)

定数式に変形可能組み込み関数 CSHIFT が使用されている例:

integer, parameter :: a(3) = (/ 1, 2, 3 /)integer, parameter :: a_cshifted(3) = cshift(a,2)

宣言式宣言式は、文字長や配列境界などの項目を指定するために使用する制限を指定した式です。

宣言式は、スカラー、整数の制限式です。

制限式 とは、各演算が組み込みで、各 1 次式が次のような式です。

第 6 章 式および代入 115

Page 142: IBM XL Fortran for Linux, V15.1

v 定義される派生型の型パラメーター。

v 定数または定数のサブオブジェクト

v OPTIONAL 属性および INTENT(OUT) 属性のいずれもない仮引数である変数、あるいはその変数のサブオブジェクト

v 共通ブロック内にある変数、またはその変数のサブオブジェクト

v 使用関連付けまたはホスト関連付けによってアクセス可能な変数、またはその変数のサブオブジェクト

v 各エレメントおよび各暗黙 DO の境界とストライドに関して、その 1 次式が、制限式または暗黙 DO 変数のいずれかの式である配列コンストラクター

v 各コンポーネントが制限式である構造体コンストラクター

v 各指定子または関数引数が制限式か、または制限式でない式によって想定、据え置き、および定義されないプロパティーを持つ変数のいずれかである宣言照会

v 本書で定義されているその他の組み込み関数に対する参照で、その各引数が制限式である場合

v システム照会関数に対する参照で、すべての引数が制限式になっている場合

v 添え字式またはサブストリング式は、すべて制限式でなければなりません。

v すべての引数が制限式になっている、宣言関数に対する参照。

宣言照会 の参照先になるものは次のとおりです。

v 組み込み照会関数

v 型パラメーター照会 (6.4.5)

v IEEE 照会関数 (14.10)

宣言関数 は、宣言式内で使用することができます。関数は、組み込み、内部、またはステートメント関数でない純粋な関数である場合、宣言関数です。宣言関数には、ダミー・プロシージャー引数を設定することはできません。

同一の有効範囲単位内の以前の宣言、有効範囲単位に対して現在有効な暗黙の入力規則、あるいはホスト関連付けや使用関連付けによって指定されているものがある場合、宣言式内の変数は、型および型パラメーターがなければなりません。宣言式内の変数が暗黙型指定規則によって型指定される場合、後続の型宣言ステートメントにその変数が現われるときは、常に暗黙型および型パラメーターを確認しなければなりません。

同一の宣言部分に指定されたエンティティーの配列境界または型パラメーターに関する照会関数への参照が宣言式に含まれる場合、型パラメーターまたは配列境界を、宣言部分の前の部分で指定しなければなりません。宣言式が、同じ宣言部分で指定された配列のエレメントの値に対する参照を含む場合、その配列境界は、それより前の宣言で指定しなければなりません。前の宣言は、同じステートメント内の照会関数の左側でもかまいません。

例LBOUND(C,2)+6 ! C is an assumed-shape dummy arrayABS(I)*J ! I and J are scalar integer variables276/NN(4) ! NN is accessible through host association

116 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 143: IBM XL Fortran for Linux, V15.1

以下の例では、ユーザー定義の純粋関数 fact を、配列値の関数結果の変数の宣言式内で使用しています。

MODULE MODCONTAINS

INTEGER PURE FUNCTION FACT(N)INTEGER, INTENT(IN) :: N...END FUNCTION FACT

END MODULE MOD

PROGRAM PPRINT *, PERMUTE('ABCD')CONTAINSFUNCTION PERMUTE(ARG)

USE MODCHARACTER(*), INTENT(IN) :: ARG...CHARACTER(LEN(ARG)) :: PERMUTE(FACT(LEN(ARG)))...

END FUNCTION PERMUTEEND PROGRAM P

演算子と式このセクションでは、XL Fortran の式 表に示された各 XL Fortran 式の詳細を説明します。式の計算の優先順位については、『式の計算』を参照してください。

表 15. XL Fortran の式

算術演算子 論理演算子

文字演算子 1 次式

一般 関係式

算術算術式 (arith_expr) を計算されると、数値が得られます。arith_expr の形式は、次のとおりです。

arith_term の形式は、次のとおりです。

arith_factor の形式は、次のとおりです。

�� arith_term+

arith_expr -

��

��arith_term /

*

arith_factor ��

第 6 章 式および代入 117

Page 144: IBM XL Fortran for Linux, V15.1

arith_primary は算術型の 1 次式です。

次の表は、使用可能な算術演算子と、算術式内での各演算子の演算優先順位を示しています。

算術演算子 表記 優先順位

** 指数 最優先

* 乗算 2 番目

/ 除算 2 番目

+ 加算または恒等 3 番目

- 減算または否定 3 番目

XL Fortran では、2 つ以上の加算または減算演算子が含まれている算術式の各項は、左から右に向かって計算されます。例えば、2+3+4 は、(2+3)+4 として計算されます。ただし、式が数学的に等価で、括弧を正しく考慮すれば、プロセッサーで別の解釈をすることもできます。

2 つ以上の乗算演算子または除算演算子が含まれている各項を計算する場合は、因数は左から右に向かって計算されます。例えば、2*3*4 は、(2*3)*4 と計算されます。

2 つ以上の指数演算子を含んでいる因数が計算される場合、1 次式は右から左に向かって計算されます。例えば、2**3**4 は、2**(3**4) と計算されます。(この場合も、数学的に等価の解釈は認められます。)

XL Fortran では、優先順位の異なる演算子が 2 つ以上含まれている算術式を計算する場合、演算子の優先順位で、計算の順序が決められます。例えば、式 -A**3 の場合、指数演算子 (**) の方が否定演算子 (-) よりも優先順位が高くなります。したがって、指数演算子のオペランドは結合され、否定演算子のオペランドとして使用される式が形成されます。すなわち、-A**3 は、 -(A**3) と計算されます。

A**-B または A*-B のように、2 つの算術演算子を連続して使用する式は、認められませんので注意してください。これらは、A**(-B) および A*(-B) のようにすれば使用できます。

式で、整数による整数の除算を指定している場合、その結果は、ゼロに近い方の整数に丸められます。例えば、(-7)/3 の値は、-2 となります。

浮動小数点式の計算時に発生する例外条件の詳細については、『浮動小数点例外の検出とトラップ』を参照してください。

�� arith_primary** arith_factor

��

118 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 145: IBM XL Fortran for Linux, V15.1

算術式の例

算術式 括弧を使った等価の式

-b**2/2.0 -((b**2)/2.0)

i**j**2 i**(j**2)

a/b**2 - c (a/(b**2)) - c

算術式のデータ型恒等演算子および否定演算子は 1 つのオペランドに対してのみ演算を行うため、演算結果の値の型は、オペランドの型と同じになります。

次の表は、オペランドが対になっている場合に算術演算子が演算を行った時に得られる型を示したものです。

表中の表記法: T(param)、T はデータ型 (I: 整数、R: 実数、X: 複素数) を示し、param は kind 型パラメーターを示します。

表 16. 2 項算術演算子の結果型

第 1 オペランド

第 2 オペランド

I(1) I(2) I(4) I(8) R(4) R(8) R(16) X(4) X(8) X(16)I(1) I(1) I(2) I(4) I(8) R(4) R(8) R(16) X(4) X(8) X(16)I(2) I(2) I(2) I(4) I(8) R(4) R(8) R(16) X(4) X(8) X(16)I(4) I(4) I(4) I(4) I(8) R(4) R(8) R(16) X(4) X(8) X(16)I(8) I(8) I(8) I(8) I(8) R(4) R(8) R(16) X(4) X(8) X(16)R(4) R(4) R(4) R(4) R(4) R(4) R(8) R(16) X(4) X(8) X(16)R(8) R(8) R(8) R(8) R(8) R(8) R(8) R(16) X(8) X(8) X(16)

R(16) R(16) R(16) R(16) R(16) R(16) R(16) R(16) X(16) X(16) X(16)X(4) X(4) X(4) X(4) X(4) X(4) X(8) X(16) X(4) X(8) X(16)X(8) X(8) X(8) X(8) X(8) X(8) X(8) X(16) X(8) X(8) X(16)

X(16) X(16) X(16) X(16) X(16) X(16) X(16) X(16) X(16) X(16) X(16)

注:

1. XL Fortran では、INTEGER(4) の算術を使用して整数の演算を行います。また、データ項目の長さが 8 バイトの場合は、INTEGER(8) の算術が使用されます。 INTEGER(1) または INTEGER(2) データ型を必要とするコンテキストで中間結果を使用すると、その結果は必要に応じて変換されます。

INTEGER(2) I2_1, I2_2, I2_RESULTINTEGER(4) I4I2_1 = 32767 ! Maximum I(2)I2_2 = 32767 ! Maximum I(2)I4 = I2_1 + I2_2PRINT *, "I4=", I4 ! Prints I4=-2

I2_RESULT = I2_1 + I2_2 ! Assignment to I(2) variableI4 = I2_RESULT ! and then assigned to an I(4)PRINT *, "I4=", I4 ! Prints I4=-2END

第 6 章 式および代入 119

Page 146: IBM XL Fortran for Linux, V15.1

文字演算子文字式を評価すると、文字型の結果が生成されます。 char_expr の形式は、次のとおりです。

char_primary は、文字型の 1 次式です。文字式の中の文字 1 次式はすべて、同じkind 型パラメーターでなければならず、これは、また、結果の型パラメーターにもなります。

文字演算子は、// のみで、これは連結を表します。

1 つ以上の連結演算子が含まれている文字式の場合、1 次式が連結され、長さがそれぞれの合計長になる 1 つのストリングになります。例えば、 'AB'//'CD'//'EF'

を評価すると、'ABCDEF' という長さ 6 文字のストリングになります。

文字式に括弧を付けても、結果の値は変わりません。

括弧で囲まれたアスタリスクで長さを宣言するとき、文字式にオペランドの連結を含めることができます。これは、継承された長さを示します。この場合、実際の長さは、継承された長さの文字ストリングを使用して、以下のいずれかを宣言するかによって異なります。

v FUNCTION、SUBROUTINE、または、ENTRY ステートメントに指定された仮引数。仮引数の長さは、呼び出しで関連付けられた実引数の長さになります。

v 名前付き定数。この場合、定数値の長さになります。

v 外部関数の結果の長さ。呼び出し側の有効範囲単位は、アスタリスクで関数名を宣言することはできません。呼び出し時には、関数結果の長さは、この定義された長さになります。

例CHARACTER(7) FIRSTNAME,LASTNAMEFIRSTNAME='Martha'LASTNAME='Edwards'PRINT *, LASTNAME//', '//FIRSTNAME ! Output:'Edwards, Martha'END

一般一般式の形式 (general_expr) は次のとおりです。

��char_expr //

char_primary ��

��general_expr defined_binary_op

expr ��

120 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 147: IBM XL Fortran for Linux, V15.1

defined_binary_op

定義済みの 2 項演算子です。 125ページの『拡張組み込み演算および定義済み演算』を参照してください。

expr 次に定義する 4 種類の式のうちのいずれかです。

組み込み式には、算術式、文字式、関係式、論理式の 4 種類があります。

論理演算子論理式 (logical_expr) を評価すると、論理型の結果が生成されます。論理式の形式は、次のとおりです。

logical_disjunct の形式は、次のとおりです。

logical_term の形式は、次のとおりです。

logical_factor の形式は、次のとおりです。

logical_primary は、論理型の 1 次式です。

rel_expr は、関係式です。

論理演算子には、次のものがあります。

��logical_expr .EQV.

.NEQV.(1)

.XOR.

logical_disjunct ��

注:

1 XL Fortran 論理演算子

��logical_disjunct .OR.

logical_term ��

��logical_term .AND.

logical_factor ��

��logical_primary

.NOT. rel_expr

��

第 6 章 式および代入 121

Page 148: IBM XL Fortran for Linux, V15.1

論理演算子 演算子の意味 優先順位

.NOT. 論理否定 1 番目 (最優先)

.AND. 論理積 2 番目

.OR. 包括的論理和 3 番目

.XOR. �1� 排他的論理和 4 番目 (最下位)

.EQV. 論理等価 4 番目 (最下位)

.NEQV. 論理非等価 4 番目 (最下位)

注:

1. XL Fortran 論理演算子

.XOR. 演算子は、-qxlf77=intxor コンパイラー・オプションを指定した場合にのみ、組み込み演算子として扱われます。(詳細については、「XL Fortran コンパイラー・リファレンス」の -qxlf77 オプションを参照してください。) このオプションを指定しない場合は、定義済み演算子として扱われます。 .XOR. を組み込み演算子として扱うと、総称インターフェースにより、.XOR. を拡張することもできます。

優先順位の異なる 2 つ以上の演算子が含まれている論理式を評価する場合、演算子の優先順位によって評価の順序が決められます。例えば、A.OR.B.AND.C という式の評価は、 A.OR.(B.AND.C) の評価と同じになります。

論理式の値x1 および x2 が論理値であると仮定した場合、次の表を使用すれば、論理式の値を判別できます。

x1 .NOT. x1

真 偽

偽 真

x1 x2 .AND. .OR. .XOR. .EQV. .NEQV.

偽 偽 偽 偽 偽 真 偽

偽 真 偽 真 真 偽 真

真 偽 偽 真 真 偽 真

真 真 真 真 偽 真 偽

論理式の値を求めるとき、必ずしも式全体が評価されなくてもよい場合があります。次のような論理式を考えます (LFCT が、論理型の関数であるとします):

A .LT. B .OR. LFCT(Z)

A が B より小さい場合は、関数参照が評価されなくても、この式が真であることがわかります。

XL Fortran では、LOGICAL(n) または INTEGER(n) (n は kind 型パラメーター)

の結果に対して論理式を評価します。n の値は、各オペランドの kind パラメーターによって異なります。

122 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 149: IBM XL Fortran for Linux, V15.1

デフォルトでは、単項論理演算子 .NOT. の場合、n は、オペランドの kind 型パラメーターと同じになります。例えば、オペランドが LOGICAL(2) ならば、結果もLOGICAL(2) になります。

次の表に単項演算の結果の型を示します。

オペランド 単項演算の結果

BYTE�1� INTEGER(1)�1�

LOGICAL(1) LOGICAL(1)

LOGICAL(2) LOGICAL(2)

LOGICAL(4) LOGICAL(4)

LOGICAL(8) LOGICAL(8)

型なし �1� デフォルトの整数 �1�

注:

1. IBM 拡張

2 つのオペランドの長さが同じである場合は、n はその長さになります。

異なる kind 型パラメーターを持つオペランドが指定された 2 項論理演算の場合、式の kind 型パラメーターは 2 つのオペランドのうちの長い方と同じになります。例えば、片方のオペランドが LOGICAL(4) で、もう片方が LOGICAL(2)ならば、結果は LOGICAL(4) になります。

次の表に 2 項演算の結果の型を示します。

表 17. 2 項論理式の結果型

第 2 オペランド

第 1

オペランド *BYTE LOGICAL(1) LOGICAL(2) LOGICAL(4) LOGICAL(8) *型なし*BYTE *INTEGER(1) *LOGICAL(1) *LOGICAL(2) *LOGICAL(4) *LOGICAL(8) *INTEGER(1)

LOGICAL(1) LOGICAL(1) LOGICAL(1) LOGICAL(2) LOGICAL(4) LOGICAL(8) LOGICAL(1)LOGICAL(2) LOGICAL(2) LOGICAL(2) LOGICAL(2) LOGICAL(4) LOGICAL(8) LOGICAL(2)LOGICAL(4) LOGICAL(4) LOGICAL(4) LOGICAL(4) LOGICAL(4) LOGICAL(8) LOGICAL(4)LOGICAL(8) LOGICAL(8) LOGICAL(8) LOGICAL(8) LOGICAL(8) LOGICAL(8) LOGICAL(8)

*型なし *INTEGER(1) *LOGICAL(1) *LOGICAL(2) *LOGICAL(4) *LOGICAL(8) *デフォルトの整数

注: * XL Fortran における 2 項論理式の結果の型

式の結果がデフォルトの整数として扱われるようになっていたものの、その値がデフォルト整数の値の範囲内で表現できない場合、その定数は表現可能な種類にプロモートされます。

1 次式1 次式の形式は、次のとおりです。

第 6 章 式および代入 123

Page 150: IBM XL Fortran for Linux, V15.1

defined_unary_op

定義済みの単項演算子です。 125ページの『拡張組み込み演算および定義済み演算』を参照してください。

関係演算子関係式 (rel_expr) を評価すると、論理型の結果が生成されます。関係式は、論理式が指定される場所ならば、どこでも指定できます。関係式は、算術関係式または文字関係式のいずれかになります。

算術関係式算術関係式は、2 つの算術式の値を比較します。式の形式は次のとおりです。

arith_expr1 および arith_expr2算術式です。複素式で指定できるのは、relational_operator が、.EQ.、.NE.、<>>、==、または /= の場合に限られます。

relational_operator

次のいずれかの関係演算子を指定します。

関係演算子 演算子の意味

.LT. または < より小さい

.LE. または <= 以下

.EQ. または == 等しい

.NE. または /= または <> 等しくない

.GT. または > より大きい

.GE. または >= 以上

演算子で指定された関係をオペランドの各値が満足する場合、その算術関係式の論理値は、 .true. であると解釈されます。指定された関係をオペランドの値が満足していない場合には、式の論理値は、.false. となります。

式の型または kind 型パラメーターが異なる場合、その式の値は評価の前にその式(arith_expr1 + arith_expr2) の型および kind 型パラメーターに変換されます。

例IF (NODAYS .GT. 365) YEARTYPE = 'leapyear'

�� primarydefined_unary_op

��

�� arith_expr1 relational_operator arith_expr2 ��

124 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 151: IBM XL Fortran for Linux, V15.1

文字関係式文字関係式は、2 つの文字式の値を比較します。式の形式は次のとおりです。

char_expr1 および char_expr2

それぞれ文字式です。

relational_operator

124ページの『算術関係式』で説明されている関係演算子です。

どのような関係演算子の場合でも、文字関係式の解釈には、照合シーケンスを使用します。照合シーケンスの低い値を持つ文字式の方が、高い値を持つ文字式よりも小さいと見なされます。文字式は、一度に 1 文字ずつ、左から右に向かって評価されます。また、組み込み関数 (LGE、LLT、および LLT) を使用すれば、ASCII 照合シーケンスで指定された順序で、文字ストリングを比較することもできます。どのような関係演算子についても、オペランドの長さが等しくない場合は、短い方のオペランドの右側にブランクが追加されます。char_expr1 と char_expr2 の長さが両方ともゼロの場合、これらは等しいと見なされます。

char_expr1 および char_expr2 が XL Fortran のマルチバイト文字 (MBCS)

の場合でも、ASCII 照合シーケンスが使用されます。

例IF (CHARIN .GT. '0' .AND. CHARIN .LE. '9') CHAR_TYPE = 'digit'

拡張組み込み演算および定義済み演算定義済み演算は、定義済み単項演算または定義済み 2 項演算のいずれかです。この演算は、関数および総称インターフェース・ブロックによって定義されます ( 185

ページの『インターフェース・ブロック』および 68ページの『型制約プロシージャー (Fortran 2003)』を参照してください)。定義済み演算は、組み込み演算ではありませんが、組み込み演算子を定義済み演算で拡張することはできます。例えば、加算の組み込み 2 項演算子 (+) の意味を拡張することによって、派生型の 2 つのオブジェクトを加算することができます。拡張組み込み演算子に型なしのオペランドがある場合、その演算は組み込みとして評価されます。

拡張される単項組み込み演算のオペランドは、組み込み演算子で要求される型にすることはできません。拡張される 2 項組み込み演算子のオペランドのいずれか、またはその両方は、組み込み演算子で必要とされる型およびランクを持つことはできません。

定義済み演算の定義済み演算子は、総称インターフェースの中で定義されなければなりません。

定義済み演算子は、拡張された組み込み演算子であり、次の形式になります。

�� char_expr1 relational_operator char_expr2 ��

第 6 章 式および代入 125

Page 152: IBM XL Fortran for Linux, V15.1

Fortran 90 および Fortran 95 では、定義済み演算子の文字数は、31 文字までです。また、定義済み演算子は、組み込み演算子または論理リテラル定数と同じであってはなりません。 Fortran 2003 では、定義済み演算子の文字数制限は、63 文字となっています。

インターフェース・ブロック内の演算子の定義と拡張の詳細については、 189ページの『総称インターフェース・ブロック』を参照してください。派生型にバインドされている演算子の定義と拡張の詳細については、 68ページの『型制約プロシージャー (Fortran 2003)』を参照してください。

式の評価について

演算子の優先順位1 つの式には、複数の種類の演算子を入れることができます。その場合、式は、次のような演算子の優先順位に従って、左から右に向かって評価、計算されます。

1. 定義済み単項演算子

2. 算術

3. 文字演算子

4. 関係演算子

5. 論理演算子

6. 定義済み 2 項演算子

例えば、次のような論理式があるとします。

L .OR. A + B .GE. C

ここで、L が論理型で A、B、C が実数型だとすると、この式は以下の論理式と同じ評価、計算になります。

L .OR. ((A + B) .GE. C)

拡張組み込み演算子は、その優先順位を維持します。つまりその演算子は、定義済み単項演算子や定義済み 2 項演算子の優先順位を持つわけではありません。

�� �. letter .(1)

_(2)

$

��

注:

1 XL Fortran 定義済み演算子

2 XL Fortran 定義済み演算子

126 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 153: IBM XL Fortran for Linux, V15.1

解釈規則の要約演算子を使った 1 次式は、次の順序で組み合わされます。

1. 括弧の使用

2. 演算子の優先順位

3. 因数の指数を右から左に向かって解釈する

4. 項内の乗算および除算を左から右に向かって解釈する

5. 算術式内の加算および減算を左から右に向かって解釈する

6. 文字式内の連結を左から右に向かって解釈する

7. 論理項内の論理積を左から右に向かって解釈する

8. 論理和内の論理和を左から右に向かって解釈する

9. 論理式内の論理等価を左から右に向かって解釈する

式の評価算術式、文字式、関係式、論理式は、次の規則に従って評価、計算されます。

v 変数または関数は、その使用時に定義されていなければなりません。整数オペランドは、ステートメント・ラベル値ではなく、整数値で定義してください。文字データ・オブジェクト内で参照される文字、または、配列や配列セクション内で参照される配列エレメントは、すべて参照実行時に定義されていなければなりません。構造体のすべてのコンポーネントは、構造体が参照される時点で定義されていなければなりません。ポインターは、定義済みターゲットに関連付ける必要があります。

配列エレメントの参照、配列セクションの参照、および添え字の参照を実行するには、その添え字、セクション添え字、およびサブストリング式の評価が必要となります。配列エレメント添え字、セクション添え字、サブストリング式の評価や、配列コンストラクターの暗黙 DO の境界およびストライドの評価は、内包する式の型の影響を受けることはなく、また、型に影響を与えることもありません。詳しくは、 111ページの『配列を含む式』を参照してください。計算結果の値が実行可能プログラム内で数学的に定義されていない定数整数演算または浮動小数点演算は使用できません。このような式が定数以外のもので実行された場合、式は実行時に検出されます。(例えば、ゼロ除算、およびゼロ値の 1 次式に対するゼロ値または負数値の累乗演算)。また、負数の 1 次式に対して実数型での累乗演算を行うこともできません。

v ステートメント内で関数を呼び出した場合、それが関数参照のあるステートメント内の他のエンティティーの評価、計算に影響を与えたり、そのような評価、計算によって影響を受けるようなことがあってはなりません。ある式の値が真の場合に、論理 IF ステートメントまたは WHERE ステートメントの式の中で関数参照を呼び出すと、実行されるステートメント内のエンティティーに影響を与える場合があります。関数参照によって関数の実引数が定義または未定義にされる場合、その引数または関連するエンティティーを同じステートメント内の他の場所に指定してはなりません。次に例を示します。

A(I) = FUNC1(I)Y = FUNC2(X) + X

上記のようなステートメントは、FUNC1 の参照によって I が定義される場合、または FUNC2 の参照によって X が定義される場合には使用できません。

第 6 章 式および代入 127

Page 154: IBM XL Fortran for Linux, V15.1

関数参照を含む式のデータ型は、その関数の実引数の評価によって、影響を受けることはなく、逆に評価に影響を与えることもありません。

v ステートメント関数参照の引数は、その参照の評価によって変えることはできません。

コンパイラー・オプションの中には最終結果のデータ型に影響を与えるものもあります。

v -qintlog コンパイラー・オプションを使用すると、式およびステートメント内で整数と論理値を混在させることができます。その計算結果のデータ型および kind

型パラメーターは、関係するオペランドと演算子によって異なります。一般的には、以下のようになります。

– 論理単項演算子 (.NOT.) および算術単項演算子 (+、-) の場合

オペランドのデータ型 単項演算結果のデータ型

BYTE INTEGER(1)

INTEGER(n) INTEGER(n)

LOGICAL(n) LOGICAL(n)

型なし デフォルトの整数

上記の n は、kind 型パラメーターを表しています。n は、 -qintlog がオンの場合でも論理定数と置き換えることができず、 -qctyplss がオンの場合でも文字定数で置き換えることができません。また、型なし定数にすることもできません。 INTEGER および LOGICAL データ型の場合、結果の長さはオペランドの kind 型パラメーターの長さと同じになります。

– 2 進論理演算子 (.AND.、 .OR.、 .XOR.、 .EQV.、 .NEQV.)、および算術 2

項演算子 (**、*、 /、 +、 -) に関して、次の表に結果のデータ型の種類をまとめてあります。

第 2 オペランド

第 1

オペランド BYTE INTEGER(y) LOGICAL(y) 型なしBYTE INTEGER(1) INTEGER(y) LOGICAL(y) INTEGER(1)

INTEGER(x) INTEGER(x) INTEGER(z) INTEGER(z) INTEGER(x)LOGICAL(x) LOGICAL(x) INTEGER(z) LOGICAL(z) LOGICAL(x)型なし INTEGER(1) INTEGER(y) LOGICAL(y) デフォルトの整数

注: z は、結果の kind 型パラメーターで、 z は、x と y のうちの大きい方に等しくなります。例えば、LOGICAL(4) 型のオペランドと INTEGER(2) 型のオペランドが設定された論理式の結果は、 INTEGER(4) になります。

2 進論理演算子 (.AND.、 .OR.、 .XOR.、 .EQV.、 .NEQV.) の場合、整数型のオペランドと論理型のオペランド間または 2 つの整数型のオペランド間の論理演算の結果は、整数型になります。結果の kind 型パラメーターは、2 つのオペランドのうちの長い方の長さになります。 2 つのオペランドの kind パラメーターが同じである場合、結果は、その kind パラメーターになります。

v -qlog4 コンパイラー・オプションを使用し、デフォルトの整数サイズがINTEGER(4) の場合は、論理演算の論理結果は、上記の表に示す LOGICAL(n)

128 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 155: IBM XL Fortran for Linux, V15.1

ではなく、LOGICAL(4) 型になります。-qlog4 オプションを指定し、デフォルトの整数サイズが INTEGER(4) でない場合は、その結果は上記の表に指定したものと同じになります。

v -qctyplss コンパイラー・オプションを指定すると、XL Fortran は、文字定数式をホレリス定数として扱います。オペランドのいずれか一方または両方が文字定数式である場合は、その結果のデータ型と長さは、文字定数式がホレリス定数である場合と同じになります。結果のデータ型と長さについては、上記の表の『型なし』の行を参照してください。

コンパイラー・オプションの内容については、「XL Fortran コンパイラー・リファレンス」の『機能カテゴリー別コンパイラー・オプションの概要 』および『XL

Fortran コンパイラー・オプションの詳細記述』を参照してください。

BYTE データ・オブジェクトの使用法 (IBM 拡張)BYTE 型のデータ・オブジェクトは、LOGICAL(1)、CHARACTER(1)、または、INTEGER(1) データ・オブジェクトが使用できるところであればどこでも使用することができます。

BYTE データ・オブジェクトのデータ型は、それを使用するコンテキストによって決まります。 XL Fortran は、使用前には変換を行いません。例えば、名前付き定数の型は、最初に割り当てられた値によってではなく、使用することによって決まります。

v BYTE データ・オブジェクトを 2 項の算術演算子、論理演算子、関係演算子のオペランドとして使用すると、データ・オブジェクトのデータ型は次のようになります。

– もう片方のオペランドが算術、BYTE、または型なし定数の場合は、INTEGER(1) データ型

– もう片方のオペランドが論理定数の場合は、LOGICAL(1) データ型

– もう片方のオペランドが文字定数の場合は、CHARACTER(1) データ型

v BYTE データ・オブジェクトを連結演算子のオペランドとして使用すると、データ・オブジェクトのデータ型は CHARACTER(1) になります。

v BYTE データ・オブジェクトを、明示的インターフェースが設定されたプロシージャーの実引数として使用すると、データ・オブジェクトのデータ型は対応する仮引数の型になります。

– INTEGER(1) 仮引数の場合は INTEGER(1)

– LOGICAL(1) 仮引数の場合は LOGICAL(1)

– CHARACTER(1) 仮引数の場合は CHARACTER(1)

v BYTE データ・オブジェクトを、暗黙インターフェースが設定された外部サブプログラムに対する参照によって渡される実引数として使用すると、そのデータ・オブジェクトは、1 バイトの長さになり、データ型は想定されません。

v BYTE データ・オブジェクトを、値 (VALUE 属性) によって渡される実引数として使用すると、データ・オブジェクトは INTEGER(1) データ型になります。

v BYTE データ・オブジェクトを、算術、論理、または文字のいずれかの特定のデータ型を必要とするコンテキストの中で使用すると、そのデータ・オブジェクト

第 6 章 式および代入 129

Page 156: IBM XL Fortran for Linux, V15.1

のデータ型は、それぞれ INTEGER(1)、LOGICAL(1)、または、CHARACTER(1) のいずれかの型になります。

v BYTE 型のポインターを、文字型のターゲットに関連させることはできません。また、文字型のポインターを BYTE 型のターゲットに関連させることもできません。

v BYTE データ・オブジェクトをその他のコンテキストの中で使用する場合、データ・オブジェクトのデータ型は、INTEGER(1) データ型になります。

組み込み代入代入ステートメントは、式の計算結果に基づいて、変数を定義または再定義する実行可能ステートメントです。

定義済みの代入は、組み込みではなく、サブルーチンおよびインターフェース・ブロックによって定義されます。 193ページの『定義済み代入』を参照してください。

組み込み代入の一般的な形式は、次のとおりです。

F2008 variable がポリモアフィックである場合は、以下の規則が適用されます。

v variable は割り振り可能でなければなりません。

v variable には expression との型互換性がなければなりません。あるいは、variable

および expression の宣言型は 表 18 に示された事項に準拠していなければなりません。 F2008

variable と expression の形状は、variable が割り振り可能配列である場合を除き、整合性がとれていなければなりません。variable が割り振り可能配列で、-qxlf2003=autorealloc が指定されている場合、 variable および expression は、ランクが異なる配列であってはなりません。

expression が配列の場合、variable も配列でなければなりません ( 111ページの『配列を含む式』を参照してください)。expression がスカラーで、variable が配列の場合、その expression は、variable と同じ形状の配列として扱われ、すべての配列エレメントの値が expression のスカラー値と同じ値になります。 variable は「多対1」配列セクションにしてはなりません (詳細は、 103ページの『ベクトル添え字』を参照してください)。また、variable、expression のいずれも想定サイズ配列にすることはできません。

variable および expression の型は、表 18 に示された事項に準拠していなければなりません。

表 18. 組み込み代入ステートメントの型準拠

variable の型 expression の型

数値 数値

�� variable = expression ��

130 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 157: IBM XL Fortran for Linux, V15.1

表 18. 組み込み代入ステートメントの型準拠 (続き)

variable の型 expression の型

論理演算子 論理演算子

文字演算子 文字演算子

派生型 派生型 (variable と同じ)

数値代入ステートメントでは、variable および expression に異なる数値型、および異なる kind 型パラメーターを指定できます。論理代入ステートメントの場合、kind

型パラメーターは異なってもかまいません。文字代入ステートメントの場合、length

型パラメーターは異なってもかまいません。

文字変数が文字式よりも長い場合、その文字式は、文字変数と長さが等しくなるまで、ブランクで右側方向に拡張されます。文字変数が文字式よりも短い場合、その文字式は、文字変数と長さが等しくなるように右側が切り捨てられます。

variable がポインターの場合、expression と整合性がとれた型、型パラメーター、および形状を持つ定義可能なターゲットに関連付けなければなりません。そうすることにより、expression の値が、variable に関連付けられたターゲットに代入されます。

variable および expression のいずれにも、variable の任意の部分に対する参照を入れることができます。

variable が割り振り済みの割り振り可能変数である場合、以下のいずれかの条件が満たされていると、この変数は割り振り解除されます。

v expression が、異なる形状の配列である。

v variable と expression の対応する長さ型パラメーター値のいずれかが異なる。

v F2008 variable がポリモアフィックであり、expression とは異なる動的型を持っている。 F2008

variable が割り振り解除された割り振り可能変数であるか、またはそのような変数になると、その割り振りは以下のように行われます。

v expression が配列である場合、variable は、expression の形状と、LBOUND(expression) の対応するエレメントに等しい各下限境界を使用して割り振られます。

v variable が配列であり、expression がスカラーである場合、variable は、その元の境界を使用して割り振られます。

v variable の据え置き型パラメーターはそれぞれ、expression の対応する型パラメーターに等しくなります。

v F2008 variable がポリモアフィックである場合、この変数は expression と同じ動的型を使用して割り振られます。 F2008

再割り振りをサポートする場合、-qxlf2003=autorealloc を指定してください。詳しくは、「XL Fortran コンパイラー・リファレンス」 の -qxlf2003=autorealloc オプションを参照してください。

代入ステートメントによって、expression および代入前の variable 内のすべての式の計算、必要に応じて expression を variable の型や型パラメーターに変換するこ

第 6 章 式および代入 131

Page 158: IBM XL Fortran for Linux, V15.1

と、および結果値による variable の定義が行われます。長さがゼロの文字オブジェクトまたはサイズがゼロの配列の場合、variable に対して値は代入されません。

派生型のオブジェクトに対してアクセス可能な定義済み代入がない場合、その派生型代入ステートメントは、組み込み代入ステートメントになります。派生型の式は、変数と同じ宣言型でなければなりません。変数の各 kind 型パラメーターは、対応する kind 型の式と同じ値を持つ必要があります。変数が割り振り可能でなく、その対応する型パラメーターが据え置き型でない限り、変数の各 length 型パラメーターは、対応する型パラメーターの式と同じ値を持つ必要があります。 2 つの構造体が同じ派生型の構造体であるかどうかを判別する規則については、 78ページの『派生型の宣言型の決定』を参照してください。代入は、式の各コンポーネントが対応する変数のコンポーネントに代入されるのと同様に行われます。ポインターの代入は、ポインター・コンポーネントに対して実行され、定義済み代入は、型の定義済み代入がコンポーネントと整合性のある、非ポインターの割り振り不可コンポーネントに対して実行されます。また、組み込み代入は、ポインター以外の割り振り不可コンポーネントに対して相互に実行されます。

割り振り可能コンポーネントを含む派生型のオブジェクトの組み込み代入の場合、変数の割り振り可能コンポーネントは、割り振り状況と、式の対応するコンポーネントの境界および値 (割り振り済みである場合) を受け取ります。これは、以下の一連のステップが適用された場合と同じように行われます。

1. variable のコンポーネントが割り振り済みの場合は、割り振りが解除されます。

2. 対応する expression のコンポーネントが割り振り済みの場合は、対応するvariable のコンポーネントが、expression のコンポーネントと同じ型および型パラメーターで割り振られます。配列の場合は、同じ境界で割り振られます。

3. 次に、expression のコンポーネントの値が、次の代入を使用して、対応するvariable のコンポーネントに代入されます。

v コンポーネントの宣言型にそのコンポーネントと整合性のある定義済み代入がある場合、その定義済み代入。

v 整合性のある定義済み代入がない場合は、そのコンポーネントの動的型の組み込み代入

variable がサブオブジェクトである場合、代入は、定義状況やオブジェクトの他の部分の値に影響しません。

算術変換数値組み込み代入の場合、expression の値は、以下の表に示すように、 variable の型および kind 型パラメーターに変換されることがあります。

variable の型 代入される値

整数 INT(expression,KIND=KIND(variable))

実数 REAL(expression,KIND=KIND(variable))

複素数 CMPLX(expression,KIND=KIND(variable))

注: INTEGER(8) データ項目の算術整数演算は、中間結果も含め、のいずれの場合も INTEGER(8) 算術型を使用して実行されます。中間結果を含むデータ・オブジェ

132 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 159: IBM XL Fortran for Linux, V15.1

クト INTEGER(1)、INTEGER(2)、および INTEGER(4) の算術整数演算は、32 ビット・モードでは INTEGER(8) 算術を使って行われます。より小さい整数サイズを必要とするコンテキストに中間結果が使用される場合、その中間結果は必要に応じて変換されます。

文字代入評価する必要があるのは、文字変数を定義するのに必要となる分の文字式だけになります。以下に例を示します。

CHARACTER SCOTT*4, DICK*8SCOTT = DICK

DICK を SCOTT に代入するこの代入で、事前に定義する必要があるのは、サブストリング DICK(1:4) だけです。残りの DICK (DICK(5:8)) は、事前に定義しておく必要はありません。

BYTE 代入expression が算術型の場合、算術代入が使用されます。同様に、expression

が文字型の場合は、文字代入が、expression が論理型の場合は、論理代入が使用されます。式の右辺が、BYTE 型の場合は、算術代入が使用されます。

例INTEGER I(10)LOGICAL INSIDEREAL R,RMIN,RMAXREAL :: A=2.3,B=4.5,C=6.7TYPE PERSON

INTEGER(4) P_AGECHARACTER(20) P_NAME

END TYPETYPE (PERSON) EMP1, EMP2CHARACTER(10) :: CH = 'ABCDEFGHIJ'

I = 5 ! All elements of I assigned value of 5

RMIN = 28.5 ; RMAX = 29.5R = (-B + SQRT(B**2 - 4.0*A*C))/(2.0*A)INSIDE = (R .GE. RMIN) .AND. (R .LE. RMAX)

CH(2:4) = CH(3:5) ! CH is now 'ACDEEFGHIJ'

EMP1 = PERSON(45, 'Frank Jones')EMP2 = EMP1

! EMP2%P_AGE is assigned EMP1%P_AGE using arithmetic assignment! EMP2%P_NAME is assigned EMP1%P_NAME using character assignment

END

WHERE 構文WHERE 構文は、配列代入ステートメントにおける値の式および代入の評価をマスクします。このマスクは、論理配列式の値に応じて実行されます。

第 6 章 式および代入 133

Page 160: IBM XL Fortran for Linux, V15.1

WHERE_construct_statement

構文の詳細については、 545ページの『WHERE』を参照してください。

where_body_construct

where_assignment_statement

assignment_statement が入ります。

masked_ELSEWHERE_block

masked_ELSEWHERE_statement

mask_expr を指定する ELSEWHERE ステートメントです。構文の詳細については、 386ページの『ELSEWHERE』を参照してください。

ELSEWHERE_block

ELSEWHERE_statement

mask_expr を指定しない ELSEWHERE ステートメントです。構文の詳細については、 386ページの『ELSEWHERE』を参照してください。

�� WHERE_construct_statement �

where_body_construct�

� �

masked_ELSEWHERE_block

ELSEWHERE_block�

� END_WHERE_statement ��

�� where_assignment_statementWHERE_statementWHERE_construct

��

�� masked_ELSEWHERE_statementwhere_body_construct

��

�� ELSEWHERE_statementwhere_body_construct

��

134 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 161: IBM XL Fortran for Linux, V15.1

END_WHERE_statement

構文の詳細については、 389ページの『END (構文)』を参照してください。

規則:

v mask_expr は、論理配列式です。

v 各 where_assignment_statement では、mask_expr と、定義される変数 variable

は、同じ形状の配列でなければなりません。

v where_body_construct に含まれるステートメントは、分岐ターゲット・ステートメントにすることはできません。また、ELSEWHERE、マスクされたELSEWHERE、および END WHERE ステートメントは、分岐ターゲット・ステートメントにすることはできません。

v 定義済み代入である where_assignment_statement は、エレメント型定義済み代入にする必要があります。

v WHERE 構文ステートメント上の mask_expr、および対応するマスクされたすべての ELSEWHERE ステートメントは、同じ形状でなければなりません。ネストされた WHERE ステートメント上、またはネストされた WHERE 構文ステートメント上の mask_expr は、ネストされている構文の WHERE 構文ステートメント上の mask_expr と同じ形状になっていなければなりません。

v 構文名を WHERE 構文ステートメントに指定する場合、対応する ENDWHERE ステートメントにもその名前を指定する必要があります。構文名は、マスクされた ELSEWHERE ステートメント、および WHERE 構文内のELSEWHERE ステートメントの場合は、任意指定になります。

例REAL, DIMENSION(10) :: A,B,C,DWHERE (A>0.0)

A = LOG(A) ! Only the positive elements of A! are used in the LOG calculation.

B = A ! The mask uses the original array A! instead of the new array A.

C = A / SUM(LOG(A)) ! A is evaluated by LOG, but! the resulting array is an! argument to a non-elemental! function. All elements in A will! be used in evaluating SUM.

END WHERE

WHERE (D>0.0)C = CSHIFT(A, 1) ! CSHIFT applies to all elements in array A,

! and the array element values of D determine! which CSHIFT expression determines the! corresponding element values of C.

ELSEWHEREC = CSHIFT(A, 2)

END WHEREEND

以下の例は、WHERE 構文ステートメント内、およびマスクされた ELSEWHEREmask_expr 内の配列コンストラクターを示しています。

CALL SUB((/ 0, -4, 3, 6, 11, -2, 7, 14 /))

CONTAINSSUBROUTINE SUB(ARR)

第 6 章 式および代入 135

Page 162: IBM XL Fortran for Linux, V15.1

INTEGER ARR(:)INTEGER N

N = SIZE(ARR)

! Data in array ARR at this point:!! A = | 0 -4 3 6 11 -2 7 14 |

WHERE (ARR < 0)ARR = 0

ELSEWHERE (ARR < ARR((/(N-I, I=0, N-1)/)))ARR = 2

END WHERE

! Data in array ARR at this point:!! A = | 2 0 3 2 11 0 7 14 |

END SUBROUTINEEND

以下に例は、ネストされた WHERE 構文ステートメント、およびマスクされたELSEWHERE ステートメントに where_construct_name を指定した例を示しています。

INTEGER :: A(10, 10), B(10, 10)...OUTERWHERE: WHERE (A < 10)

INNERWHERE: WHERE (A < 0)B = 0

ELSEWHERE (A < 5) INNERWHEREB = 5

ELSEWHERE INNERWHEREB = 10

END WHERE INNERWHEREELSEWHERE OUTERWHERE

B = AEND WHERE OUTERWHERE...

マスクされた配列代入の解釈マスクされた配列代入の解釈方法を理解するには、制御マスク (mc) および保留制御マスク (mp) の概念について理解する必要があります。

v mc は、論理型の配列で、その値によって where_assignment_statement のどの配列のエレメントを定義するかが決定されます。この値は、以下のいずれかを実行することによって決まります。

– WHERE ステートメント

– WHERE 構文ステートメント

– ELSEWHERE ステートメント

– マスクされた ELSEWHERE ステートメント

– END WHERE ステートメント

mc の値は累積的です。つまり、コンパイラーは前後の WHERE ステートメントのマスク式および現在のマスク式を使ってその値を決定します。mask_expr 内のエンティティーの値に対して後から変更が加えられても、mc の値には影響はあり

136 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 163: IBM XL Fortran for Linux, V15.1

ません。コンパイラーは、mask_expr を、WHERE ステートメント、WHERE 構文ステートメント、または、マスクされた ELSEWHERE ステートメントごとに一度だけ評価されます。

v mp は論理配列で、現在の WHERE ステートメント、WHERE 構文ステートメント、または、マスクされた ELSEWHERE ステートメントによって定義されていない配列エレメント上の同じネスト・レベルで、マスクされた次の代入ステートメントに情報を提供します。

以下では、コンパイラーが、WHERE、WHERE 構文、マスクされたELSEWHERE、ELSEWHERE、または、END WHERE ステートメント内のステートメントをどのように解釈するかを説明します。mc および mp、さらにステートメントの動作に対する影響について、発生順に説明します。

v WHERE ステートメント

– WHERE ステートメントが WHERE 構文の内部でネストされている場合、次のようになります。

1. mc が、mc .AND. mask_expr になります。

2. コンパイラーが WHERE ステートメントを実行すると、mc の値は、WHERE ステートメントの実行前の値になります。

– 実行されない場合、mc は mask_expr になります。

v WHERE 構文

– WHERE 構文が別の WHERE 構文の内部でネストされている場合、次のようになります。

1. mp が、mc .AND. (.NOT. mask_expr) になります。

2. mc が、mc .AND. mask_expr になります。

– ネストされていない場合は、次のようになります。

1. コンパイラーが、mask_expr を評価し、mc にその mask_expr の値を代入します。

2. mp が、.NOT. mask_expr になります。

v マスクされた ELSEWHERE ステートメント

次のようになります。

1. mc が、mp になります。

2. mp が、mc .AND. (.NOT. mask_expr) になります。

3. mc が、mc .AND. mask_expr になります。

v ELSEWHERE ステートメント

次のようになります。

1. mc が、mp になります。新たな mp の値は設定されません。

v END WHERE ステートメント

コンパイラーが END WHERE ステートメントを実行すると、 mc および mp の値は、WHERE 構文ステートメントの実行前の値になります。

v where_assignment_statement

第 6 章 式および代入 137

Page 164: IBM XL Fortran for Linux, V15.1

コンパイラーは、mc の真の値に対応する expr の値を、対応する variable のエレメントに代入します。

非エレメント型関数参照が、where_assignment_statement の expr または variable

内、または、mask_expr 内にある場合、コンパイラーはマスクされた制御なしで関数を評価します。つまり、関数の引数式をすべて完全に評価し、それによって完全に関数を評価します。結果が配列で、参照が非エレメント型関数の引数リストにない場合、コンパイラーは、 expr、variable、または mask_expr の評価に使用するため、mc 内の真の値に対応するエレメントを選択します。

エレメント型の組み込み演算または関数参照が、where_assignment_statement の expr

または variable 内、あるいは、mask_expr 内で発生し、非エレメント型関数参照の引数リストにない場合、コンパイラーは、mc 内の真の値に対応するエレメントに対してのみ演算を実行する、あるいは関数を計算します。

配列コンストラクターが where_assignment_statement または mask_expr にある場合、コンパイラーは、マスクされた制御なしで配列コンストラクターを評価し、それから where_assignment_statement を実行し、または、mask_expr を評価します。

WHERE ステートメントの mask_expr 内の関数参照を実行することにより、where_assignment_statement 内のエンティティーに影響を与えることができます。END WHERE を実行しても、影響はありません。

次の例では、制御マスクがどのように更新されるかを示しています。この例で、mask1、 mask2、mask3、および mask4 は適合論理配列、mc は制御マスク、 mp は保留制御マスクです。コンパイラーは、各マスク式を一度評価します。

サンプル・コード (コメントにステートメント番号を示しています):

WHERE (mask1) ! W1WHERE (mask2) ! W2... ! W3ELSEWHERE (mask3) ! W4... ! W5END WHERE ! W6

ELSEWHERE (mask4) ! W7... ! W8ELSEWHERE ! W9... ! W10END WHERE ! W11

以下に示すとおり、各ステートメントを実行するたびにコンパイラーは制御マスクおよび保留制御マスクを設定します。

Statement W1

mc = mask1

mp = .NOT. mask1

Statement W2

mp = mask1 .AND. (.NOT. mask2)

mc = mask1 .AND. mask2

Statement W4

mc = mask1 .AND. (.NOT. mask2)

mp = mask1 .AND. (.NOT. mask2)

.AND. (.NOT. mask3)

138 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 165: IBM XL Fortran for Linux, V15.1

mc = mask1 .AND. (.NOT. mask2)

.AND. mask3

Statement W6

mc = mask1

mp = .NOT. mask1

Statement W7

mc = .NOT. mask1

mp = (.NOT. mask1) .AND. (.NOT.

mask4)

mc = (.NOT. mask1) .AND. mask4

Statement W9

mc = (.NOT. mask1) .AND. (.NOT.

mask4)

Statement W11

mc = 0

mp = 0

コンパイラーは、ステートメント W2、W4、W7、および W9 によって設定された制御マスクの値を、where_assignment_statement の W3、W5、 W8、および W10 を実行するときにそれぞれ使用します。

例REAL, DIMENSION(10) :: A,B,C,DWHERE (A>0.0)

A = LOG(A) ! Only the positive elements of A! are used in the LOG calculation.

B = A ! The mask uses the original array A! instead of the new array A.

C = A / SUM(LOG(A)) ! A is evaluated by LOG, but! the resulting array is an! argument to a non-elemental

マイグレーションのためのヒント:

配列の論理評価を単純化します。

FORTRAN 77 ソース:

INTEGER A(10,10),B(10,10)

...DO I=1,10

DO J=1,10IF (A(I,J).LT.B(I,J)) A(I,J)=B(I,J)

END DOEND DOEND

Fortran 90 または Fortran 95 ソース:

INTEGER A(10,10),B(10,10)

...WHERE (A.LT.B) A=BEND

第 6 章 式および代入 139

Page 166: IBM XL Fortran for Linux, V15.1

! function. All elements in A will! be used in evaluating SUM.

END WHERE

WHERE (D>0.0)C = CSHIFT(A, 1) ! CSHIFT applies to all elements in array A,

! and the array element values of D determine! which CSHIFT expression determines the! corresponding element values of C.

ELSEWHEREC = CSHIFT(A, 2)

END WHEREEND

以下の例は、WHERE 構文ステートメント内、およびマスクされた ELSEWHEREmask_expr 内の配列コンストラクターを示しています。

CALL SUB((/ 0, -4, 3, 6, 11, -2, 7, 14 /))

CONTAINSSUBROUTINE SUB(ARR)INTEGER ARR(:)INTEGER N

N = SIZE(ARR)

! Data in array ARR at this point:!! A = | 0 -4 3 6 11 -2 7 14 |

WHERE (ARR < 0)ARR = 0

ELSEWHERE (ARR < ARR((/(N-I, I=0, N-1)/)))ARR = 2

END WHERE

! Data in array ARR at this point:!! A = | 2 0 3 2 11 0 7 14 |

END SUBROUTINEEND

以下に例は、ネストされた WHERE 構文ステートメント、およびマスクされたELSEWHERE ステートメントに where_construct_name を指定した例を示しています。

INTEGER :: A(10, 10), B(10, 10)...OUTERWHERE: WHERE (A < 10)

INNERWHERE: WHERE (A < 0)B = 0

ELSEWHERE (A < 5) INNERWHEREB = 5

ELSEWHERE INNERWHEREB = 10

END WHERE INNERWHEREELSEWHERE OUTERWHERE

B = AEND WHERE OUTERWHERE...

140 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 167: IBM XL Fortran for Linux, V15.1

FORALL 構文

FORALL 構文は、サブオブジェクトのグループへの代入、特に配列エレメントへの代入を実行します。

WHERE 構文とは異なり、FORALL は、配列エレメント、配列セクションおよびサブストリングの代入を実行します。FORALL 構文内のそれぞれの代入は、直前の代入との整合性を保持する必要はありません。FORALL 構文には、構文には、ネストされた FORALL ステートメント、FORALL 構文、WHERE ステートメント、および WHERE 構文を入れることができます。

-qxlf2003=autorealloc は、FORALL 構文には適用されません。 FORALL 構文内の代入ステートメントの実行中は、割り振り可能変数の再割り振りは行われません。

INDEPENDENT ディレクティブは、FORALL 構文内の代入の両側がオーバーラップしないことを指定します。

FORALL_construct_statement

構文の詳細については、 415ページの『FORALL (構文)』を参照してください。

END_FORALL_statement

構文の詳細については、 389ページの『END (構文)』を参照してください。

forall_body

次の 1 つ以上ステートメントまたは構文です。forall_assignment

WHERE ステートメント ( 545ページの『WHERE』を参照)

WHERE 構文 ( 133ページの『WHERE 構文』を参照)

FORALL ステートメント ( 411ページの『FORALL』を参照)

FORALL 構文

forall_assignment

assignment_statement か pointer_assignment_statement のいずれかです。

定義済み演算子、定義済み代入、または、最終化によって参照されたプロシージャーを含め、 forall_body 内で参照されるプロシージャーは、すべて純粋でなければなりません。

�� FORALL_construct_statement ��

�� forall_body ��

�� END_FORALL_statement ��

第 6 章 式および代入 141

Page 168: IBM XL Fortran for Linux, V15.1

FORALL ステートメントまたは構文が、FORALL 構文内でネストされている場合、内側の FORALL ステートメントまたは構文は、外側の FORALL 構文内で使用されている index_name を再定義することはできません。

同じステートメントの中で、複数回、アトミック・オブジェクトを代入したり、関連付け状況を変更したりすることはできませんが、同じ FORALL 構文の中にある別の代入ステートメントでは、アトミック・オブジェクトを再定義、および再関連付けすることができます。また、WHERE 構文内の各 WHERE 構文および代入ステートメントは、次の制限に従う必要があります。

FORALL_construct_name を指定する場合、FORALL ステートメントと ENDFORALL ステートメントの両方に指定する必要があります。END FORALL ステートメント、および FORALL 構文内のどのステートメントも分岐ターゲット・ステートメントにすることはできません。

FORALL 構文の解釈1. FORALL 構文の中の各 forall_triplet_spec の subscript および stride 式は、任意の順序で評価されます。index_name 値の可能性のあるペアすべてが、組み合わせのセットを形成します。例えば、次のようなステートメントを想定します。

FORALL (I=1:3,J=4:5)

I および J の組み合わせのセットは、以下のようになります。

{(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)}

-1 および -qnozerosize コンパイラー・オプションは、このステップに影響を与えません。

2. 組み合わせの集合の scalar_mask_expr は順序に関係なく評価され (FORALL 構造ステートメントにある)、アクティブな組み合わせの集合が作成されます(.TRUE. と評価されたもの). 例えば、マスク (I+J.NE.6) が上記のセットに適用された場合、アクティブな組み合わせのセットは、以下のようになります。

{(1,4),(2,5),(3,4),(3,5)}

3. それぞれの forall_body ステートメントまたは構文を出現順に実行します。アクティブな組み合わせの集合に対して、それぞれのステートメントまたは構文が、次のようにくまなく実行されます。

assignment_statement

すべてのアクティブな index_name 値の組み合わせについて、任意の順序で、右側の expression のすべての値、および左側の variable のすべての添え字、ストライド、およびサブストリング境界を評価します。

すべてのアクティブな index_name 値の組み合わせについて、任意の順序で、計算された expression の値を対応する variable エンティティーに代入します。 forall_assignment では、variable が割り振り可能な場合、-qxlf2003=autorealloc としても、variable が割り振り解除または割り振られることはありません。

INTEGER, DIMENSION(50) :: A,B,CINTEGER :: X,I=2,J=49FORALL (X=I:J)

A(X)=B(X)+C(X)

142 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 169: IBM XL Fortran for Linux, V15.1

C(X)=B(X)-A(X) ! All these assignments are performed after the! assignments in the preceding statement

END FORALLEND

pointer_assignment_statement

ポインター代入のターゲットを任意の順序で判別し、すべてのアクティブな index_name 値の組み合わせについて、ポインターのすべての添え字、ストライド、およびサブストリング境界を評価します。ターゲットがポインターではない場合、ターゲットの判別にはその値の評価は含まれません。ポインター代入では、右側の値を判別する必要はありません。

すべてのアクティブな index_name 値の組み合わせに対して、任意の順序で、すべてのターゲットを対応するポインター・エンティティーに関連付けます。

WHERE ステートメントまたは構文

アクティブな各 index_name 値の組み合わせについて、WHERE ステートメント、WHERE 構文ステートメント、ELSEWHERE ステートメント、またはマスクされた ELSEWHERE ステートメントごとに制御マスクおよび保留中の制御マスクを、任意の順序で評価し、 136ページの『マスクされた配列代入の解釈』に記載されているように、そのステートメントのアクティブな組み合わせの集合を洗練して生成します。アクティブな各組み合わせに対し、コンパイラーは、そのアクティブな組み合わせで真となっている制御マスクの値について、 WHERE ステートメント、WHERE 構文ステートメント、 ELSEWHERE ステートメントの代入を実行します。コンパイラーは、前述のとおり、 WHERE 構文を順に実行します。

INTEGER I(100,10), J(100), XFORALL (X=1:100, J(X)>0)

WHERE (I(X,:)<0)I(X,:)=0 ! Assigns 0 to an element of I along row X

! only if element value is less than 0 and value! of element in corresponding column of J is

ELSEWHERE ! greater than 0.I(X,:)=1

END WHEREEND FORALLEND

FORALL ステートメントまたは構文

外側の FORALL ステートメントまたは構文のアクティブな組み合わせについて、 forall_triplet_spec_list 内の subscript および stride 式を任意の順で評価します。有効な組み合わせは、FORALL 構文の内側と外側の組み合わせの集合のデカルト積です。scalar_mask_expr は、内側のFORALL 構文のアクティブな組み合わせを判別します。これらのアクティブな組み合わせについて、ステートメントと構文が実行されます。

! Same as FORALL (I=1:100,J=1:100,I.NE.J) A(I,J)=A(J,I)

INTEGER A(100,100)OUTER: FORALL (I=1:100)

INNER: FORALL (J=1:100,I.NE.J)

第 6 章 式および代入 143

Page 170: IBM XL Fortran for Linux, V15.1

A(I,J)=A(J,I)END FORALL INNER

END FORALL OUTEREND

データ・ポインターの代入ポインターの代入ステートメントは、ポインターをターゲットと関連付ける、あるいは、ポインターの関連付け状況を、関連付け解除または未定義の状態にします。

data_pointer_object

POINTER 属性がなければなりません。

ターゲット (target)

変数または式です。変数の場合は、TARGET 属性 (または、この属性が設定されたオブジェクトのサブオブジェクト) または、POINTER 属性が設定されている必要があります。式の場合は、POINTER 属性のある値を生成する必要があります。

target が無制限のポリモアフィックでない場合、data_pointer_object はこのターゲットと型互換性がなければならず、また、対応する kind 型パラメーターが同じでなければなりません。target が無制限のポリモアフィックの場合、data_pointer_object は、順序派生型、または、 BIND 属性が設定された型で、無制限のポリモアフィックでなければなりません。

bounds_spec

lower_bound

スカラー整数式です。

範囲のリマップ (bounds_remapping)

�� data_pointer_object => target(1)

(bounds_spec_list)(2)

(bounds_remapping_list)

��

注:

1 Fortran 2003

2 Fortran 2003

�� lower_bound : ��

144 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 171: IBM XL Fortran for Linux, V15.1

lower_bound

スカラー整数式です。

upper_bound

スカラー整数式です。

ターゲットは、ベクトル添え字を持つ配列セクション、または全体の想定サイズ配列であってはなりません。

関連付けが解除された配列ポインターのターゲットのサイズ、境界、および形状は、未定義になります。こうした配列の一部を定義したり、参照したりすることはできません。ただし、このような配列を、関連付け状況、引数の有無、型または型パラメーターのプロパティーを参照する組み込み照会関数の引数にすることはできます。

バイト型のポインターは、バイト型、INTEGER(1)、または、LOGICAL(1)型のターゲットにのみ関連付けることができます。

F2008 data_pointer_object が CONTIGUOUS 属性を持つ配列の場合、target は連続している必要があります。 F2008

target が、関連付けが解除されたポインターの場合、target の非据え置き型パラメーターに対応する、宣言型が data_pointer_object のすべての非据え置き型パラメーターは、target の対応する型パラメーターと同じ値になります。それ以外の場合は、宣言型が data_pointer_object のすべての非据え置き型パラメーターは、target の対応する型パラメーターと同じ値でなければなりません。

data_pointer_object が非据え置き型パラメーターを持ち、それが target の据え置き型パラメーターに対応している場合、target は、未定義の関連付け状況を持つポインターにしないでください。

data_pointer_object がポリモアフィックでなく、target が、宣言型と異なる動的型のポリモアフィックである場合、代入ターゲットは、data_pointer_object の型を持つtarget の上位コンポーネントになります。そうでない場合は、代入ターゲットは、target になります。

data_pointer_object がポリモアフィックの場合、このオブジェクトの型は target の動的型になります。data_pointer_object が、順序派生型または BIND 属性を持つ型の場合、 target の動的型は、その型でなければなりません。

bounds_spec_list を指定すると、リストの境界数は、data_pointer_object のランクに等しくなければなりません。

�� lower_bound : upper_bound ��

第 6 章 式および代入 145

Page 172: IBM XL Fortran for Linux, V15.1

bounds_spec_list または bounds_remapping_list を指定した場合、ポインターに対して SUBSCRIPTORDER ディレクティブを使用することはできません。

bounds_remapping_list を指定した場合:

v F2008 target は、単純連続またはランク 1 でなければなりません。 F2008

v target は、関連解除または未定義のポインターであってはならず、このターゲットのサイズは、data_pointer_object のサイズ以上でなければなりません。

v リスト内の bounds_remappings の数は、data_pointer_object のランクと等しくなければなりません。

v data_pointer_object の各次元の下限境界は、対応する bounds_remapping に指定した lower_bound に等しくなります。

v data_pointer_object の各次元の上限境界は、対応する bounds_remapping に指定した upper_bound に等しくなります。

v data_pointer_object の各次元のエクステントは、その次元の上限境界から下限境界を引き、 1 を加えた値になります。

v data-pointer-object のターゲットのエレメントは、配列エレメント順で、SUBSCRIPTORDER ディレクティブがターゲットに作用した後の、ターゲットの最初の SIZE (data-pointer-object) エレメントになります。

bounds_spec_list を指定した場合:

v bounds_spec の数は、data_pointer_object のランクに等しくなります。

v bounds_spec_list を指定した場合、data_pointer_object の各次元の lower_bound

は、対応する bounds_spec の lower_bound に等しくなります。

v data_pointer_object の各次元のエクステントは、対応するターゲットの次元のエクステントに等しくなります。

v data_pointer_object の各次元の上限境界 は、その次元の下限境界 にその次元のエクステントを加え、1 を引いた値になります。

bounds_remapping_list、bounds_spec_list のいずれも指定されていない場合:

配列ポインターのポインター代入時、各次元の下限境界は、ターゲットの対応する次元に適用される LBOUND 組み込み関数の結果となります。全体配列でも構造体コンポーネントでもない配列セクションや配列式の場合、下限は境界 1 になります。各次元の上限境界は、ターゲットの対応する次元に適用される UBOUND 組み込み関数の結果になります。

data_pointer_object とターゲットとの間の関連付けが以前あった場合、それは解除されます。 target がポインターでない場合、data_pointer_object は target と関連付けられます。 target 自体が関連付けられたポインターである場合、data_pointer_object

は、target のターゲットに関連付けられます。target が、関連解除または未定義の関連付け状況が設定されたポインターの場合、data_pointer_object は、同じ状況を獲得します。ポインター代入の target が割り振り可能オブジェクトの場合、このターゲットを割り振る必要があります。

146 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 173: IBM XL Fortran for Linux, V15.1

派生型の組み込み代入ステートメントまたは定義済み代入ステートメントを実行すると、ポインター構造体コンポーネントのポインター代入も行われる場合があります。

関連情報v ポインターをターゲットに関連付ける代替形式については、 319ページの『ALLOCATE』を参照してください。

v F2008 連続性 F2008

プロシージャー・ポインターの代入 (Fortran 2003)プロシージャー・ポインターの代入ステートメントは、プロシージャー・ポインターをターゲットと関連付ける、あるいは、プロシージャー・ポインターの関連付け状況を、関連付け解除または未定義の状態にします。

proc_target

式またはプロシージャー名です。proc_target が式の場合、プロシージャー・ポインターを返す関数でなければなりません。proc_target がプロシージャー名の場合、外部プロシージャー、モジュール・プロシージャー、ダミー・プロシージャー、実引数として渡すことができる組み込みプロシージャー、または別のプロシージャー・ポインターの名前でなければなりません。

F2008 proc_target には、内部プロシージャーの名前を指定することもできます。 F2008 proc_target をエレメント型プロシージャーにすることはできません。

proc_pointer_object

プロシージャー・ポインターです。

proc_target がプロシージャー・ポインターでない場合、proc_pointer_object がproc_target と関連付けられます。proc_target がプロシージャー・ポインターで、プロシージャーに関連付けられている場合、proc_pointer_object は、同じプロシージャーに関連付けられます。 proc_target が、関連解除または未定義の関連付け状況が設定されたポインターの場合、 proc_pointer_object は、同じ状況を獲得します。

proc_pointer_object に明示的なインターフェースがある場合、その特性は、proc_target と同じでなければなりません。ただし、proc_pointer_object が純粋でなくても、 proc_target は純粋でありうる場合は例外です。proc_pointer_object またはproc_target の特性で、明示的なインターフェースが必要な場合、proc_pointer_object、proc_target の両方ともに明示的なインターフェースがなければなりません。

proc_pointer_object に暗黙的なインターフェースがあり、明示的に型が指定され、関数として参照される場合、proc_target は、関数でなければなりません。proc_pointer_object に暗黙的なインターフェースがあり、サブルーチンとして参照される場合、 proc_target は、サブルーチンでなければなりません。

�� proc_pointer_object => proc_target ��

第 6 章 式および代入 147

Page 174: IBM XL Fortran for Linux, V15.1

proc_target および proc_pointer_object が関数の場合、2 つの関数が同じ型でなければなりません。対応する型パラメーターについても、どちらも据え置きパラメーターか、同じ値になっていなければなりません。

proc_target が、特定プロシージャー名で、かつ、それが総称名でもある場合、特定プロシージャーだけが、proc_pointer_object に関連付けられます。

関連情報:

v 481ページの『PROCEDURE 宣言 (Fortran 2003)』

整数ポインターの代入 (IBM 拡張)整数ポインター変数は、次のことができます。

v 整数式で使用できます。

v 絶対アドレスとして値を代入することができます。

v LOC 組み込み関数を使用して、変数のアドレスを代入することができます。 (派生型のオブジェクトおよび構造体コンポーネントは、LOC 組み込み関数とともに使用する場合、順序派生型でなければなりません。)

注: XL Fortran コンパイラーは、整数ポインターがオペランドの算術式では、乗数として、オブジェクトのサイズは使用しません。

例INTEGER INT_TEMPLATEPOINTER (P,INT_TEMPLATE)INTEGER MY_ARRAY(10)DATA MY_ARRAY/1,2,3,4,5,6,7,8,9,10/INTEGER, PARAMETER :: WORDSIZE=4

P = LOC(MY_ARRAY)PRINT *, INT_TEMPLATE ! Prints '1'P = P + 4; ! Add 4 to reach next element

! because arithmetic is byte-basedPRINT *, INT_TEMPLATE ! Prints '2'

P = LOC(MY_ARRAY)DO I = 1,10

PRINT *,INT_TEMPLATEP = P + WORDSIZE ! Parameterized arithmetic is suggested

END DOEND

148 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 175: IBM XL Fortran for Linux, V15.1

第 7 章 実行制御

プログラム・シーケンスの実行は、構文を使用して制御することができます。構文には、 通常の実行シーケンスを変更できるステートメント・ブロックおよび他の実行可能ステートメントが含まれます。このセクションでは、以下の構文について詳しく説明します。

v ASSOCIATE

v F2008 BLOCK F2008

v DO

v DO WHILE

v IF

v SELECT CASE

v SELECT TYPE

このセクションに記載された構文の詳しい構文図は、関連するステートメント のリンクをたどれば参照することができます。

構文がネストになるようにするには、その構文が別の構文の内部に完全に含まれるようにする必要があります。ステートメントで構文名を指定すると、そのステートメントは指定した構文に適用されます。ステートメントで構文名を指定しない場合は、そのステートメントは、そのステートメントが出現する一番内側の構文に適用されます。

構文に加えて、XL Fortran では、同じ有効範囲単位内のあるステートメントから別のステートメントに制御権を移動する方法として、分岐という方法もあります。

ステートメント・ブロックステートメント・ブロック は、別の実行可能構文に組み込まれて 1 つの単位として扱われる、ゼロ個以上の実行可能ステートメント、実行可能構文、FORMAT ステートメント、または DATA ステートメントで構成されます。

同じプログラム内では、ステートメント・ブロックの外側から内側に制御を移すことはできません。ステートメント・ブロック内で、または、ステートメント・ブロックの内側から外側に制御を移すことは可能です。例えば、文ブロック内にあるラベルに分岐する GO TO 文を使用することができます。ステートメント・ブロックの外側の GO TO ステートメントからそのステートメント・ブロックの内側に分岐することはできません。

© Copyright IBM Corp. 1996, 2015 149

Page 176: IBM XL Fortran for Linux, V15.1

ASSOCIATE 構文 (Fortran 2003)

ASSOCIATE 構文は、その構文の実行中に、ID と、変数または式の値との間に関連付けを作成します。 ASSOCIATE 構文内に指定する ID が関連付けるエンティティーになります。関連付けるエンティティーは、1 つの ASSOCIATE 構文内に複数作成することができます。

構文

ASSOCIATE_statement

構文の詳細については、 324ページの『ASSOCIATE (Fortran 2003)』を参照してください。

END_ASSOCIATE_statement

構文の詳細については、 389ページの『END (構文)』を参照してください。

ASSOCIATE 構文を実行すると、ASSOCIATE_statement、ASSOCIATE_statement_block の順に実行されます。このブロックの実行時に、構文によって ID と対応するセレクターの関連付けが作成されます。関連付けるエンティティーによって、セレクターの宣言型と型パラメーターが決まります。関連付けるエンティティーの名前は、関連名 と言います。関連名の詳細については、 165ページの『関連名』を参照してください。

次の例では、ASSOCIATE 構文を複合式の簡略表現として使用し、既存の変数、MYREAL の名前を変更します。ASSOCIATE 構文の終了後、 MYREAL を関連付けるエンティティーの値に対する構文内のすべての変更が反映されます。

PROGRAM ASSOCIATE_EXAMPLE

REAL :: MYREAL, X, Y, THETA, AX = 0.42Y = 0.35MYREAL = 9.1THETA = 1.5A = 0.4

ASSOCIATE ( Z => EXP(-(X**2+Y**2)) * COS(THETA), V => MYREAL)PRINT *, A+Z, A-Z, VV = V * 4.6

END ASSOCIATE

�� ASSOCIATE_statement ��

�� ASSOCIATE_statement_block ��

�� END_ASSOCIATE_statement ��

150 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 177: IBM XL Fortran for Linux, V15.1

PRINT *, MYREAL

END PROGRAM ASSOCIATE_EXAMPLE

予想される出力は、次のとおりです。

0.4524610937 0.3475389183 9.100000381

41.86000061

BLOCK 構文 (Fortran 2008)BLOCK 構文は、宣言を含むことができる実行可能なブロックを定義します。

構文

BLOCK_statement

構文の詳細については、 332ページの『BLOCK (Fortran 2008)』を参照してください。

END_BLOCK_statement

構文の詳細については、 389ページの『END (構文)』を参照してください。

BLOCK 構文の実行を強制終了するには、EXIT ステートメントを使用します。BLOCK 構文から分岐を作成するには、GOTO (無条件) ステートメントを使用します。

純粋なサブプログラム内の BLOCK 構文のローカル変数には、SAVE 属性を設定できません。

COMMON、EQUIVALENCE、IMPLICIT、INTENT、NAMELIST、OPTIONAL、ステートメント関数、および VALUE の各ステートメントは、BLOCK 構文の宣言部分では使用できません。

共通ブロック名は、BLOCK 構文内の保存されたエンティティー・リストに指定できません。

�� BLOCK_statement ��

��specification_part

��

�� statement_block ��

�� END_BLOCK_statement ��

第 7 章 実行制御 151

Page 178: IBM XL Fortran for Linux, V15.1

BLOCK 構文内で制御を移すこと、または、BLOCK 構文の内側から外側に制御を移すことは可能です。 BLOCK 構文の外側から内側に制御を移すことはできるのは、BLOCK 構文の内側のプロシージャー呼び出しから制御が返された場合のみです。

例 1: 以下の例は、BLOCK 構文をオプションの名前付きで指定し、同構文が他のBLOCK 構文内にネストできることを示しています。

PROGRAM MyProgramINTEGER :: a

add1 : BLOCKINTEGER :: res1res1 = a + 1! The BLOCK statement has no BLOCK_construct_nameBLOCK

INTEGER :: res2res2 = res1 + 1

END BLOCK! The END BLOCK statement must have the same BLOCK construct name 'add1'END BLOCK add1

END PROGRAM MyProgram

例 2: BLOCK 構文の外側から BLOCK 構文の内側への制御の移転は、構文内のプロシージャー呼び出しから制御が返される場合を除き、実行できません。以下に例を示します。

PROGRAM mainINTEGER :: a

a = 5BLOCK

INTEGER :: bb = a + 2! Program control is returned from a procedure call inside the BLOCK constructCALL Sub(b)

END BLOCKEND PROGRAM main

SUBROUTINE Sub(B)INTEGER :: b

b = b * bPRINT *, b

END SUBROUTINE Sub

例 3: 以下の例は、無条件の GOTO ステートメントを使用して BLOCK 構文を終了する方法を示しています。

PROGRAM MyProgramINTEGER :: ii = 100

BLOCKINTEGER :: ii = 1! Before the BLOCK construct is exited, local allocatables are! deallocated, and local finalizable objects are finalized.GOTO 10i = i + 1

152 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 179: IBM XL Fortran for Linux, V15.1

END BLOCK

10 PRINT *, iEND PROGRAM MyProgram

関連情報v 332ページの『BLOCK (Fortran 2008)』

v 505ページの『SAVE』

v 234ページの『純粋プロシージャー』

v 405ページの『EXIT』

v 426ページの『GO TO (無条件)』

DO 構文DO 構文は、ステートメント・ブロックの実行の繰り返しを指定します。このように繰り返し実行されるブロックは、ループ と呼ばれます。

ループの繰り返し回数は、無限でない限り、DO 構文の実行の開始時に指定できます。

CYCLE ステートメントを使用すれば、特定の繰り返しを短縮することができ、EXIT ステートメントを使用すれば、ループを終了できます。

DO_statement

構文の詳細については、 372ページの『DO』を参照してください。

END_DO_statement

構文の詳細については、 389ページの『END (構文)』を参照してください。

terminal_statement

DO 構文を終了するステートメント (終端ステートメント) です。以下を参照してください。

DO ステートメントに DO 構文名を指定する場合、その構文の終了には、同じ構文名を指定した END DO ステートメントを使用しなければなりません。逆に、DOステートメントに DO 構文名を指定せずに、 END DO ステートメントで DO 構文を終了させる場合、 END DO ステートメントに DO 構文名を指定してはなりません。

�� DO_statement ��

�� statement_block ��

�� END_DO_statementterminal_statement

��

第 7 章 実行制御 153

Page 180: IBM XL Fortran for Linux, V15.1

終端ステートメント終端ステートメントは、DO ステートメントの後に置き、実行可能でなければなりません。終端ステートメントとして使用できるステートメントの一覧については、313ページの『第 11 章 ステートメントおよび属性』を参照してください。DO 構文の終端ステートメントが論理 IF ステートメントの場合、その終端ステートメントには、論理 IF に関する制約と矛盾しない任意の実行可能ステートメントを入れることができます。

ラベル付きの DO ステートメントは、それに合うラベルが設定された END DO ステートメントで終了させる必要があります。DO ステートメントにラベルを設定しない場合は、ラベルなしの END DO ステートメントで終了するようにしなければなりません。

ネストされたラベル付きの DO、DO WHILE、および F2008 DOCONCURRENT F2008 の各構文は、終端ステートメントがラベル付きであり、これが END DO ステートメントでなければ、同じ終端ステートメントを共有できます。

DO 構文の範囲DO 構文の範囲には、DO ステートメント以後、終端ステートメントまでの間にあるすべての実行可能ステートメントが含まれます (終端ステートメントも含まれます)。構文の範囲に関する規則に加え、制御を移すことができるのが、最も内側の共用 DO 構文から共用終端ステートメントに対してだけになります。

アクティブの DO 構文および非アクティブの DO 構文DO 構文は、アクティブか非アクティブのいずれかです。DO 構文は、当初は非アクティブで、DO ステートメントが実行されると、その時点で初めてアクティブになります。いったんアクティブになった DO 構文が非アクティブになるのは次の場合に限られます。

v 繰り返し回数がゼロになった場合

v DO 構文の範囲内で、RETURN ステートメントが実行された場合

v DO 構文の範囲外にあるステートメントに制御が移された場合そのステートメントは、END DO ステートメントにすることはできません。

v DO 構文の中から呼び出されたサブルーチンが、代替戻り指定子により、そのDO 構文の範囲外のステートメントに戻った場合そのステートメントは、ENDDO ステートメントにすることはできません。

v DO 構文に属する EXIT ステートメントが実行された場合

v DO 構文の範囲内にあるが、外側の DO ないし DO WHILE 構文に属するEXIT ステートメントまたは CYCLE ステートメントが実行された場合

v STOP ステートメントが実行されるか、または何らかの理由でプログラムが停止した場合

DO 構文が非アクティブになった場合、DO 変数は、割り当てられた最後の値を保持します。

DO ステートメントの実行無限 DO には、繰り返し回数の制限、ないし終了条件はありません。

154 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 181: IBM XL Fortran for Linux, V15.1

ループが無限 DO でない場合、DO ステートメントには、初期パラメーター、終端パラメーター、およびオプションで増分値が設定されます。

1. 初期パラメーター、m1、終端パラメーター、 m2、および増分、m3 は、 DO ステートメント式 (a_expr1、a_expr2、および a_expr3) を計算して得られた値によって設定されます。式の計算では、必要に応じて、算術変換の規則にしたがって、 DO 変数の型への変換も行われます。( 132ページの『算術変換』を参照。)

a_expr3 を指定しないと、m3 の値は 1 となります。m3 の値をゼロにすることはできません。

2. DO 変数は、初期パラメーター (m1) の値によって、定義済み状態になります。

3. 繰り返し回数は、以下の式によって決定されます。

MAX (INT ( (m2 - m1 + m3) / m3), 0)

次の場合には、繰り返し回数がゼロになりますので注意してください。

m1 > m2 かつ m3 > 0、または

m1 < m2 かつ m3< 0

DO 変数が定義されていないと、繰り返し回数を計算することはできません。これを無限 DO 構文と言います。

kind 1、2、または 4 の整変数の場合、繰り返し回数は 2**31 - 1 を超えることはできません。 kind 8 の整変数の場合、2**63 - 1 を超えることはできません。計算時にオーバーフローまたはアンダーフロー状態になる場合は、回数は未定義になります。

DO ステートメントの実行が完了すると、ループ制御の処理が開始されます。

ループ制御の処理ループ制御の処理では、DO 構文の範囲をさらに続けて実行する必要があるかどうかを判断します。繰り返し回数が調べられ、回数がゼロでなければ、 DO 構文の範囲内の最初のステートメントの実行が開始されます。 繰り返し回数がゼロの場合、DO 構文は非アクティブになります。その結果、当該 DO 構文の終端ステートメントを共用しているすべての DO が非アクティブになる場合は、終端ステートメントの後にある次の実行可能ステートメントが実行されて、通常の実行が続けられます。ただし、終端ステートメントを共用している DO 構文で、アクティブのものがある場合は、最も内側のアクティブな DO 構文の増分値の処理に進みます。

DO の実行範囲DO 構文の範囲には、ステートメント・ブロック内のすべてのステートメントが含まれます。ステートメントの実行は、終端ステートメントに到達するまで継続されます。 DO 構文の範囲が実行されている間は、DO 変数を再定義することも、未定義状態にすることもできません。この変数の再定義は、増分値処理によってのみ行われます。

終端ステートメントの実行終端ステートメントは、通常の実行シーケンスの結果として、あるいは、制御権の移動 (ただし、DO 構文の範囲外から範囲内に制御を移すことはできません) の結果として実行されます。終端ステートメントが実行された結果、制御権が移動しない場合、増分値の処理に進みます。

第 7 章 実行制御 155

Page 182: IBM XL Fortran for Linux, V15.1

増分値の処理1. 最後に実行された DO ステートメントが属するアクティブな DO 構文の DO変数、繰り返し回数、および増分が処理の対象として選択されます。

2. DO 変数の値が、m3 の値だけ増やされます。

3. 繰り返し回数が 1 減じられます。

4. ループ制御処理の実行が、繰り返し回数が減らされた同じ DO 構文で継続されます。

例INTEGER :: SUM=0OUTER: DO

INNER: DOREAD (5,*) JIF (J.LE.I) THEN

PRINT *, 'VALUE MUST BE GREATER THAN ', ICYCLE INNER

END IFSUM=SUM+JIF (SUM.GT.500) EXIT OUTERIF (SUM.GT.100) EXIT INNER

END DO INNERSUM=SUM+II=I+10

END DO OUTERPRINT *, 'SUM =',SUMEND

マイグレーションのためのヒント:

v GOTO ステートメントに代えて、EXIT、 CYCLE、および無限 DO ステートメントを使用してください。

FORTRAN 77 ソース

I = 0J = 0

20 CONTINUEI = I + 1J = J + 1PRINT *, IIF (I.GT.4) GOTO 10 ! Exiting loopIF (J.GT.3) GOTO 20 ! Iterate loop immediatelyI = I + 2GOTO 20

10 CONTINUEEND

Fortran 90/95/2003 ソース:

I = 0 ; J = 0DO

I = I + 1J = J + 1PRINT *, IIF (I.GT.4) EXITIF (J.GT.3) CYCLEI = I + 2

END DOEND

156 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 183: IBM XL Fortran for Linux, V15.1

DO CONCURRENT 構文 (Fortran 2008)DO CONCURRENT 構文を使用して、個々のループ反復に相互依存性がないことを指定できます。反復の実行順序は、DO CONCURRENT 構文の実行の開始時には不確定である可能性があります。

DO_CONCURRENT_statement

構文の詳細については、 374ページの『DO CONCURRENT (Fortran

2008)』を参照してください。

END_DO_statement

構文の詳細については、 389ページの『END (構文)』を参照してください。

terminal_stmt

DO CONCURRENT 構文を終了するステートメントです。詳しくは、 154

ページの『終端ステートメント』を参照してください。

以下の例は、DO CONCURRENT 構文の使用法を示しています。

INTEGER,PARAMETER::M=100INTEGER IReal X(M), Y(M), Z(M)

DO CONCURRENT (I = 1:M)Z(I) = SQRT(X(I) + Y(I))

END DO

DO WHILE 構文DO WHILE 構文は、DO WHILE ステートメントに指定されたスカラー論理式が真であり続ける限り、ステートメント・ブロックを繰り返し実行することを指定します。CYCLE ステートメントを使用すれば、特定の繰り返しを短縮することができ、 EXIT ステートメントを使用すれば、ループを終了できます。

�� DO_CONCURRENT_statement ��

�� statement_block ��

�� END_DO_statementterminal_statement

��

第 7 章 実行制御 157

Page 184: IBM XL Fortran for Linux, V15.1

DO_WHILE_statement

構文の詳細については、 377ページの『DO WHILE』を参照してください。

END_DO_statement

構文の詳細については、 389ページの『END (構文)』を参照してください。

terminal_stmt

DO WHILE 構文を終了するステートメント (終端ステートメント) です。詳しくは、 154ページの『終端ステートメント』を参照してください。

DO WHILE 構文については、DO 構文の名前および範囲、アクティブおよび非アクティブな DO 構文、および終端ステートメントに関する規則がそのまま適用されます。

例I=10TWO_DIGIT: DO WHILE ((I.GE.10).AND.(I.LE.99))

J=J+IREAD (5,*) I

END DO TWO_DIGITEND

IF 構文IF 構文では、実行対象として、1 つ以下のステートメント・ブロックを選択します。

�� DO_WHILE_statement ��

�� statement_block ��

�� END_DO_statementterminal_statement

��

158 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 185: IBM XL Fortran for Linux, V15.1

Block_IF_statement

構文の詳細については、 428ページの『IF (ブロック)』を参照してください。

END_IF_statement

構文の詳細については、 389ページの『END (構文)』を参照してください。

ELSE_IF_block

ELSE_IF_statement

構文の詳細については、 385ページの『ELSE IF』を参照してください。

ELSE_block

ELSE_statement

構文の詳細については、 384ページの『ELSE』を参照してください。

�� Block_IF_statement ��

�� statement_block ��

��

� ELSE_IF_block

��

��ELSE_block

��

�� END_IF_statement ��

�� ELSE_IF_statement ��

�� statement_block ��

�� ELSE_statement ��

�� statement_block ��

第 7 章 実行制御 159

Page 186: IBM XL Fortran for Linux, V15.1

IF 構文 (IF および ELSE IF ステートメントのブロック) 内のスカラー論理式は、真の値、ELSE ステートメント、または END IF ステートメントが検出されるまで、指定した順に計算されます。

v 真の値または ELSE ステートメントが検出されると、直後のステートメント・ブロックが実行され、 IF 構文は完了します。IF 構文に残っている ELSE IF ステートメントまたは ELSE ステートメント内のスカラー論理式があっても、それらは評価されません。

v END IF ステートメントが検出された場合は、どのステートメント・ブロックも実行されずに IF 構文が完了します。

IF 構文名を指定する場合、その構文名は IF ステートメントおよび END IF ステートメントに対しては必ず指定が必要ですが、ELSE IF ステートメントまたはELSE ステートメントへの指定は任意となります。 END IF ステートメントには、その IF 構文内からのみ分岐できます。

例! Get a record (containing a command) from the terminal

DOWHICHC: IF (CMD .EQ. 'RETRY') THEN ! named IF construct

IF (LIMIT .GT. FIVE) THEN ! nested IF construct! Print retry limit exceeded

CALL STOPELSE

CALL RETRYEND IF

ELSE IF (CMD .EQ. 'STOP') THEN WHICHC ! ELSE IF blocksCALL STOP

ELSE IF (CMD .EQ. 'ABORT') THENCALL ABORT

ELSE WHICHC ! ELSE block! Print unrecognized command

END IF WHICHCEND DOEND

CASE 構文CASE 構文の構文は、実行対象となる複数のステートメント・ブロックがある場合に、その中から 1 つ以下を選択するための簡潔な構文です。各 CASE ステートメントのケース・セレクターは、 SELECT CASE ステートメントのケース式と似ています。

160 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 187: IBM XL Fortran for Linux, V15.1

SELECT_CASE_statement

評価対象のケース式を定義します。構文の詳細については、 507ページの『SELECT CASE』を参照してください。

END_SELECT_statement

CASE 構文を終了します。構文の詳細については、 389ページの『END (構文)』を参照してください。

CASE_statement_block

CASE_statement

ケース・セレクターを定義します。ケース・セレクターは、値、値のセット、またはデフォルト・ケースのいずれかで、このセレクターに対して後続のステートメント・ブロックが実行されます。構文の詳細については、 339

ページの『CASE』を参照してください。

構文内では、各ケース値のデータ型は、ケース式の型と同じでなければなりません。

CASE 構文は、次のように実行されます。

1. ケース式が計算されます。計算結果の値は、ケース指標となります。

2. ケース指標が、各 CASE ステートメントの case_selector と比較されます。

v 結果が一致すると、CASE ステートメントに関連付けられたステートメント・ブロックが実行されます。

v 一致はしなくても、デフォルトの case_selector が存在する場合、デフォルトの case_selector と関連付けられたステートメント・ブロックが実行されます。

v そうでない場合、ステートメント・ブロックは実行されません。

�� SELECT_CASE_statement ��

��

� CASE_statement_block

��

�� END_SELECT_statement ��

�� CASE_statement ��

�� statement_block ��

第 7 章 実行制御 161

Page 188: IBM XL Fortran for Linux, V15.1

3. 構文の実行が完了し、制御権が END SELECT ステートメントの後のステートメントに移動します。

CASE 構文には、それぞれに値の範囲を 1 つ指定できるゼロ個以上の CASE ステートメントが入ります。ただし、CASE ステートメントで指定する値の範囲をオーバーラップさせることはできません。

デフォルトの case_selector を CASE ステートメントのいずれかによって指定できます。デフォルトの CASE_statement_block は、CASE 構文の先頭または末尾、あるいは、他のブロックの間の任意の場所に入れることができます。

構文名を指定する場合、その構文名は SELECT CASE ステートメントおよび ENDSELECT ステートメントに対しては必ず指定が必要ですが、CASE ステートメントの場合は指定は任意です。

CASE 構文内から分岐できるのは、END SELECT ステートメントに限られます。CASE ステートメントは、分岐のターゲットにはできません。

例ZERO: SELECT CASE(N)

CASE DEFAULT ZEROOTHER: SELECT CASE(N) ! start of CASE construct OTHER

CASE(:-1)SIGNUM = -1 ! this statement executed when n≤-1

CASE(1:) OTHERSIGNUM = 1

END SELECT OTHER ! end of CASE construct OTHER

マイグレーションのためのヒント:

ブロック IF の代替としては、CASE を使用してください。

FORTRAN 77 ソース

IF (I .EQ.3) THENCALL SUBA()

ELSE IF (I.EQ. 5) THENCALL SUBB()

ELSE IF (I .EQ. 6) THENCALL SUBC()

ELSECALL OTHERSUB()

ENDIFEND

Fortran 90/95/2003 ソース:

SELECTCASE(I)CASE(3)

CALL SUBA()CASE(5)

CALL SUBB()CASE(6)

CALL SUBC()CASE DEFAULT

CALL OTHERSUB()END SELECTEND

162 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 189: IBM XL Fortran for Linux, V15.1

CASE (0)SIGNUM = 0

END SELECT ZEROEND

関連情報v 339ページの『CASE』

SELECT TYPE 構文 (Fortran 2003)SELECT TYPE 構文は、その構成ブロックの中から実行対象として 1 つ以下のブロックを選択します。選択は、式の動的な型に基づいて行われます。名前は、ASSOCIATE 構文と同様、式に関連付けられて決まります。

SELECT_TYPE_statement

評価されるセレクター式を定義し、オプションでこのセレクター式に名前(関連名) を関連付けます。 SELECT_TYPE_statement に関連名を指定しない場合、セレクター式を名前付き変数にする必要があります。この変数の名前が関連名になります。セレクターが変数になっていない SELECT TYPE 構文を実行すると、このセレクター式が評価されます。構文の詳細については、 508ページの『SELECT TYPE (Fortran 2003)』を参照してください。

type_guard_statement_block

type_guard_statement

セレクター式の動的な型が、この type_guard_statement に指定された型と比較されます。型比較の規則が特定の type_guard_statement に当てはまる場合、後のステートメント・ブロックが実行されます。この型保護ステートメント (type_guard_statement) は、分岐のターゲットにはできません。SELECT TYPE 構文内部から分岐できるのは、その end-select-type-stmt だけです。構文の詳細については、 533ページの『保護型 (Fortran 2003)』を

�� SELECT_TYPE_statement ��

��

� type_guard_statement_block

��

�� END_SELECT_statement ��

�� type_guard_statement ��

�� statement_block ��

第 7 章 実行制御 163

Page 190: IBM XL Fortran for Linux, V15.1

参照してください。関連付けるエンティティーのその他の属性については、165ページの『関連名』を参照してください。

END_SELECT_statement

SELECT TYPE 構文を終了します。構文の詳細については、 389ページの『END (構文)』を参照してください。

実行対象のブロックは、次のように実行されます。

1. TYPE IS 型保護ステートメントがセレクターに一致した場合は、このステートメントの後のブロックが実行されます。TYPE IS 型保護ステートメントがセレクターに一致するのは、セレクターの動的な型および kind 型パラメーターの値が、このステートメントで指定されたものと同じ場合です。

2. TYPE IS が一致しない場合、1 つだけの CLASS IS 型保護ステートメントがセレクターに一致すれば、このステートメントの後のブロックが実行されます。CLASS IS 型保護ステートメントがセレクターに一致するのは、セレクターの動的な型がこのステートメントで指定された型の拡張になっており、このステートメントで指定された kind 型パラメーターの値が、セレクターの動的な型の対応する型パラメーター値になっている場合です。

3. 上記のいずれにも該当しない場合、複数の CLASS IS 型保護ステートメントがセレクターに一致する場合は、それらのステートメントのいずれか 1 つによって、それ以外のステートメントに指定されたすべての型の拡張になっている型に決定されます。選択されたそのステートメントの後のブロックが実行されます。

4. 以上のいずれにも該当しない場合は、CLASS DEFAULT 保護ステートメントがあれば、このステートメントの後のブロックが実行されます。

関連付けるエンティティーが TYPE IS、CLASS IS、または CLASS DEFAULT 型保護ステートメントに続く場合、そのポリモアフィズム、型、および型パラメーターは以下のように決定されます。

表 19. 構文内のさまざまな場所の、関連付けるエンティティーの特性

位置 ポリモアフィズム 型 型パラメーター

TYPE IS 型保護ステートメントの後のブロック内

ポリモアフィックでない

型保護ステートメントで指定された型

セレクターの型パラメーターの値

CLASS IS 型保護ステートメントの後のブロック内

ポリモアフィック 型保護ステートメントで指定された宣言型

セレクターの型パラメーターの値

CLASS DEFAULT

型保護ステートメントの後のブロック内

ポリモアフィック セレクターと同じ宣言型

セレクターの宣言型の型パラメーターの値

例PROGRAM p

TYPE baseINTEGER::i

END TYPE

TYPE,EXTENDS(base)::childINTEGER::j

END TYPE

164 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 191: IBM XL Fortran for Linux, V15.1

CLASS(base), POINTER :: bptrTYPE(base), TARGET :: base_target = base(10)TYPE(child), TARGET :: child_target = child(20, 30)

bptr => base_target

SELECT type(bptr)TYPE IS (base)PRINT *, "base type: component value: ", bptr%iTYPE IS (child)PRINT *, "child type: component values: ", bptr%i, bptr%j

END SELECT

bptr => child_target

SELECT type(bptr)TYPE IS (base)PRINT *, "base type: component value: ", bptr%iTYPE IS (child)PRINT *, "child type: component values: ", bptr%i, bptr%j

END SELECT

END PROGRAM p

出力は次のようになります。

base type: component value: 10child type: component values: 20 30

関連名SELECT TYPE または ASSOCIATE 構文内では、関連付けるエンティティーのランクは、関連付けられるセレクターと同じになります。各次元の下限は、組み込みLBOUND(selector) の値と等しくなります。それぞれの次元の上限は、下限にエクステントを足して 1 を引いたものに等しくなります。

セレクターが変数であり、かつセレクターが同じ属性を持つ場合に限り、関連付けるエンティティーは、ASYNCHRONOUS 属性または VOLATILE 属性を持ちます。セレクターが TARGET 属性または POINTER 属性を持つ場合に限り、関連付けるエンティティーは TARGET 属性を持ちます。関連付けるエンティティーがポリモアフィックである場合、そのエンティティーは、セレクターの動的な型および型パラメーターの値が設定されます。セレクターが OPTIONAL 属性を持つ場合は、それが存在する必要があります。 F2008 セレクターが連続している場合に限り、関連付けるエンティティーは連続しています。 F2008

セレクターが変数定義コンテキストに指定できない場合、または、ベクトル添え字が設定された配列である場合、関連名を変数定義コンテキストに指定することはできません。

関連情報v F2008 連続性 F2008

第 7 章 実行制御 165

Page 192: IBM XL Fortran for Linux, V15.1

分岐通常の実行シーケンスは、分岐によって変更することもできます。分岐は、同じ有効範囲単位内で、あるステートメントからラベル付きの分岐ターゲット・ステートメントに制御を移します。分岐ターゲット・ステートメントには、CASE、ELSE、ELSE IF、あるいは型保護ステートメントを除く、任意の実行可能ステートメントを指定することができます。

次のステートメントを分岐に使用できます。

v 割り当て GO TO

ASSIGN ステートメントでステートメント・ラベルを指定した実行可能ステートメントにプログラム制御権を移します。構文の詳細については、 424ページの『GO TO (代入)』を参照してください。

v 計算 GO TO

可能性として、制御権を複数の実行可能ステートメントのいずれかに移します。構文の詳細については、 425ページの『GO TO (計算)』を参照してください。

v 無条件 GO TO

制御権を指定した実行可能ステートメントに移します。構文の詳細については、426ページの『GO TO (無条件)』を参照してください。

v 算術 IF

算術式の計算結果に応じて、制御権を 3 つの実行可能ステートメントのいずれか1 つに移します。構文の詳細については、 427ページの『IF (算術)』を参照してください。

次の I/O 指定子も分岐に使用できます。

v END= ファイル終了指定子

READ ステートメントで、ファイル終了レコードが検出された場合 (かつエラーが発生しない場合)、指定された実行可能ステートメントに制御権を移します。

v ERR= エラー指定子

エラーが発生した場合に、制御権を指定した実行可能ステートメントに移します。この指定子を指定できるのは、 BACKSPACE、ENDFILE、REWIND、CLOSE、OPEN、READ、WRITE、および INQUIRE ステートメントです。

v EOR= レコード終了指定子

READ ステートメントで、レコード終了条件が検出された場合 (かつエラーが発生しない場合)、指定された実行可能ステートメントに制御権を移します。

CONTINUE ステートメントCONTINUE ステートメントを実行しても影響はありません。詳しくは、 361ページの『CONTINUE』を参照してください。

166 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 193: IBM XL Fortran for Linux, V15.1

STOP ステートメントSTOP ステートメントを実行すると、プログラムの実行は正常終了します。詳しくは、 513ページの『STOP』を参照してください。

ERROR STOP ステートメント (Fortran 2008)ERROR STOP ステートメントを実行すると、プログラムの実行はエラー終了します。詳しくは、ERROR STOP を参照してください。

第 7 章 実行制御 167

Page 194: IBM XL Fortran for Linux, V15.1

168 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 195: IBM XL Fortran for Linux, V15.1

第 8 章 プログラム単位およびプロシージャー

スコープ

有効範囲単位プログラム単位は、一連のオーバーラップしない有効範囲単位から構成されています。有効範囲単位 とは、固有の有効範囲の境界を持つプログラム単位の部分です。これは、以下のいずれかになります。

v 派生型定義。

v F2008 BLOCK 構文 (ネストされた BLOCK 構文、派生型定義、および構文内のインターフェース本体は含まない)。 F2008

v プロシージャー・インターフェース本体 (その中の派生型定義およびインターフェース本体は含まない)。

v プログラム単位、モジュール・サブプログラム、または内部サブプログラム (その中の派生型定義 F2008 BLOCK 構文 F2008 、インターフェース本体、モジュール・サブプログラム、および内部サブプログラムは含まない)

別の有効範囲単位を直接包含している有効範囲単位をホスト有効範囲と言います。例えば、次の図では、内部関数 C のホスト有効範囲単位は、メインプログラム A

の有効範囲単位です。 IMPORT ステートメントを使用すると、モジュール・プロシージャー・インターフェース本体ではなくインターフェース本体も、それ自体のホストから名前にアクセスできます。

親子結合を行えば、内部サブプログラム、モジュール・サブプログラム、派生型定義、または F2008 サブモジュール F2008 が、そのホストから名前にアクセスできます。

SUBROUTINE B

REAL B1

END SUBROUTINE B

FUNCTION C ( )

REAL C1

END FUNCTION C

END PROGRAM A

PROGRAM A

INTEGER A1

CONTAINS

�� の����

B1

�� の����

C1

�� の����

と の����は�まない

A1

(B1 C1

)

�� の����

と の����は�まない

A1

(B1 C1

)

© Copyright IBM Corp. 1996, 2015 169

Page 196: IBM XL Fortran for Linux, V15.1

有効範囲を持つエンティティー有効範囲を持つエンティティーには、以下のものがあります。

v 名前 (以下を参照)

v ラベル (ローカル・エンティティー)

v 外部入出力装置番号 (グローバル・エンティティー)

v 演算子記号。組み込み演算子はグローバル・エンティティーで、定義された演算子はローカル・エンティティーです。

v 代入記号 (グローバル・エンティティー)

有効範囲が実行可能プログラムである場合、そのエンティティーはグローバル・エンティティー と呼ばれます。有効範囲が有効範囲単位である場合、そのエンティティーはローカル・エンティティー と呼ばれます。有効範囲がステートメント、またはステートメントの一部である場合は、そのエンティティーはステートメント・エンティティー と呼ばれます。有効範囲が構文である場合、そのエンティティーは構文エンティティー と呼ばれます。

グローバル・エンティティーグローバル・エンティティーには、次のものがあります。

v 共通ブロック

v CRITICAL lock_names

v 外部入力装置または出力装置

v 外部プロシージャー

v バインディング・ラベルが設定されているエンティティー

v 保留データ転送処理

v プログラム単位

複数のバインディング・ラベルを使用してプログラムのエンティティーを識別することはできません。ある名前で 1 つのグローバル・エンティティーを識別する場合、そのエンティティーが組み込みモジュールでない限り、 その名前は、同じ実行可能プログラム内のどのバインディング・ラベルとも同じであってはなりません。 また、その名前を使用して、同じ実行プログラム内の他のグローバル・エンティティーを識別することもできません。

グローバル・エンティティーの名前に関する制約事項の詳細については、「XL

Fortran 最適化およびプログラミング・ガイド」の『XL Fortran 外部名の規則』を参照してください。

ローカル・エンティティー以下のクラスのエンティティーは、そのエンティティーが定義されている有効範囲単位のローカル・エンティティーです。

v クラス 1: 名前付き変数ですが、この変数は、ステートメント・エンティティー、モジュール・プロシージャー、名前定数、派生型、構文名、総称名、ステートメント関数、内部サブプログラム、ダミー・プロシージャー、組み込みプロシージャー、名前リスト・グループ名、バインディング・ラベルを持つ外部プロシ

170 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 197: IBM XL Fortran for Linux, V15.1

ージャー、抽象インターフェース、組み込みモジュール USE ステートメントによってアクセスされる外部プロシージャー、およびステートメント・ラベルではありません。

v クラス 2: 派生型定義の型パラメーター、コンポーネント、および型制約プロシージャーのバインディングです。各派生型定義は独自クラスを持ちます。

– 派生型パラメーターの名前 (親の型から継承したすべてのものを含む) の有効範囲は、定義される派生型の有効範囲と同じになります。

– コンポーネント名は、コンポーネントの型と同じ有効範囲を持ちます。名前の指定は、その型の構造体のコンポーネント指定子内に指定するか、その型の構造体コンストラクターのコンポーネント・キーワードで行うことができます。

– プロシージャーのバインディング名は、型と同じ有効範囲を持ちます。指定できるのは、プロシージャー参照内のバインディング名に限られます。総称指定が総称名ではない総称バインディングの有効範囲は、その型のエンティティーがアクセス可能なすべての有効範囲単位で構成される有効範囲になります。

派生型がモジュール内で定義され、PRIVATE ステートメントが指定されていると、型およびそのコンポーネントは、親子結合によって定義モジュールの任意のサブプログラム内でアクセス可能となります。アクセス元の有効範囲単位が、参照結合によってこの型にアクセスした場合、その有効範囲単位、および親子結合によってその有効範囲単位のエンティティーにアクセスするすべての有効範囲単位は、派生型にアクセスでき、コンポーネントについては、PUBLIC 属性が設定されたコンポーネントにのみアクセスできます。

v クラス 3: 引数キーワード (明示インターフェースを使用した各プロシージャー用の個別クラス内)

内部プロシージャー、モジュール・プロシージャー、またはプロシージャーのインターフェース・ブロック内にある仮引数名は、そのホストの有効範囲単位の引数キーワードが有効範囲となっています。引数キーワードとしての仮引数名は、仮引数であるプロシージャーに対するプロシージャー参照でのみ指定できます。参照結合または親子結合によって、プロシージャーまたはプロシージャーのインターフェース・ブロックが別の有効範囲単位内でアクセス可能な場合、引数キーワードは、その有効範囲単位内のそのプロシージャーに対するプロシージャー参照にアクセス可能です。

v クラス 4: バインディング・ラベルを持つ共通ブロックです。

ある有効範囲単位内では、1 つのクラスのローカル・エンティティーを識別する名前を、別のクラスのローカル・エンティティーを識別する場合に使用することができます。そのような名前は、総称名の場合を除いて、同じクラスの別のローカル・エンティティーを識別するためには使用できません。インターフェース・ブロックの総称名は、以下の名前と同じにできます。

v 同じ有効範囲の派生型名。

v インターフェース・ブロック内の特定のプロシージャー名、任意のアクセス可能な総称名、または任意の総称組み込みプロシージャー名。詳細については、 232

ページの『プロシージャー参照の解決』を参照してください。

第 8 章 プログラム単位およびプロシージャー 171

Page 198: IBM XL Fortran for Linux, V15.1

ある有効範囲単位内では、グローバル・エンティティーを識別する名前を使用して、同じ有効範囲単位内のクラス 1 とクラス 4 のローカル・エンティティーを識別できません。ただし、その名前による識別が以下の場合を除きます。

v 共通ブロックを識別する。

v 関数名が総称名でもある外部関数を識別する。

v USE ステートメント内の rename の use-name としてアクセス可能データ・エンティティーを識別する。

v 外部関数を識別し、包含する有効範囲が、外部関数が定義するサブプログラムである。

派生型になるように宣言された名前には、その有効範囲単位で派生型以外のクラス 1 の別のローカル・エンティティーと同じ名前にすることができます。その場合は、その型の構造体コンストラクターは、その有効範囲では使用できません。同様に、クラス 1 のローカル・エンティティーは、その有効範囲内にアクセス可能な、クラス 1 の別のローカル・エンティティーがあっても、次の条件の両方が満たされる場合、親子結合または参照結合によってアクセス可能です。

v 2 つのエンティティーのうちの 1 つが派生型で、もう一方が派生型ではない。

v ホスト関連付けの場合、派生型がホスト関連付けによってアクセス可能である。例えば、モジュール M、プログラム単位 P、および P にネストされた内部サブプログラムまたはモジュール・サブプログラム S があるとします。ここで、P 内(または S 内) の使用関連付けによってアクセスされる M で宣言された T1 という名前のエンティティーがある場合は、2 つのうち 1 つが派生型である場合に限って、同名の T1 で別のエンティティーを P 内に (または S 内に) 宣言できます。P 内でアクセス可能な T2 という名前のエンティティーがあり、S 内でT2 という名前のエンティティーが宣言された場合、P 内でアクセス可能な T2

は、P 内の T2 が派生型であれば S 内でもアクセス可能です。P 内の T2 が派生型でない場合は、S が別の T2 (派生型または非派生型) を宣言した場合でも、S 内でアクセスできません。

この型の構造体コンストラクターは、その有効範囲では使用できません。ある有効範囲において、クラス 1 のローカル・エンティティーの名前が、その有効範囲でアクセス可能な派生型と同じ名前の場合、そのローカル・エンティティーは、その有効範囲の宣言ステートメントで明示的に宣言する必要があります。

クラス 1 の 2 つのローカル・エンティティーのうち 1 つが派生型で、同じ名前識別子を持ち、1 つの有効範囲単位内でアクセス可能な場合、エンティティーの名前を指定する任意の PUBLIC または PRIVATE ステートメントは両方のエンティティーに適用されます。派生型宣言ステートメント内で指定された PUBLIC 属性または PRIVATE 属性も両方のエンティティーに適用されます。

エンティティーの名前が VOLATILE ステートメントに指定される場合、その有効範囲に宣言されたエンティティーは、すべて揮発属性を持つことになります。2 つのエンティティーがモジュールの共通エンティティーの場合、そのモジュールを参照し、use_name としてエンティティーの名前を指定する USE ステートメントでの名前変更は、両方のエンティティーに適用されます。

範囲単位指定内の共通ブロック名は、名前付き定数または組み込みプロシージャー以外であれば、どのローカル・エンティティーの名前であってもかまいません。この名前は、BIND、 COMMON、VOLATILE、または SAVE ステートメント内に

172 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 199: IBM XL Fortran for Linux, V15.1

スラッシュで区切られて指定された場合に限って、共通ブロック・エンティティーとして認識されます。そうでない場合は、この名前はローカル・エンティティーとして識別されます。組み込みプロシージャー名が、組み込みプロシージャーを参照しない有効範囲単位内の共通ブロック名である場合があります。その場合、その組み込みプロシージャー名は、アクセスできません。

外部関数名を関数結果名とすることもできます。これは、外部関数名をローカル・エンティティーとする唯一の方法です。

有効範囲単位に組み込みプロシージャーと同じ名前でクラス 1 のローカル・エンティティーが含まれている場合、その有効範囲単位にある組み込みプロシージャーにはアクセスできません。

ステートメント・エンティティー次のものは、ステートメント・エンティティーです。

v ステートメント関数仮引数の名前有効範囲: 名前を指定するステートメントの有効範囲

v DATA ステートメントまたは配列コンストラクターにある暗黙 DO の DO 変数として指定する変数の名前有効範囲: 暗黙 DO リストの有効範囲

共通ブロック名またはスカラー変数名を除き、あるステートメントまたは構文の有効範囲単位内でアクセス可能なクラス 1 のグローバル・エンティティーまたはローカル・エンティティーの名前は、そのステートメントまたは構文のステートメント・エンティティーまたは構文エンティティーの名前と同じにはできません。また、あるステートメント・エンティティーまたは構文エンティティーの有効範囲内では、別のステートメント・エンティティーまたは構文エンティティーをそのエンティティーと同じ名前にすることはできません。

ステートメント関数のステートメントに仮引数として指定される変数名の有効範囲は、指定されているステートメントの有効範囲と同じです。この変数名の型および型パラメーターは、ステートメント関数を含む有効範囲単位内の変数名である場合に持つ型および型パラメーターになります。

あるステートメントまたは構文の有効範囲単位内でアクセス可能なグローバル・エンティティーまたはローカル・エンティティーの名前が、そのステートメントまたは構文内のステートメント・エンティティーまたは構文エンティティー名と同じ場合、その名前は、そのステートメント・エンティティーまたは構文エンティティーの有効範囲内では、そのエンティティー名として解釈されます。有効範囲単位のそれ以外の場所の場合、およびステートメントまたは構文の一部がそのステートメント・エンティティーまたは構文エンティティーの有効範囲外である場合は、名前はグローバル・エンティティーまたはローカル・エンティティーの名前として解釈されます。

ステートメント・エンティティーまたは構文エンティティーの名前が、変数、定数、または関数を示すアクセス可能な名前と同じ場合、そのステートメント・エンティティーまたは構文エンティティーの型および型パラメーターは、そうした変数、定数、または関数の型および型パラメーターと同じになります。そうでない場合、ステートメント・エンティティーまたは構文エンティティーの型は、有効な暗

第 8 章 プログラム単位およびプロシージャー 173

Page 200: IBM XL Fortran for Linux, V15.1

黙の型設定規則によって決まります。ステートメント・エンティティーが DATAステートメント内の暗黙 DO の DO 変数である場合、その変数の名前は、アクセス可能な名前付き定数と同じ名前であってはなりません。

ステートメント・エンティティーおよび構文エンティティー以下のものは、ステートメント・エンティティーまたは構文エンティティー、あるいはその両方になります。

v FORALL ステートメントまたは FORALL 構文内の index_name として指定する変数の名前

– 有効範囲: FORALL ステートメントまたは構文の有効範囲

FORALL ステートメント・エンティティーまたは構文エンティティーが持つ唯一の属性は、このステートメントまたは構文エンティティーが FORALL を含む有効範囲単位内の変数名である場合に持つ型および型パラメーターになります。型は整数型になります。

共通ブロック名またはスカラー変数名を除き、クラス 1 のグローバル・エンティティーおよびローカル・エンティティーを識別する名前で、FORALL ステートメントまたは構文の有効範囲単位内でアクセス可能な名前は、index_name と同じにはできません。FORALL 構文の有効範囲単位内では、ネストされた FORALL ステートメントまたは FORALL 構文には、同名の index_name を指定することはできません。

FORALL ステートメントまたは構文の有効範囲単位内でアクセス可能なグローバル・エンティティーまたはローカル・エンティティーの名前が、index_name と同じ場合、その名前は、 FORALL ステートメントまたは構文の有効範囲内ではindex_name の名前として解釈されます。有効範囲単位のそれ以外の場所の場合、名前はグローバル・エンティティーまたはローカル・エンティティーの名前として解釈されます。

構文エンティティー (Fortran 2003)以下の構文エンティティーを参照してください。

v ASSOCIATE 構文の関連名

– 有効範囲: ASSOCIATE 構文のブロックの有効範囲

v SELECT TYPE 構文の関連名

– 有効範囲: SELECT TYPE 構文の各ブロックの (個別) 有効範囲

F2008

v BLOCK 構文の宣言部分で明示的に宣言されており、ASYNCHRONOUS およびVOLATILE ステートメントだけで宣言されているのではないエンティティー。

– 有効範囲: BLOCK 構文の有効範囲

F2008

ASSOCIATE または SELECT TYPE 構文の有効範囲単位内でアクセス可能なグローバル・エンティティーまたはローカル・エンティティーの名前が、特定の関連名と同じ場合、その名前は、ASSOCIATE または SELECT TYPE 構文の有効範囲内

174 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 201: IBM XL Fortran for Linux, V15.1

では、その関連名の名前として解釈されます。有効範囲単位のそれ以外の場所の場合、名前はグローバル・エンティティーおよびローカル・エンティティーの名前として解釈されます。

F2008

例 1: 以下の例では、ASYNCHRONOUS ステートメントによって新規変数 a は定義されません。ここでは、外側の有効範囲で定義されている変数 a に対し、BLOCK 構文の存続期間の間だけ ASYNCHRONOUS 属性を設定しているに過ぎません。

PROGRAM fooINTEGER :: a

BLOCK! This a is the same as the a declared outside the BLOCK construct.! It merely gives variable a, defined in the outer scope, the ASYNCHRONOUS! attribute for the duration of the BLOCK construct scope.ASYNCHRONOUS :: a

END BLOCKEND PROGRAM foo

例 2: 以下の例では、a は BLOCK 構文の構文エンティティーです。これは、a がBLOCK 構文の外側で宣言されていないからです。

PROGRAM fooBLOCK

! This a is a local entity since there is no a in the outer scope.INTEGER, ASYNCHRONOUS :: a

END BLOCKEND PROGRAM foo

F2008

関連付け関連付けは、同一の有効範囲単位内で同じデータを複数の異なる名前で識別できる場合、または同一の実行可能プログラムの異なる有効範囲単位で同じデータにアクセスできる場合に生じます。プロシージャーおよび関数における引数関連付けについては、 219ページの『引数関連付け』を参照してください。

ホスト関連付け親子結合により、内部サブプログラム、モジュール・サブプログラム、インターフェース本体、派生型定義、または F2008 サブモジュール F2008 によって、ホスト内に存在している名前付きエンティティーにアクセスできます。インターフェース本体では、エンティティーが IMPORT ステートメントによってアクセス可能になっていない限り、親子結合でエンティティーにアクセスすることはできません。アクセスされるエンティティーは、ホスト内と同じ属性を持ち、同じ名前で認識されます。

EXTERNAL 属性が指定されている名前はグローバル名です。このような名前を非総称名として持つホスト有効範囲単位内のエンティティーの場合は、その名前およびホスト関連付けを使用してアクセスすることはできません。

第 8 章 プログラム単位およびプロシージャー 175

Page 202: IBM XL Fortran for Linux, V15.1

ある有効範囲単位内で宣言または初期化が行われる場合、次に示すエンティティーはその有効範囲単位内でローカル・エンティティーとなります。

v COMMON ステートメント内の変数名または DATA ステートメント内で初期化された変数名

v DIMENSION ステートメント内の配列名

v 派生型の名前

v 型宣言、EQUIVALENCE、POINTER、ALLOCATABLE、SAVE、 TARGET、AUTOMATIC、整数 POINTER、STATIC、または、 VOLATILE 内のオブジェクト名

注: VOLATILE は、コンパイラー・オプション -qxlf2003 によって制御されます。詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

v PARAMETER ステートメント内の名前付き定数

v NAMELIST ステートメント内の名前リスト・グループ名

v インターフェース総称名または定義済み演算子

v INTRINSIC ステートメント内の組み込みプロシージャー名

v FUNCTION ステートメント、ステートメント関数ステートメント、または、型宣言ステートメント内の関数名

v FUNCTION ステートメントまたは ENTRY ステートメント内の結果名

v SUBROUTINE ステートメント内のサブルーチン名

v ENTRY ステートメント内の入り口名

v FUNCTION、SUBROUTINE、ENTRY、またはステートメント関数ステートメント内の仮引数名

v 名前付き構文の名前

v インターフェース本体または PROCEDURE 宣言ステートメントによって宣言されたエンティティーの名前

ローカル・エンティティーと同じ名前を持つホスト有効範囲単位内のエンティティーは、ホスト関連付けではアクセスできません。

次のような場合、DATA ステートメントの前にローカル・エンティティーの参照または定義を行うことはできません。

1. エンティティーが DATA ステートメント内で初期化されているため、ある有効範囲単位に限ってローカルになっている場合。

2. ホスト内のエンティティーの名前が、そのローカル・エンティティーの名前と同じ場合。

ホストの派生型名にアクセスできない場合でも、その型の構造体またはそのような構造体のサブオブジェクトにはアクセス可能です。

サブプログラムがホスト関連付けを介してポインター (または整数ポインター) にアクセスすると、そのサブプログラムの呼び出し時に存在するポインター関連付けは、サブプログラム内では現行のままになります。このポインター関連付けは、サブプログラム内で変更してもかまいません。プロシージャーが実行を終了しても、ポインター関連付けは現行のままですが、これによってポインターが未定義になる

176 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 203: IBM XL Fortran for Linux, V15.1

場合は例外です。その場合は、ホストに関連したポインターの関連付け状況は未定義となります。変数の定義および未定義の原因となるイベントの詳細については、23ページの『変数の定義状況』を参照してください。

内部サブプログラムまたはモジュール・サブプログラムのホスト有効範囲単位には、同一の使用関連付けを持つエンティティーを指定することができます。

ホスト関連付けで関連付けられたエンティティーは、ホスト内と同じ名前で認識され、同じ属性を持ちます。ただし、例外としてエンティティーがアクセスされると、ホスト・エンティティーには VOLATILE または ASYNCHRONOUS 属性がない場合でも、これらの属性が設定される場合があります。内部プロシージャーまたはモジュール・プロシージャーの場合、ホスト関連付けによってアクセスされる変数が、 ASYNCHRONOUS または VOLATILE ステートメント内に指定されると、そのホスト変数には、ローカル有効範囲内で ASYNCHRONOUS またはVOLATILE 属性が与えられます。

注: VOLATILE は、コンパイラー・オプション -qxlf2003 によって制御されます。

F2008 サブモジュールは、親子結合によってその上位モジュールまたはサブモジュール内で宣言および定義されたエンティティーにアクセスします。サブモジュール内のエンティティーの宣言と定義は、その下位サブモジュール内の親子結合からアクセス可能です。 F2008

例SUBROUTINE MYSUBTYPE DATES ! Define DATES

INTEGER STARTINTEGER END

END TYPE DATESCONTAINS

INTEGER FUNCTION MYFUNC(PNAME)TYPE PLANTS

TYPE (DATES) LIFESPAN ! Host association of DATESCHARACTER(10) SPECIESINTEGER PHOTOPER

END TYPE PLANTSEND FUNCTION MYFUNC

END SUBROUTINE MYSUB

関連情報v -qinfo=HOSTASSOCiation

v XL Fortran コンパイラー・リファレンス

.

使用関連付け使用関連付けは、有効範囲単位が USE ステートメントを使用してモジュールのエンティティーにアクセスするときに行われます。参照結合が行われたエンティティ

第 8 章 プログラム単位およびプロシージャー 177

Page 204: IBM XL Fortran for Linux, V15.1

ーは、名前を変更すれば、ローカルの有効範囲単位内で使用できます。この関連付けは、実行可能プログラムの実行時間中は有効です。詳しくは、 534ページの『USE』 を参照してください。

USE で関連付けられたエンティティーは、関連付けられたモジュール・エンティティーに ASYNCHRONOUS または VOLATILE 属性がない場合でも、ローカル有効範囲単位内でこれらの属性が設定される場合があります。

注: VOLATILE は、コンパイラー・オプション -qxlf2003 によって制御されます。関連参照: XL Fortran コンパイラー・リファレンス

例MODULE m

CONTAINSSUBROUTINE printchar(x)

CHARACTER(20) xPRINT *, x

END SUBROUTINEEND MODULE

PROGRAM mainUSE m ! Accesses public entities of module mCHARACTER(20) :: name = 'George'CALL printchar(name) ! Calls printchar from module m

END PROGRAM

構文関連付け

Fortran 2003

構文関連付けは、それぞれのセレクターと、対応する構文の関連名との間の関連付けを確立します。それぞれの関連名と対応するセレクターとの関連は、実行されるブロックの実行全体を通して維持されます。ブロック内では、各セレクターは対応する関連名によって認識され、アクセスすることができます。構文が終了すると、関連付けも終了します。詳しくは、ASSOCIATE および SELECT TYPE 構文を参照してください。

Fortran 2003 の終り

ポインター関連付け特定のポインターに関連付けられたターゲットは、そのポインターに対する参照によって参照することができます。これをポインター関連付けと呼びます。

ポインターは、常に次のいずれかの関連付け状況を持ちます。

関連 (Associated)

v ALLOCATE ステートメントによって正常にポインターが割り振られ、その後、関連解除されたり、未定義にされたりしていない場合。

ALLOCATE (P(3))

178 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 205: IBM XL Fortran for Linux, V15.1

v ポインターが、関連しているか、または、TARGET 属性を有しているターゲットにポインター代入されており、割り振り可能な場合は、割り振られている場合。

P => T

関連解除 (Disassociated)

v ポインターが、NULLIFY ステートメントまたは -qinit=f90ptr オプションによって無効にされている場合。「XL Fortran コンパイラー・リファレンス」の『-qinit』を参照してください。

NULLIFY (P)

v ポインターが、そのコンポーネントにデフォルト初期化が指定されたオブジェクトの最終的コンポーネントであり、さらに、次の条件に当てはまる場合。– INTENT(OUT) により、割り振り不能な非ポインター仮引数に対応する実引数として、このオブジェクトと共にプロシージャーが呼び出されている。

– 使用関連付けまたはホスト関連付けではアクセスできない未保管の割り振り不能な非ポインター・ローカル・オブジェクトとして、このオブジェクトと共にプロシージャーが呼び出されている。

– このオブジェクトが割り振られている。– F2008 実行が BLOCK 構文に移行し、オブジェクトが BLOCK 構文の未保管の割り振り不能な非ポインター・ローカル変数である。

TYPE DTINTEGER, POINTER :: POINT => NULL()

END TYPE

BLOCKTYPE(DT) DT1 ! DT1%POINT becomes disassociated here

END BLOCK

F2008

v ポインターが、正常に割り振り解除されている場合。

DEALLOCATE (P)

v ポインターが、関連付けが解除されたポインターにポインター代入されている場合。

NULLIFY (Q); P => Q

未定義 (Undefined)

v 初期状態時 (-qinit=f90ptr オプションが指定されていない場合)

v ポインターが、あるオブジェクトの最終的なコンポーネントで、そのコンポーネントにはデフォルトの初期化は指定されておらず、さらに、INTENT(OUT) により、仮引数に対応する実引数としてこのオブジェクトと共にプロシージャーが呼び出されているか、または、INTENT(OUT) によりポインター仮引数に対応する実引数としてポインターと共にプロシージャーが呼び出されている場合。

v 関連付け状況が未定義であるポインターへのポインター代入の場合。v ポインターのターゲットがポインター以外によって割り振り解除された場合。

第 8 章 プログラム単位およびプロシージャー 179

Page 206: IBM XL Fortran for Linux, V15.1

POINTER P(:), Q(:)ALLOCATE (P(3))Q => PDEALLOCATE (Q) ! Deallocate target of P through Q.

! P is now undefined.END

v RETURN または END ステートメントの実行により、ポインターのターゲットが未定義になった場合。

v ポインターが宣言またはアクセスされたプロシージャー内での RETURNまたは END ステートメントの実行後。ただし、 27ページの『未定義を発生させるイベント』の項目 4 に記述されているオブジェクトを除きます。

v F2008 実行が BLOCK 構文を終了したときにポインターのターゲットが未定義になった場合。

INTEGER, POINTER :: POINTBLOCK

INTEGER, TARGET :: TARG = 2POINT => TARG

END BLOCK ! point becomes undefined here

F2008

v F2008 ポインターが BLOCK 構文の未保管のローカル・ポインターであり、BLOCK 構文の実行が完了している場合。 F2008

定義状況と関連付け状況

ポインターの定義状況は、そのターゲットの状況です。ポインターが定義可能なターゲットに関連付けられている場合、そのポインターの定義状況は、変数の規則に従って定義済みまたは未定義状態になります。

ポインターの関連付け状況が関連解除 (Disassociated) または未定義 (Undefined) の場合には、そのポインターを参照したり、割り振り解除することはできません。関連付け状況にかかわらず、ポインターは、いつでも、無効にする、割り振る、またはポインターを代入することができます。ポインターが割り振られると、その定義状況は未定義になります。ポインターがポインター代入された場合は、その関連付け状況および定義状況は、そのターゲットによって決定されます。したがって、ポインターが定義済みのターゲットに関連付けされると、そのポインターは定義済みの状態になります。

整数ポインター関連付け (IBM 拡張)データ・オブジェクトに関連付けられた整数ポインターを使用すると、そのデータ・オブジェクトを参照することが可能になります。これを整数ポインター関連付けと呼びます。

整数ポインター関連付けは、次のような状況で限って行われます。

v 整数ポインターに、変数のアドレスを代入した場合

POINTER (P,A)P=LOC(B) ! A and B become associated

v 複数のポインティング先を同一の整数ポインターを指定して宣言した場合

POINTER (P,A), (P,B) ! A and B are associated

180 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 207: IBM XL Fortran for Linux, V15.1

v 複数の整数ポインターに、同じ変数のアドレス、またはストレージが関連付けられた他の変数のアドレスを代入した場合

POINTER (P,A), (Q,B)P=LOC(C)Q=LOC(C) ! A, B, and C become associated

v 仮引数として指定した整数ポインター変数に、他の仮引数または共通ブロックのメンバーのアドレスを代入した場合

POINTER (P,A)..

CALL SUB (P,B)..

SUBROUTINE SUB (P,X)POINTER (P,Y)P=LOC(X) ! Main program variables A

! and B become associated.

プログラム単位、プロシージャー、およびサブプログラムプログラム単位は 1 行以上のシーケンスで、ステートメント、コメント、およびディレクティブで構成されています。サブプログラムは、関数かサブルーチンのいずれかで、さらに内部サブプログラム、外部サブプログラム、またはモジュール・サブプログラムのいずれかになります。プログラム単位は、具体的には次のものを指しています。

v メインプログラム

v モジュール

v F2008 サブモジュール F2008

v ブロック・データ・プログラム単位

v 外部関数サブプログラム

v 外部サブルーチン・サブプログラム

実行可能プログラムは、1 つのメインプログラム、任意の数の外部サブプログラム、モジュール、 F2008 サブモジュール F2008 、およびブロック・データ・プログラム単位からなるプログラム単位の集合です。

サブプログラムは、特定のアクティビティーを実行するためにメインプログラムまたは別のサブプログラムから呼び出すことができます。プロシージャーを呼び出すと、参照されたサブプログラムが実行されます。

外部サブプログラムまたはモジュール・サブプログラムには、複数の ENTRY ステートメントを入れることができます。サブプログラムは、各 ENTRY ステートメントごとに 1 つのプロシージャーを定義し、さらに SUBROUTINE またはFUNCTION ステートメントに対するプロシージャーを定義します。

外部プロシージャーは、外部サブプログラムまたは Fortran 以外のプログラム言語で作成されたプログラム単位のいずれかで定義されます。

メインプログラム、外部プロシージャー、ブロック・データ・プログラム単位、共通ブロック、バインディング・ラベルのあるエンティティー、モジュール、および

F2008

第 8 章 プログラム単位およびプロシージャー 181

Page 208: IBM XL Fortran for Linux, V15.1

F2008 サブモジュール F2008 は、グローバル・エンティティーです。内部プロシージャーおよびモジュール・プロシージャーは、ローカル・エンティティーです。

内部プロシージャー外部サブプログラム、モジュール・サブプログラム、およびメインプログラムには、関数あるいはサブルーチンの形で、CONTAINS ステートメント以降に内部サブプログラムを組み込むことができます。

内部プロシージャーは、内部サブプログラムによって定義されます。内部サブプログラムは他の内部サブプログラムには組み込めません。モジュール・プロシージャーは、モジュール・サブプログラムまたはモジュール・サブプログラム内の入り口によって定義されます。内部プロシージャーおよびモジュール・プロシージャーは外部プロシージャーと同様ですが、次の点が異なります。

v 内部プロシージャーまたはモジュール・プロシージャーの名前は、グローバル・エンティティーではありません。

v 内部プロシージャーには、ENTRY ステートメントが含まれていてはなりません。

v 内部プロシージャーの名前は、ダミー・プロシージャーに関連付けられた引数であってはなりません。

v 内部プロシージャーには、ホスト関連付けによるホスト・エンティティーに対するアクセス権限があります。

v F2008 NAME= 指定子を持つ BIND 属性は、内部プロシージャーでは許可されません。 F2008

182 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 209: IBM XL Fortran for Linux, V15.1

インターフェースの概念プロシージャーのインターフェースは、プロシージャー参照の形式を決定します。インターフェースは次の要素で構成されます。

v プロシージャーの特性

v プロシージャーの名前

v 仮引数の名前および特性

v プロシージャーの総称識別子 (ある場合)

プロシージャーの特性:

v プロシージャーの区別 (サブルーチンまたは関数のいずれか)

v 各仮引数の区別 (データ・オブジェクト、ダミー・プロシージャー、代替戻り指定子のいずれか)

ダミー・データ・オブジェクトの特性は、その宣言型、型パラメーター (ある場

合)、形状 TS 29113 (想定ランクの場合を除く) TS 29113 、意図、オプションかどうか、割り振り可能かどうか、 ポリモアフィックかどうか、 ポインターであるかどうか、ターゲットであるかどうか、あるいは VALUE

または F2008 CONTIGUOUS F2008 属性を持っているかどうかです。型パラメーターまたは配列境界の決定に関する他のオブジェクトへの依存性も特性の 1 つです。形状、サイズ、または文字長が想定または据え置かれる場合、それも特性に含まれます。

マイグレーションのためのヒント:

外部プロシージャーを内部サブプログラムに変えるか、またはモジュールの中に入れます。明示的インターフェースでは、型の検査を行います。

FORTRAN 77 ソース

PROGRAM MAININTEGER AA=58CALL SUB(A) ! A must be passed

ENDSUBROUTINE SUB(A)

INTEGER A,B,C ! A must be redeclaredC=A+B

END

Fortran 90/95/2003 ソース:

PROGRAM MAININTEGER :: A=58CALL SUBCONTAINSSUBROUTINE SUB

INTEGER B,CC=A+B ! A is accessible by host association

END SUBROUTINEEND

第 8 章 プログラム単位およびプロシージャー 183

Page 210: IBM XL Fortran for Linux, V15.1

ダミー・プロシージャーの特性は、インターフェースの明示性、プロシージャーの特性 (インターフェースが明示的な場合)、およびオプションかどうかです。

v プロシージャーが関数の場合、次のような結果値の特性があります。

– 宣言型

– あらゆる型パラメーター

– ランク

– 結果値がポインターかどうか

– 結果値がプロシージャー・ポインターかどうか

– 結果値が割り振り可能かどうか

– 結果値がポリモアフィックかどうか

– F2008 結果値が連続しているかどうか。 F2008

非ポインター、割り振り不可の配列結果の場合、その形状も特性の 1 つです。型パラメーターまたは配列境界の決定に関する他のオブジェクトへの依存性も特性の 1 つです。文字オブジェクトの長さが想定される場合は、それも特性に含まれます。関数結果の型パラメーターが据え置かれる場合、どのパラメーターを据え置きにするかも特性です。

v プロシージャーが PURE、 ELEMENTAL のいずれかの指定

v プロシージャーに BIND 属性を設定するかどうかの指定

有効範囲単位内でプロシージャーがアクセス可能であれば、プロシージャーはその有効範囲単位内で明示的または暗黙のどちらかのインターフェースをとります。この場合の規則は、次のとおりです。

エンティティー インターフェース

ダミー・プロシージャー インターフェース・ブロックが存在するかアクセス可能な場合、または PROCEDURE 宣言ステートメントで明示的インターフェースが指定されている場合は、有効範囲単位では明示的。それ以外の場合は、すべて暗黙的。

外部サブプログラム インターフェース・ブロックが存在するかアクセス可能な場合、または PROCEDURE 宣言ステートメントで明示的インターフェースが指定されている場合は、それ自体の有効範囲単位以外の有効範囲単位では明示的。それ以外の場合は、すべて暗黙的。

結果節がある再帰的プロシージャー

サブプログラム自体の有効範囲単位で明示的。

モジュール・プロシージャー 常に明示的

内部プロシージャー 常に明示的

総称プロシージャー 常に明示的

組み込みプロシージャー 常に明示的

ステートメント関数 常に暗黙的

内部サブプログラムは、インターフェース・ブロックまたは PROCEDURE 宣言ステートメントには入れられません。

184 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 211: IBM XL Fortran for Linux, V15.1

範囲単位指定内のプロシージャーは、アクセス可能なインターフェースを複数持つことはできません。

ステートメント関数のインターフェースは、インターフェース・ブロックまたはPROCEDURE 宣言ステートメントには指定できません。

明示的インターフェース以下の場合は、プロシージャーが明示的インターフェースを持つ必要があります。

1. 次のようなプロシージャーへの参照がある場合

v 引数キーワードが指定されている

v 定義済み代入になっている (サブルーチンの場合のみ)

v 式の中で定義済み演算子になっている (関数の場合のみ)

v 総称名による参照になっている

v 純粋であることが要求されるコンテキスト内にある

2. プロシージャーに次のものがある場合

v ALLOCATABLE、 OPTIONAL、POINTER、TARGET、または、 VALUE 属性が設定されている仮引数

v ポリモアフィックな仮引数

v 配列値の結果 (関数の場合のみ)

v length 型パラメーターが想定されない、あるいは定数で指定されていない結果(文字関数の場合のみ)

v ポインターまたは割り振り可能な結果 (関数の場合のみ)

v 想定形状配列の仮引数

3. プロシージャーがエレメント型である場合

4. プロシージャーに BIND 属性がある場合

暗黙インターフェースインターフェースが明確でない場合、つまりサブプログラムに明示インターフェースがない場合、プロシージャーは暗黙のインターフェースをとります。

インターフェース・ブロックインターフェース・ブロックを使用すれば、外部プロシージャーおよびダミー・プロシージャーに対して明示的インターフェースを指定することができます。また、インターフェース・ブロックを使用して、総称識別子を定義することもできます。インターフェース・ブロック内のインターフェース本体には、既存の外部プロシージャーまたはダミー・プロシージャーの特定の明示的インターフェースが指定されます。プロシージャーのインターフェースは、プロシージャー・ステートメントを使用して指定することもできます。

第 8 章 プログラム単位およびプロシージャー 185

Page 212: IBM XL Fortran for Linux, V15.1

INTERFACE_statement

構文の詳細については、 448ページの『INTERFACE』を参照してください。

END_INTERFACE_statement

構文の詳細については、 392ページの『END INTERFACE』を参照してください。

PROCEDURE_statement

構文の詳細については、 479ページの『PROCEDURE』を参照してください。

FUNCTION_interface_body

SUBROUTINE_interface_body

�� INTERFACE_statement ��

�� �

FUNCTION_interface_bodySUBROUTINE_interface_bodyPROCEDURE_statement

��

�� END_INTERFACE_statement ��

�� FUNCTION_statement ��

��specification_part

��

�� end_function_statement ��

�� SUBROUTINE_statement ��

��specification_part

��

�� end_subroutine_statement ��

186 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 213: IBM XL Fortran for Linux, V15.1

FUNCTION_statement、SUBROUTINE_statement

構文の詳細については、 419ページの『FUNCTION』および 517ページの『SUBROUTINE』を参照してください。

specification_part

17ページの『ステートメントの順序および実行シーケンス』で �2�、�3�、�5� の番号が付されているステートメント・グループの一連のステートメントです。

end_function_statement、end_subroutine_statement

この 2 つのステートメントの構文詳細については、 387ページの『END』を参照してください。

インターフェース本体またはプロシージャー宣言ステートメントでは、プロシージャーまたは抽象インターフェースの特性のすべてを指定します。詳しくは、 183ページの『インターフェースの概念』を参照してください。この特性は、サブプログラムの定義で指定した内容と一致している必要があります。ただし、以下の例外があります。

1. 仮引数の名前は一致しなくてもかまいません。

2. プロシージャーを定義しているサブプログラムが純粋である場合でも、プロシージャーを純粋とする必要はありません。

3. 純粋な実引数を、純粋でないダミー・プロシージャーに関連付けることができます。

4. 組み込みエレメント型プロシージャーをダミー・プロシージャーと関連付ける場合、ダミー・プロシージャーはエレメント型である必要はありません。

インターフェース本体の specification_part には、プロシージャーの特性を決定しないデータ・オブジェクトの属性指定や値の定義を行うステートメントを入れることができます。そのような仕様ステートメントは、インターフェースには影響しません。インターフェース・ブロックは、その特性がモジュール・サブプログラム定義で定義されるモジュール・プロシージャーの特性を指定しません。

インターフェース本体には、ENTRY ステートメント、DATA ステートメント、FORMAT ステートメント、ステートメント関数ステートメント、または実行可能ステートメントを入れることはできません。インターフェース本体のプロシージャー名として入り口名を使用すれば、入り口インターフェースを指定することができます。

インターフェース本体は、 IMPORT ステートメントが指定されていない場合には、ホスト関連付けによって名前付きエンティティーにアクセスすることはありません。インターフェース本体は、デフォルトの暗黙規則が設定されたホストと同様に扱われます。暗黙規則の説明については、 20ページの『型の決定』を参照してください。

インターフェース・ブロックは、抽象、総称、特定のいずれかです。総称インターフェース・ブロックは、 INTERFACE ステートメント内で総称仕様を指定しなければなりませんが、抽象または特定インターフェース・ブロックではそのような総称仕様を指定する必要はありません。詳しくは、 448ページの『INTERFACE』を参照してください。

第 8 章 プログラム単位およびプロシージャー 187

Page 214: IBM XL Fortran for Linux, V15.1

抽象または特定インターフェース・ブロック内部のインターフェース本体には、サブルーチンおよび関数両方のインターフェースを入れることができます。

総称名は、単一の名前を指定してインターフェース・ブロック内のすべてのプロシージャーを参照します。総称名でのプロシージャー参照が発生するたびに、1 つ以下の特定のプロシージャーが呼び出されます。

PROCEDURE ステートメントが使用できるのは、インターフェース・ブロックに総称仕様があり、かつ各プロシージャー名がアクセス可能な有効範囲単位内に入れられている場合だけです。

PROCEDURE ステートメントで使用されるプロシージャー名は、アクセス可能なインターフェース・ブロック中の MODULE PROCEDURE ステートメントで以前に同一の総称識別子で指定された名前にすることはできません。

Fortran 以外のサブプログラムに対するインターフェースの場合、FUNCTION または SUBROUTINE ステートメント内の仮引数リストにより、引き渡し方法を明示的に指定できます。詳しくは、 218ページの『仮引数』を参照してください。

例MODULE MCONTAINSSUBROUTINE S1(IARG)

IARG = 1END SUBROUTINE S1SUBROUTINE S2(RARG)

RARG = 1.1END SUBROUTINE S2SUBROUTINE S3(LARG)

LOGICAL LARGLARG = .TRUE.

END SUBROUTINE S3END

USE MINTERFACE SS

SUBROUTINE SS1(IARG,JARG)END SUBROUTINEMODULE PROCEDURE S1,S2,S3

END INTERFACECALL SS(II) ! Calls subroutine S1 from MCALL SS(I,J) ! Calls subroutine SS1END

SUBROUTINE SS1(IARG,JARG)IARG = 2JARG = 3

END SUBROUTINE

プロシージャーは、特定インターフェースによっていつでも参照できます。プロシージャー用の汎用インターフェースが存在する場合は、その汎用インターフェースを介してプロシージャーを参照することもできます。

インターフェース本体内では、仮引数をダミー・プロシージャーとする場合、仮引数に EXTERNAL 属性を指定するか、または仮引数のインターフェースを確保する必要があります。

188 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 215: IBM XL Fortran for Linux, V15.1

総称インターフェース・ブロックINTERFACE ステートメントでは、総称インターフェース・ブロックに以下のいずれか 1 つを指定しなければなりません。

v 総称名

v 定義済み演算子

v 定義済み代入

v 派生型の入出力総称仕様

総称名は単一名で、その名前を使用することによりインターフェース・ブロックで指定されているすべてのプロシージャーを参照することができます。この名前は、アクセス可能な任意の総称名、またはインターフェース・ブロック内の任意のプロシージャー名と同じ名前にすることができます。

ある有効範囲単位内でアクセス可能な複数の総称インターフェースが同じローカル名を持っている場合、それらの総称インターフェースは 1 つの総称インターフェースと解釈されます。

一義的な総称プロシージャー参照総称プロシージャーに対する参照を行う場合、1 つの特定のプロシージャーだけが呼び出されます。このセクションでは、総称参照が必ず一義的になるようにするための規則を記載します。

同一の有効範囲単位内にある 2 つのプロシージャーが、共に代入を定義しているか、または同じ定義済み演算子と同じ数の引数を持っている場合、引数リストの位置が他方の仮引数に対応し、それと区別できる仮引数を指定しなければなりません。以下のいずれかの要件を満たしている場合、2 つの仮引数は識別可能です。

v F2008 一方はプロシージャーで、他方がデータ・オブジェクトである。F2008

v 両方ともデータ・オブジェクトであり、両方とも相互に TKR 互換でない。

v F2008 両方とも関数であり、両方とも相互に TKR 互換でない。 F2008

v F2008 両方ともデータ・オブジェクトであり、一方は ALLOCATABLE 属性を持ち、他方は POINTER 属性を持っているが INTENT(IN) 属性は持っていない。 F2008

v F2008 一方は配列を返す関数であり、他方は関数に認識されていない。F2008

同じ有効範囲単位内で、2 つのプロシージャーの dtio_generic_spec が同一の場合、dtv 引数は、型非互換か、異なる kind 型パラメーターになっていなければなりません。 (dtio_generic_spec の指定、および dtv 引数については、 250ページの『ユーザー定義の派生型入出力プロシージャー・インターフェース (Fortran 2003)』を参照してください。)

同じ有効範囲単位内では、同じ総称名を持つ 2 つのプロシージャーは、両方ともサブルーチンであるか、または両方とも関数でなければなりません。また、それらのプロシージャーは、次の条件に従っていなければなりません。

1. 一方のプロシージャーに非オブジェクト受け渡し仮引数が組み込まれており、そのプロシージャー内の非オプション、非オブジェクト受け渡しであり、かつ仮引

第 8 章 プログラム単位およびプロシージャー 189

Page 216: IBM XL Fortran for Linux, V15.1

数と TKR 互換である非オブジェクト受け渡し仮引数 (その仮引数自身を含む可能性がある) の数が、他方のプロシージャー内の、オプションおよび非オプション両方の非オブジェクト受け渡し仮引数で、仮引数と区別できない非オブジェクト受け渡し仮引数の数より多い。

2. いずれのプロシージャーにも、オブジェクト受け渡し仮引数があり、それらが区別できる。

3. 少なくとも一方のプロシージャーに、次の 2 つの仮引数がある。

a. 有効な位置にある非オプションの非オブジェクト受け渡し仮引数で、他方のプロシージャーにはその有効な位置に仮引数がないか、仮引数がある場合はそれと区別できる仮引数。

b. 非オプションの、非オブジェクト受け渡し仮引数で、名前が他方のプロシージャーに同名の仮引数がないか、同名の仮引数がある場合はそれと区別できる仮引数。

位置によって一義化される仮引数は、名前によって一義化される仮引数と同じか、引数リストで名前によって一義化される仮引数より前に指定する必要があります。

仮引数の有効な位置とは、オブジェクト受け渡し仮引数が削除された後の引数リスト内の位置を指しています。

インターフェース・ブロックが組み込みプロシージャーを拡張する場合、その組み込みプロシージャーが特定のプロシージャーの集合 (使用可能な引数の各集合ごとに 1 つのプロシージャー) から構成されている場合と同様に、このセクションの規則が適用されます。

注:

v BYTE 型の仮引数の型は、INTEGER(1)、LOGICAL(1)、および文字型の対応する 1 バイトの仮引数の型と同じであると見なされます。

v -qintlog コンパイラー・オプションを指定すると、整数型および論理型の仮引数の型は、同じ kind 型パラメーターを持つ整数型および論理型の対応する仮引数の型と同じであると見なされます。

例PROGRAM MAININTERFACE A

FUNCTION AI(X)INTEGER AI, X

END FUNCTION AIEND INTERFACEINTERFACE A

FUNCTION AR(X)REAL AR, X

END FUNCTION AREND INTERFACEINTERFACE FUNC

INTEGER FUNCTION FUNC1(I, EXT)INTEGER IEXTERNAL EXT ! Here, EXT is a procedure

END FUNCTION FUNC1INTEGER FUNCTION FUNC2(EXT, I)

INTEGER IREAL EXT ! Here, EXT is a variable

190 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 217: IBM XL Fortran for Linux, V15.1

END FUNCTION FUNC2END INTERFACEEXTERNAL MYFUNCIRESULT=A(INTVAL) ! Call to function AIRRESULT=A(REALVAL) ! Call to function ARRESULT=FUNC(1,MYFUNC) ! Call to function FUNC1END PROGRAM MAIN

FUNCTION AI(X)INTEGER AI, XPRINT *," Inside AI()"AI = X + 10

END FUNCTION AI

FUNCTION AR(X)REAL AR, XPRINT *," Inside AR()"AR = X - 2.0

END FUNCTION AR

INTEGER FUNCTION FUNC1(I, EXT)INTEGER IEXTERNAL EXTPRINT *," Inside FUNC1()"FUNC1 = EXT(I)

END FUNCTION FUNC1

INTEGER FUNCTION MYFUNC (I)INTEGER IPRINT *," Inside MYFUNC()"MYFUNC = I - 100

END FUNCTION MYFUNC

総称インターフェース・ブロックによる組み込みプロシージャーの拡張

総称組み込みプロシージャーは、拡張または再定義することが可能です。拡張された組み込みプロシージャーは、既存の特定組み込みプロシージャーを補います。再定義された組み込みプロシージャーは、既存の特定組み込みプロシージャーと置換されます。

総称名と総称組み込みプロシージャー名が同じで、その名前に INTRINSIC 属性が指定されている場合 (または組み込みコンテキストに指定されている場合)、総称インターフェースは総称組み込みプロシージャーの拡張を行います。

総称名と総称組み込みプロシージャー名が同じでも、その名前に INTRINSIC 属性が指定されていない場合 (または組み込みコンテキストに指定されていない場合)、総称インターフェースは総称組み込みプロシージャーの再定義を行うことができます。

名前に INTRINSIC 属性が指定されている場合 (または組み込みコンテキストに指定されている場合)、総称インターフェース名が、特定の組み込みプロシージャー名と同じになることはありません。

例PROGRAM MAININTRINSIC MAXINTERFACE MAX ! Extension to intrinsic MAX

FUNCTION MAXCHAR(STRING)

第 8 章 プログラム単位およびプロシージャー 191

Page 218: IBM XL Fortran for Linux, V15.1

CHARACTER(50) STRINGEND FUNCTION MAXCHAR

END INTERFACEINTERFACE ABS ! Redefines generic ABS as

FUNCTION MYABS(ARG) ! ABS does not appear inREAL(8) MYABS, ARG ! an INTRINSIC statement

END FUNCTION MYABSEND INTERFACEREAL(8) DARG, DANSREAL(4) RANSINTEGER IANS,IARGCHARACTER(50) NAMEDANS = ABS(DARG) ! Calls external MYABSIANS = ABS(IARG) ! Calls intrinsic IABSDANS = DABS(DARG) ! Calls intrinsic DABSIANS = MAX(NAME) ! Calls external MAXCHARRANS = MAX(1.0,2.0) ! Calls intrinsic AMAX1END PROGRAM MAIN

定義済み演算子定義済み演算子とは、ユーザー定義の単項演算子、2 項演算子、または拡張組み込み演算子のことです ( 125ページの『拡張組み込み演算および定義済み演算』を参照)。定義済み演算子は、関数および総称インターフェース・ブロックの両方で定義しなければなりません。

1. 単項演算子 op x₁ は、次のように定義します。a. 1 つの仮引数 d₁ を指定する関数または入り口がなければなりません。b. 次のいずれかを満たす必要があります。

1) INTERFACE ステートメントの generic_spec が、OPERATOR (op) を指定する。

2) OPERATOR(op) の generic_spec が指定された宣言型 x1 の総称バインディングがあり、動的型 x1 の関数に対応するバインディングがある。

c. x₁ の動的型は、仮引数 d₁ の型と互換性があります。d. x₁ の型パラメーターがある場合、d₁ の型パラメーターと一致する必要があります。

e. 次のいずれかを満たす必要があります。v 関数が ELEMENTAL になっている。v x₁ が配列の場合、そのランクと形状が d₁ と一致している。

2. 2 項演算子 x₁ op x₂ は、次のように定義します。a. 関数は、FUNCTION または ENTRY ステートメントで指定し、これによって 2 つの仮引数、d₁ および d₂ を指定します。

b. 次のいずれかを満たす必要があります。1) INTERFACE ブロックの generic_spec が、OPERATOR (op) を指定する。

2) OPERATOR(op) の generic_spec が指定された宣言型 x1 または x2 の総称バインディングがあり、動的型 x1 または x2 それぞれの関数に対応するバインディングがある。

c. x₁ と x₂ の動的型は、それぞれ仮引数 d₁ と d₂ の型と互換性があります。

d. x₁ と x₂ に型パラメーターがある場合、それぞれ d₁ と d₂ の型パラメーターと一致する必要があります。

e. 次のいずれかを満たす必要があります。

192 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 219: IBM XL Fortran for Linux, V15.1

v 関数が ELEMENTAL で、x₁ と x₂ がこれに適合している。v x₁ および x₂ のいずれか、または両方が配列である場合、そのランクと形状が、それぞれ d₁ および d₂ のランクと形状に一致している。

3. op が組み込み演算子である場合、x₁ または x₂ のいずれかの型あるいはランクは、組み込み演算子に必要な形またはランクになりません。

4. generic_spec は、引数のない関数または 3 つ以上の引数がある関数に対してOPERATOR を指定することはできません。

5. 各引数は必須です。

6. 引数は、INTENT(IN) で指定する必要があります。

7. インターフェース内に指定された各関数は、想定されている文字長の結果にすることはできません。

8. 指定された演算子が組み込み演算子の場合、その関数引数の数はその演算子の組み込み使用数と一致する必要があります。

9. 指定された定義済み演算子は、総称名と同様、複数の関数に適用することができます。その場合、その演算子は、総称プロシージャー名のように総称となります。組み込み演算子記号の場合、その総称特性には、その組み込み演算子記号が表す組み込み演算が含まれます。

10. 次の規則は、拡張組み込み演算にのみ適用されます。

a. 引数の型の 1 つを BYTE 型にできるのは、もう一方の引数の型が派生型の場合に限られます。

b. -qintlog コンパイラー・オプションが非文字演算に指定されていて、d₁ が数値または論理の場合、d₂ は、数値または論理であってはなりません。

c. -qctyplss コンパイラー・オプションが非文字演算に指定され、x₁ が数値または論理で、x₂ が文字定数の場合、組み込み演算は実行されます。

例INTERFACE OPERATOR (.DETERMINANT.)

FUNCTION IDETERMINANT (ARRAY)INTEGER, INTENT(IN), DIMENSION (:,:) :: ARRAYINTEGER IDETERMINANT

END FUNCTIONEND INTERFACEEND

定義済み代入定義済み代入は、サブルーチンの参照と見なされます。左側を最初の引数とし、右側を 2 番目の引数として括弧で囲まれます。

1. 定義済み代入 x₁ = x₂ は、次のように定義します。

a. サブルーチンは、SUBROUTINE または ENTRY ステートメントで指定し、これによって 2 つの仮引数、d₁ および d₂ を指定します。

b. 次のいずれかを満たす必要があります。

1) インターフェース・ブロックの generic_spec が、ASSIGNMENT (=) を指定する。

第 8 章 プログラム単位およびプロシージャー 193

Page 220: IBM XL Fortran for Linux, V15.1

2) ASSIGNMENT(=) の generic_spec が指定された宣言型 x1 または x2 の総称バインディングがあり、動的型 x1 または x2 それぞれのサブルーチンに対応するバインディングがある。

c. x₁ と x₂ の動的型は、それぞれ仮引数 d₁ と d₂ の型と互換性があります。

d. x₁ と x₂ に型パラメーターがある場合、それぞれ d₁ と d₂ の型パラメーターと一致する必要があります。

e. 次のいずれかを満たす必要があります。

v サブルーチンが ELEMENTAL で、x₁ と x₂ が同じ形状か、x₂ がスカラーになっている。

v x₁ および x₂ のいずれか、または両方が配列である場合、そのランクと形状が、それぞれ d₁ および d₂ のランクと形状に一致している。

2. ASSIGNMENT は、2 つの引数を持つサブルーチンにのみ使用してください。

3. 各引数は必須です。

4. 最初の引数には、INTENT(OUT) または INTENT(INOUT) を指定し、 2 番目の引数には INTENT(IN) を指定します。

5. 引数の型は、両方とも数値、両方とも論理、または、両方とも同じ kind パラメーターの文字にすることはできません。

引数の型の 1 つを BYTE 型にできるのは、もう一方の引数の型が派生型の場合に限られます。

-qintlog コンパイラー・オプションが指定されていて、d₁ が数値または論理の場合、d₂ は、数値または論理であってはなりません。

-qctyplss コンパイラー・オプションが指定され、x₁ が数値または論理で、x₂ が文字定数の場合、組み込み代入が実行されます。

6. ASSIGNMENT 総称仕様は、等号の左右両辺が同じ派生型である場合に、代入演算を拡張または再定義することを指定します。

例INTERFACE ASSIGNMENT(=)

SUBROUTINE BIT_TO_NUMERIC (N,B)INTEGER, INTENT(OUT) :: NLOGICAL, INTENT(IN), DIMENSION(:) :: B

END SUBROUTINEEND INTERFACE

ユーザー定義の派生型入出力プロシージャー (Fortran 2003)ユーザー定義の派生型入出力プロシージャーを使用すると、プログラムがデータ転送入出力ステートメントの派生型のオブジェクトおよび値のデフォルトの処理をオーバーライドできます。

以下の入出力操作ごとに、4 つのインターフェースがあります。

v 定様式入力

v 定様式出力

v 不定形式入力

v 不定形式出力

194 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 221: IBM XL Fortran for Linux, V15.1

この 4 つのインターフェースは、dtv 型指定、すなわち、 dtv_type_spec を使用します。dtv_type_spec の構文は、次のとおりです。

derived_type_spec に拡張可能な型を指定する場合、 CLASS キーワードを使用します。そうでない場合は、TYPE キーワードを使用してください。

derived_type_spec のすべての length 型パラメーターを想定する必要があります。

次の表は、インターフェース・ブロックまたは総称バインディングの 4 つのdtio_generic_spec 指定それぞれに必要なユーザー定義プロシージャーの特性を示しています。

表 20. ユーザー定義の派生型入出力プロシージャーのインターフェース

dtio_generic_spec インターフェース

READ (FORMATTED) SUBROUTINE my_read_routine_formatted &(dtv, unit, iotype, v_list, iostat, iomsg)

INTEGER, INTENT(IN) :: unit ! unit number! the derived-type value/variabledtv_type_spec, INTENT(INOUT) :: dtv! the edit descriptor stringCHARACTER (LEN=*), INTENT(IN) :: iotypeINTEGER, INTENT(IN) :: v_list(:)INTEGER, INTENT(OUT) :: iostatCHARACTER (LEN=*), INTENT(INOUT) :: iomsg

END SUBROUTINE

READ (UNFORMATTED) SUBROUTINE my_read_routine_unformatted &(dtv, unit, iostat, iomsg)

INTEGER, INTENT(IN) :: unit! the derived-type value/variabledtv_type_spec, INTENT(INOUT) :: dtvINTEGER, INTENT(OUT) :: iostatCHARACTER (LEN=*), INTENT(INOUT) :: iomsg

END SUBROUTINE

WRITE (FORMATTED) SUBROUTINE my_write_routine_formatted &(dtv, unit, iotype, v_list, iostat, iomsg)

INTEGER, INTENT(IN) :: unit! the derived-type value/variabledtv_type_spec, INTENT(IN) :: dtv! the edit descriptor stringCHARACTER (LEN=*), INTENT(IN) :: iotypeINTEGER, INTENT(IN) :: v_list(:)INTEGER, INTENT(OUT) :: iostatCHARACTER (LEN=*), INTENT(INOUT) :: iomsg

END SUBROUTINE

WRITE (UNFORMATTED) SUBROUTINE my_write_routine_unformatted &(dtv, unit, iostat, iomsg)

INTEGER, INTENT(IN) :: unit! the derived-type value/variabledtv_type_spec, INTENT(IN) :: dtvINTEGER, INTENT(OUT) :: iostatCHARACTER (LEN=*), INTENT(INOUT) :: iomsg

END SUBROUTINE

�� TYPECLASS

( derived_type_spec ) ��

第 8 章 プログラム単位およびプロシージャー 195

Page 222: IBM XL Fortran for Linux, V15.1

注: 実際の個々のプロシージャー名 (上記の「my ... routine ... procedure」という名前の部分) は、意味はありません。ここおよび他の箇所での説明では、これらのインターフェースの仮引数は上記の名前で引用しますが、実際の名前は任意です。

以下に引数の特性を示します。

dtv

親データ転送ステートメントが READ ステートメントの場合、dtv は、ユーザー定義の派生型入力プロシージャーを呼び出す有効リスト項目に関連付けられた引数で、この有効リスト項目が、このプロシージャー参照の実引数であるのと同様の扱いになります。親データ転送ステートメントが、WRITE または PRINT ステートメントの場合、dtv には、有効リスト項目を指定します。

unit ユーザー定義の派生型入出力プロシージャーを呼び出す場合、unit の値は、次のようになります。

v 親データ転送ステートメントが file-unit-number を使用する場合、値はその file-unit-number の値になります。

v 親データ転送ステートメントが、アスタリスクで装置を指定した WRITEステートメント、または、PRINT ステートメントの場合、値は、ISO_FORTRAN_ENV 組み込みモジュールの OUTPUT_UNIT 名前付き定数の値と同じになります。

v 親データ転送ステートメントが、アスタリスクで装置を指定した READステートメント、または、io-control-spec-list のない READ ステートメントの場合、値は、 ISO_FORTRAN_ENV 組み込みモジュールのINPUT_UNIT 名前付き定数の値と同じになります。

v 以上のいずれにも該当しない場合、親データ転送ステートメントは、内部ファイルにアクセスする必要があります。この場合、値は負になります。

iotype 定様式データ転送の場合、iotype の値は、次のようになります。

v "LISTDIRECTED": 親データ転送ステートメントがリスト指示の形式設定を指定した場合

v "NAMELIST": 親データ転送ステートメントが名前リストの形式設定を指定した場合

v "DT"、および編集記述子の char-literal-constant があればそれを連結する:

親データ転送ステートメントに、形式仕様があり、リスト項目の対応する編集記述子が DT 編集記述子の場合

v_list 定様式データ転送の場合、v_list の値は、次のようになります。

v 編集記述子の v-list が、親データ転送ステートメントにある場合、 v_list

には、v-list に指定された値、および同数のエレメントが同じ順序で指定されます。

v 編集記述子に v-list がないか、データ転送ステートメントが、リスト指示または名前リストの形式設定の場合、v_ list は、サイズがゼロの配列になります。

iostat エラー、レコードの終わり、または、ファイルの終わりの各条件の発生報告に使用されます。 iostat の値は、次のように割り当てられています。

196 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 223: IBM XL Fortran for Linux, V15.1

v エラー条件が発生した場合、正の値になります。

v ファイル終了条件が発生した場合、値は、名前付き定数 IOSTAT_END の値になります。

v レコード終了条件が発生した場合、値は、名前付き定数 IOSTAT_EOR の値になります。

v 以上のいずれでもない場合は、値はゼロになります。

iomsg iostat 引数がゼロ以外の値を返した場合、プロシージャーは、iomsg に説明メッセージを入れて返します。引数がゼロの場合は、iomsg 引数の値は変わりません。

抽象インターフェース (Fortran 2003)抽象インターフェースを利用すると、プロシージャー特性および仮引数名をプロシージャーに付けて宣言することなく、これらの特性を指定することができます。抽象インターフェースを使用すれば、プロシージャーおよび据え置きバインディングのインターフェースを宣言できます。抽象インターフェース・ブロックで定義されるプロシージャー名には、EXTERNAL 属性は設定されません。

ABSTRACT_INTERFACE_statement

構文の詳細については、 317ページの『ABSTRACT (Fortran 2003)』を参照してください。

FUNCTION_interface_body

構文の詳細については、 185ページの『インターフェース・ブロック』を参照してください。

SUBROUTINE_interface_body

構文の詳細については、 185ページの『インターフェース・ブロック』を参照してください。

PROCEDURE_statement

構文の詳細については、 479ページの『PROCEDURE』を参照してください。

�� ABSTRACT_INTERFACE_statement ��

�� �

FUNCTION_interface_bodySUBROUTINE_interface_bodyPROCEDURE_statement

��

�� END_ABSTRACT_INTERFACE_statement ��

第 8 章 プログラム単位およびプロシージャー 197

Page 224: IBM XL Fortran for Linux, V15.1

END_ABSTRACT_INTERFACE_statement

構文の詳細については、 392ページの『END INTERFACE』を参照してください。

例MODULE MABSTRACT INTERFACESUBROUTINE SUB(X,Y)INTEGER ,INTENT(IN)::XINTEGER ,INTENT(IN)::YEND SUBROUTINEEND INTERFACEEND MODULE

PROGRAM MAINUSE MPROCEDURE (SUB) SUB1PROCEDURE (SUB), POINTER::PP=>SUB1CALL P(5,10)END PROGRAM

SUBROUTINE SUB1 (X,Y)INTEGER ,INTENT(IN)::XINTEGER ,INTENT(IN)::YPRINT*, "The sum of X and Y is: ", X + Y

END SUBROUTINE

関連情報

詳細については、以下を参照してください。

v PROCEDURE 宣言: 481ページの『PROCEDURE 宣言 (Fortran 2003)』

v 外部プロシージャー: 181ページの『プログラム単位、プロシージャー、およびサブプログラム』

v ダミー・プロシージャー: 230ページの『仮引数がプロシージャーの場合』

v モジュール・プロシージャー: 199ページの『モジュール』

メインプログラムメインプログラムとは、実行時に実行可能プログラムが呼び出されたときにシステムの制御を受け取るプログラム単位のことです。

198 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 225: IBM XL Fortran for Linux, V15.1

PROGRAM_statement

構文の詳細については、 484ページの『PROGRAM』を参照してください。

specification_part

17ページの『ステートメントの順序および実行シーケンス』で �2�、�4�、�5� の番号が付されているステートメント・グループの一連のステートメントです。

execution_part

17ページの『ステートメントの順序および実行シーケンス』で、�4� および �6� の番号が付されているステートメント・グループの一連のステートメントで、ステートメント・グループ �6� のステートメントから先に指定します。

internal_subprogram_part

詳しくは、 182ページの『内部プロシージャー』を参照してください。

END_PROGRAM_statement

構文の詳細については、 387ページの『END』を参照してください。

メインプログラムに、ENTRY ステートメントを入れたり、自動オブジェクトを指定したりすることはできません。

RETURN ステートメントは、メインプログラムに入れることができます。RETURN ステートメントを実行した場合、END ステートメントを実行した場合と同じ効果になります。

モジュールモジュールには、他のプログラム単位から使用できる仕様および定義が入っています。これらの定義には、データ・オブジェクト定義、名前リスト・グループ、派生型定義、プロシージャーのインターフェース・ブロック、およびプロシージャー定義があります。

��PROGRAM_statement

��

��specification_part

��

��execution_part

��

��internal_subprogram_part

��

�� END_PROGRAM_statement ��

第 8 章 プログラム単位およびプロシージャー 199

Page 226: IBM XL Fortran for Linux, V15.1

モジュールには、組み込みモジュール、非組み込みモジュールの 2 つのタイプがあります。XL Fortran では、組み込みモジュールを提供しており、非組み込みモジュールはユーザー定義となります。

組み込みモジュールには、プログラム単位、共通ブロック、外部プロシージャー、クリティカル・セクション、またはグローバル・エンティティーのバインディング・ラベルなど、その他のグローバル・エンティティーと同じ名前を指定できます。有効範囲単位は、同じ名前で組み込みモジュールと非組み込みモジュールの両方を使用することはできません。

モジュールは、グローバル・データを定義します。これは、COMMON データのように、スレッドで共有されるため、スレッド・アンセーフとなります。アプリケーションをスレッド・セーフにするには、グローバル・データをTHREADPRIVATE、または、THREADLOCAL として宣言する必要があります。詳しくは、 350ページの『COMMON』、「XL Fortran 最適化およびプログラミング・ガイド」に記載されている『THREADLOCAL』および『THREADPRIVATE』を参照してください。

構文

MODULE_statement

構文の詳細については、 456ページの『MODULE』を参照してください。

MODULE

�� MODULE_statement ��

��specification_part

��

��module_subprogram_part

��

�� END_MODULE_statement ��

module_subprogram_part

�� CONTAINS_statement ��

�� � module_subprogram ��

200 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 227: IBM XL Fortran for Linux, V15.1

specification_part

17ページの『ステートメントの順序および実行シーケンス』で�2�、�4�、�5� の番号が付されているステートメント・グループの一連のステートメントです。

CONTAINS_statement

構文の詳細については、 358ページの『CONTAINS』を参照してください。

END_MODULE_statement

構文の詳細については、 387ページの『END』を参照してください。

規則

モジュール・サブプログラムは、モジュール内にありますが、内部サブプログラムではありません。モジュール・サブプログラムは、CONTAINS ステートメントの後に続ける必要があり、内部プロシージャーを含むことができます。モジュール・プロシージャーは、モジュール・サブプログラムまたはモジュール・サブプログラム内の入口で定義します。

モジュール内の実行可能ステートメントは、モジュール・サブプログラム内に指定できます。

文字型のモジュール関数名の宣言では、アスタリスクを長さ指定に使用することはできません。

specification_part に、ステートメント関数ステートメント、ENTRY ステートメント、または FORMAT ステートメントを入れることはできませんが、これらのステートメントをモジュール・サブプログラムの宣言部分に入れることは可能です。

自動オブジェクトおよび AUTOMATIC 属性を持つオブジェクトは、モジュールの有効範囲には入れられません。

アクセス可能なモジュール・プロシージャーは、モジュール内の別のサブプログラムか、または参照結合による (つまり、USE ステートメントを使用することによって) モジュール外の有効範囲単位によって呼び出すことができます。詳しくは、534ページの『USE』を参照してください。

ポインティング先が定数以外の境界で次元宣言子を指定する場合、整数ポインターを specification_part に入れることができません。

モジュールの有効範囲内にあるすべてのオブジェクトは、その関連付け状況、割り振り状況、定義状況、さらに使用関連付けを介してモジュールにアクセスするプロシージャーが RETURN または END ステートメントを実行する際の値を保持します。詳細については、 27ページの『未定義を発生させるイベント』 の項目 4 を参照してください。

モジュールは、モジュール F2008 またはその下位サブモジュール F2008 に含まれるモジュール・プロシージャー、インターフェース・ブロック、または派生型定義に対するホストとなります。親子結合を介して、モジュール・プロシージャー、

第 8 章 プログラム単位およびプロシージャー 201

Page 228: IBM XL Fortran for Linux, V15.1

インターフェース・ブロック、派生型定義、 F2008 および下位サブモジュールF2008 は、モジュールの有効範囲内のエンティティーにアクセスできます。

モジュール・プロシージャーは、ダミー・プロシージャー引数に関連した実引数として使用することができます。

モジュール・プロシージャーの名前は、モジュールの有効範囲に対してローカルで、共通ブロック名以外のモジュール内のどのエンティティー名とも同じにすることはできません。

F2008 specification_part で、分離モジュール・プロシージャーのインターフェースを指定する、モジュール・プロシージャー・インターフェース本体を宣言できます。 例 2 を参照してください。いずれかの下位サブモジュールで、分離モジュール・プロシージャーを後から定義することができます。 F2008

マイグレーションのためのヒント:

v 共通ブロックおよび INCLUDE ディレクティブを除去します。

v モジュールを使用してグローバル・データおよびプロシージャーを保持し、定義の整合性を確保します。

FORTRAN 77 ソース:

COMMON /BLOCK/A, B, C, NAME, NUMBERREAL A, B, CA = 3CALL CALLUP(D)PRINT *, NAME, NUMBERENDSUBROUTINE CALLUP (PARM)

COMMON /BLOCK/A, B, C, NAME, NUMBERREAL A, B, C...NAME = 3NUMBER = 4

END

Fortran 90/95/2003 ソース:

MODULE FUNCSREAL A, B, C ! Common block no longer neededINTEGER NAME, NUMBER ! Global dataCONTAINS

SUBROUTINE CALLUP (PARM)...NAME = 3NUMBER = 4

END SUBROUTINEEND MODULE FUNCSPROGRAM MAINUSE FUNCSA = 3CALL CALLUP(D)PRINT *, NAME, NUMBEREND

202 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 229: IBM XL Fortran for Linux, V15.1

例 1MODULE m

INTEGER some_data

CONTAINSSUBROUTINE sub() ! Module subprogram

INTEGER stmtfncstmtfnc(i) = i + 1some_data = stmtfnc(5) + inner(3)CONTAINS

INTEGER FUNCTION inner(iarg) ! Internal subprograminner = iarg * 2

END FUNCTIONEND SUBROUTINE sub

END MODULE

PROGRAM mainUSE m ! Main program accesses module mCALL sub()

END PROGRAM

例 2 (Fortran 2008)MODULE m

INTERFACE! A module procedure interface body that specifies the! interface of a separate module subroutineMODULE SUBROUTINE sub(arg)

INTEGER :: argEND SUBROUTINE

! A module procedure interface body that specifies the! interface of a separate module functionINTEGER MODULE FUNCTION func(a, b)

INTEGER :: a, bEND FUNCTION

END INTERFACEEND MODULE

関連情報v 『サブモジュール (Fortran 2008)』

サブモジュール (Fortran 2008)サブモジュールは、モジュールまたは別のサブモジュールを拡張するプログラム単位です。これはインターフェースが上位モジュールまたは上位サブモジュールで宣言されているプロシージャーに定義を提供する場合があります。これには、他のエンティティーの宣言および定義が含まれる場合もあります。これらの定義には、データ・オブジェクト定義、名前リスト・グループ、派生型定義、プロシージャーのインターフェース・ブロック、およびプロシージャー定義があります。

サブモジュールには、プログラム単位、共通ブロック、外部プロシージャー、クリティカル・セクション、またはグローバル・エンティティーのバインディング・ラベルなど、その他のグローバル・エンティティーと同じ名前を指定することはできません。サブモジュールの名前は、同じ上位モジュールを持っていない場合、別のサブモジュールと同じ名前にすることができます。

第 8 章 プログラム単位およびプロシージャー 203

Page 230: IBM XL Fortran for Linux, V15.1

構文

SUBMODULE_statement

構文の詳細については、SUBMODULE を参照してください。

specification_part

これは 17ページの『ステートメントの順序および実行シーケンス』で�2�、�4�、および �5� の番号が付されているステートメント・グループの一連のステートメントです。ただし ENTRY および FORMAT ステートメントを除きます。

CONTAINS_statement

構文について詳しくは、 358ページの『CONTAINS』 を参照してください。

END_SUBMODULE_statement

構文について詳しくは、 387ページの『END』 を参照してください。

規則

サブモジュールは、1 つのみの上位モジュールを持ちます。さらに 1 つ以上の上位サブモジュールを持つこともできます。

SUBMODULE

�� SUBMODULE_statement ��

��specification_part

��

��module_subprogram_part

��

�� END_SUBMODULE_statement ��

module_subprogram_part

�� CONTAINS_statement ��

�� � module_subprogram ��

204 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 231: IBM XL Fortran for Linux, V15.1

サブモジュールは、モジュール・サブプログラムが含まれる場合があり、モジュール・サブプログラムのホスト有効範囲単位となります。モジュール・サブプログラムは、CONTAINS ステートメントの後に続ける必要があり、内部プロシージャーを含むことができます。モジュール・プロシージャーは、モジュール・サブプログラムまたはモジュール・サブプログラム内の入り口によって定義されます。

サブモジュール内で、上位モジュールまたは上位サブモジュール内の対応するモジュール・プロシージャー・インターフェース本体によって宣言された、分離モジュール・プロシージャーを定義できます。

サブモジュールは、親子結合によってその上位モジュールまたはサブモジュール内で宣言および定義されたエンティティーにアクセスします。サブモジュールは、それに含まれるすべてのモジュール・プロシージャー、インターフェース・ブロック、派生型定義に対するホストとなります。親子結合を介して、サブモジュールに含まれるモジュール・プロシージャー、インターフェース・ブロック、および派生型定義は、サブモジュールの有効範囲内のエンティティーにアクセスできます。サブモジュール内のエンティティーの宣言と定義は、その下位サブモジュール内の親子結合からもアクセス可能です。

サブモジュールは参照結合からアクセスすることはできません。

サブモジュールのローカル変数は、そのサブモジュール有効範囲単位内、含まれるすべての有効範囲単位内、またはその下位サブモジュール内でのみアクセス可能です。

サブモジュールの有効範囲単位内で暗黙に宣言される変数、共通ブロック、またはプロシージャー・ポインターには、SAVE 属性があります。これは明示的な宣言によって確認できます。

以下の規則は、サブモジュールの specification_part に適用されます。

v これには、ステートメント関数ステートメント、ENTRY ステートメント、または FORMAT ステートメントを入れることはできませんが、これらのステートメントをモジュール・サブプログラムの宣言部分に指定することは可能です。

v 宣言式または定数式には汎用エンティティーへの参照が含まれますが、その汎用エンティティーは、宣言式または定数式に続くサブモジュール内で定義されている特定のプロシージャーを持つことはできません。

この例では、サブモジュール n 内で 2 つの分離モジュール・プロシージャーが定義されています。1 つは、MODULE プレフィックス指定子を使用してサブルーチン・サブプログラムによって定義されており、もう 1 つは分離モジュール・サブプログラムによって定義されています。これらの分離モジュール・プロシージャーの対応するモジュール・プロシージャー・インターフェース本体は、上位モジュールm 内で宣言されています。

MODULE m ! The ancestor module mINTEGER :: i

INTERFACEMODULE SUBROUTINE sub1(arg1) ! Module procedure interface body for sub1

INTEGER :: arg1

第 8 章 プログラム単位およびプロシージャー 205

Page 232: IBM XL Fortran for Linux, V15.1

END SUBROUTINE

MODULE SUBROUTINE sub2(arg2) ! Module procedure interface body for sub2INTEGER :: arg2

END SUBROUTINEEND INTERFACE

END MODULE

SUBMODULE (m) n ! The descendant submodule nINTEGER :: j ! Specification part

CONTAINS ! Module subprogram partMODULE SUBROUTINE sub1(arg1) ! Definition of sub1 by subroutine subprogram

INTEGER :: arg 1arg1 = 1i = 2 ! Host associationj = 3 ! Host association

END SUBROUTINE

MODULE PROCEDURE sub2 ! Definition of sub2 by separate module subprogramarg2 = 1

END PROCEDUREEND SUBMODULE

関連情報v 199ページの『モジュール』

v 515ページの『SUBMODULE (Fortran 2008)』

v 212ページの『分離モジュール・サブプログラム (Fortran 2008)』

v 211ページの『分離モジュール・プロシージャー (Fortran 2008)』

モジュール・サブプログラムモジュール・サブプログラムは、モジュールまたは F2008 サブモジュール

F2008 に含まれるサブプログラムですが、内部サブプログラムではありません。モジュール・サブプログラムの形式は、次のいずれかです。

v 関数サブプログラム

v サブルーチン・サブプログラム

v F2008 分離モジュール・サブプログラム F2008

関数サブプログラムとサブルーチン・サブプログラム関数またはサブルーチン・サブプログラムは、FUNCTION または SUBROUTINEステートメントをその最初のステートメントとして持つサブプログラムです。また、ステートメント関数のステートメントに関数を指定することもできます。外部関数またはサブルーチン・サブプログラムは、1 つのプログラム単位です。

206 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 233: IBM XL Fortran for Linux, V15.1

構文

subprogram_statement

構文の詳細については、 419ページの『FUNCTION』または 517ページの『SUBROUTINE』を参照してください。

specification_part

17ページの『ステートメントの順序および実行シーケンス』で �2�、�4�、�5� の番号が付されているステートメント・グループの一連のステートメントです。

execution_part

17ページの『ステートメントの順序および実行シーケンス』で、�4� および �6� の番号が付されているステートメント・グループの一連のステートメントで、ステートメント・グループ �6� のステートメントから先に指定します。

internal_subprogram_part

詳しくは、 182ページの『内部プロシージャー』を参照してください。

end_subprogram_statement

関数およびサブルーチンの END ステートメントの構文に関する詳細については、 387ページの『END』を参照してください。

規則

内部サブプログラムは、メインプログラム、モジュール・サブプログラム、または外部サブプログラム内の CONTAINS ステートメントの後 で、かつ、ホスト・プログラムの END ステートメントの前 で宣言します。内部サブプログラムの名前は、ホスト有効範囲単位内の仕様セクションには定義しないでください。

�� subprogram_statement ��

��specification_part

��

��execution_part

��

��internal_subprogram_part

��

�� end_subprogram_statement ��

第 8 章 プログラム単位およびプロシージャー 207

Page 234: IBM XL Fortran for Linux, V15.1

外部プロシージャーは、実行可能プログラムに関してグローバルな有効範囲を持っています。呼び出し側プログラム単位では、インターフェース・ブロック内の外部プロシージャーにインターフェースを指定したり、EXTERNAL 属性で外部プロシージャー名を定義することができます。

サブプログラムには、PROGRAM、BLOCK DATA、MODULE、および F2008

SUBMODULE F2008 以外のステートメントであれば、任意のステートメントを指定できます。ただし、内部サブプログラムには、 ENTRY ステートメントまたは内部サブプログラムを指定することはできません。

プロシージャーの宣言プロシージャーの宣言には、EXTERNAL ステートメント、PROCEDURE 宣言ステートメント、または、プロシージャー・コンポーネント定義ステートメントを使用することができます。

EXTERNAL ステートメントでは、外部プロシージャーおよびダミー・プロシージャーを宣言します。 407ページの『EXTERNAL』を参照してください。

PROCEDURE 宣言ステートメントでは、プロシージャー・ポインター、ダミー・プロシージャー、および外部プロシージャーを宣言します。PROCEDURE 宣言ステートメントの詳細については、 481ページの『PROCEDURE 宣言 (Fortran 2003)』を参照してください。

プロシージャー・コンポーネント定義ステートメントでは、派生型定義のプロシージャー・ポインター・コンポーネントを宣言します。 60ページの『プロシージャー・ポインター・コンポーネント』を参照してください。

プロシージャー・ポインター (Fortran 2003): プロシージャー・ポインターは、EXTERNAL 属性、および POINTER 属性が設定されたプロシージャーです。PROCEDURE ステートメントで宣言された派生型コンポーネントは、プロシージャー・ポインターにすることができます。

プロシージャー・ポインターは、データ・オブジェクトではなく、プロシージャーを指し示します。プロシージャー・ポインターは、ダミー・プロシージャーと同様に、プロシージャー・ポインターではない外部プロシージャー、モジュール・プロシージャー、組み込みプロシージャー、またはダミー・プロシージャーに関連付けることができます。 F2008 プロシージャー・ポインターは、内部プロシージャーとも関連付けることができます。ただし、内部プロシージャーのホスト・インスタンスが実行を完了した後は、プロシージャー・ポインターを使用して内部プロシージャーを呼び出すことができなくなります。 F2008 プロシージャー・ポインターは、明示的、暗黙的いずれのインターフェースも持つことができ、構造体コンポーネントにすることもでき、プロシージャー・ポインターの代入を使用して関連付けすることができます。

ポインター属性のあるダミー・プロシージャーは、ダミー・プロシージャー・ポインターで、その関連実引数は、プロシージャー・ポインターです。

プロシージャー・ポインターには、別のプロシージャー・ポインターとのみストレージが関連付けられます。どちらのインターフェースも明示的 (特性が同じ) か、ど

208 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 235: IBM XL Fortran for Linux, V15.1

ちらのインターフェースも暗黙的 (どちらのインターフェースも、同じ型および型パラメーターの関数またはサブルーチン) のいずれかです。

型制約プロシージャー、プロシージャー・ポインター・コンポーネントのいずれもオブジェクトによって呼び出されますが、実行される型制約プロシージャーは呼び出し側オブジェクトの型に依存するのに対し、プロシージャー・ポインター・コンポーネントは値に依存します。PASS 属性は、プロシージャー・ポインター・コンポーネントのオブジェクト受け渡し仮引数を定義します。

PROCEDURE(PROC), POINTER :: PTR

プロシージャー参照プロシージャー参照には、次の 2 つのタイプがあります。

v サブルーチンは、次のいずれかの理由によって呼び出されます。

– CALL ステートメントの実行

– 定義済み代入ステートメントの実行

– ユーザー定義の派生型入出力

– 最終化の実行

v 関数は、関数参照または定義済み演算の評価時に呼び出されます。

関数参照: 関数参照は、式の中で 1 次子として使用されます。

関数参照が実行されると、次のことが順に行われます。

1. 式である実引数が評価されます。

2. 実引数が対応する仮引数に関連付けられます。

3. 制御が指定された関数に移ります。

4. 関数が実行されます。

5. 関数の結果変数の値 (ポインター関数の場合は、状況またはターゲット) が、参照している式で使用可能になります。

��(1)

data_ref separator binding_name(2)

procedure_component_reffunction_name

� ( )actual_argument_spec_list

��

注:

1 Fortran 2003

2 Fortran 2003

第 8 章 プログラム単位およびプロシージャー 209

Page 236: IBM XL Fortran for Linux, V15.1

Fortran 2003

関数参照内の binding_name が、特定関数のバインディングである場合、参照される関数は、その名前で型が data-ref の動的型のバインディングによって識別される関数になります。

関数参照内の binding_name が、総称プロシージャーのバインディングである場合、data-ref の宣言型で、その名前の総称バインディングが、特定のバインディングの選択に使用されます。

1. 参照がその総称バインディングの特定バインディングのいずれか 1 つと一致する場合、その特定バインディングが選択されます。

2. そうではなく、参照がその総称バインディングの特定バインディングのいずれか1 つのエレメント型参照と一致する場合、その特定バインディングが選択されます。

参照は、選択された特定バインディングと同名のバインディングによって識別されるプロシージャーで、 data-ref の動的型によるものとなります。

Fortran 2003 の終り

関数参照の実行によって、その関数参照が入っているステートメント内部の他のデータ項目値を変更するようであってはなりません。論理 IF ステートメント またはWHERE ステートメントの論理式の中で関数参照を呼び出した場合に、その式の値が真の場合に実行されるステートメント内のエンティティーに影響を与えることはかまいません。

IBM 拡張

引数リスト組み込み関数 %VAL および %REF は、引数が値または参照によってそれぞれ渡されるようにすることで、言語間呼び出しを補助するのに提供されます。これらの組み込み関数は、Fortran 以外のプロシージャー参照およびインターフェース本体のサブプログラム・ステートメントで指定できます。( 221ページの『%VAL および %REF (IBM 拡張)』を参照してください。) 関数参照の例については、『ステートメント関数』および『再帰』を参照してください。

IBM 拡張 の終り

割り振り可能な関数の開始時、結果変数の割り振り状況は、割り振られていないという状態になります。

関数の結果変数は、関数の実行中に何度でも割り振りまたは割り振り解除を行うことができます。ただし、関数を終了するときには、割り振り済みになり、定義済みの値を持ちます。結果変数の自動割り振り解除は、関数を終了するときに即時には行われず、関数参照が発生するステートメントの実行後に行われます。

サブプログラムおよびプロシージャー参照の例:

MODULE QUAD_MODTYPE QUAD_TYPE

REAL:: a, b, cCONTAINSPROCEDURE Q2

END TYPE

210 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 237: IBM XL Fortran for Linux, V15.1

INTERFACESUBROUTINE Q2(T,QUAD) ! External subroutine

IMPORT QUAD_TYPECLASS(QUAD_TYPE) TREAL QUAD

END SUBROUTINEEND INTERFACE

END MODULEPROGRAM MAIN

USE QUAD_MODREAL QUAD,X2,X1,X0,A,C3TYPE(QUAD_TYPE) QTQUAD=0; A=X1*X2X2 = 2.0X1 = SIN(4.5) ! Reference to intrinsic functionX0 = 1.0QT = QUAD_TYPE(X2, X1, X0)CALL Q(X2,X1,X0,QUAD) ! Reference to external subroutineCALL QT%Q2(QUAD) ! Reference to a subroutineC3 = CUBE() ! Reference to internal functionCONTAINSREAL FUNCTION CUBE() ! Internal function

CUBE = A**3END FUNCTION CUBE

ENDSUBROUTINE Q(A,B,C,QUAD) ! External subroutine

REAL A,B,C,QUADQUAD = (-B + SQRT(B**2-4*A*C)) / (2*A)

END SUBROUTINE QSUBROUTINE Q2(T,QUAD) ! External subroutine

USE QUAD_MODTYPE(QUAD_TYPE) TREAL QUADQUAD = (-T%B + SQRT(T%B**2-4*T%A*T%C)) / (2*T%A)

END SUBROUTINE Q2

割り振り可能な関数結果の例:

FUNCTION INQUIRE_FILES_OPEN() RESULT(OPENED_STATUS)LOGICAL,ALLOCATABLE :: OPENED_STATUS(:)INTEGER I,JLOGICAL TESTDO I=1000,0,-1

INQUIRE(UNIT=I,OPENED=TEST,ERR=100)IF (TEST) EXIT

100 CONTINUEEND DOALLOCATE(OPENED_STATUS(0:I))DO J=0,I

INQUIRE(UNIT=J,OPENED=OPENED_STATUS(J))END DO

END FUNCTION INQUIRE_FILES_OPEN

分離モジュール・プロシージャー (Fortran 2008)分離モジュール・プロシージャーは、分離モジュール・サブプログラムによって定義されるか、初期ステートメントに MODULE プレフィックス指定子が含まれた関数サブプログラムまたはサブルーチン・サブプログラムによって定義される、モジュール・プロシージャーです。分離モジュール・プロシージャーは、モジュール・プロシージャー・インターフェース本体を定義します。

v 分離モジュール・プロシージャーは、それを含むプログラム単位、上位モジュール、または上位サブモジュールのいずれかの中にある、モジュール・プロシージャー・インターフェース本体によって事前に宣言されている必要があります。

第 8 章 プログラム単位およびプロシージャー 211

Page 238: IBM XL Fortran for Linux, V15.1

v 同じ分離モジュール・プロシージャーを複数回定義することはできません。

v 分離モジュール・プロシージャーは、その対応するモジュール・プロシージャー・インターフェース本体と同じ特性名と仮引数名を持っている必要があります。

v 分離モジュール・プロシージャーのバインディング・ラベルを指定する場合、バインディング・ラベルは、対応するモジュール・プロシージャー・インターフェース本体で指定されたものと同じである必要があります。

v 分離モジュール・プロシージャーに対する RECURSIVE プレフィックス指定子の指定は、それが対応するモジュール・プロシージャー・インターフェース本体に対しても指定される場合にのみ実行する必要があります。

v 分離モジュール・プロシージャーが関数である場合は、結果変数に次の規則が適用されます。

– 分離モジュール・プロシージャーが分離モジュール・サブプログラムによって定義されている場合、結果変数名は、対応するモジュール・プロシージャー・インターフェース本体内の FUNCTION ステートメントによって決定されます。

– 分離モジュール・プロシージャーが MODULE プレフィックス指定子を使用して関数サブプログラムによって定義されている場合、結果変数名は、そのサブプログラムの FUNCTION ステートメントによって決定されます。

MODULE プレフィックス指定子が関数サブプログラムまたはサブルーチン・サブプログラムでどのように使用されるかについては、 419ページの『FUNCTION』または 517ページの『SUBROUTINE』を参照してください。

関連情報v 199ページの『モジュール』

v 203ページの『サブモジュール (Fortran 2008)』

v 『分離モジュール・サブプログラム (Fortran 2008)』

分離モジュール・サブプログラム (Fortran 2008)分離モジュール・サブプログラムは、対応するモジュール・プロシージャー・インターフェース本体によって宣言された分離モジュール・プロシージャーを定義します。

212 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 239: IBM XL Fortran for Linux, V15.1

構文

separate_module_subprogram_statement構文の詳細については、MODULE PROCEDURE を参照してください。

specification_part17ページの『ステートメントの順序および実行シーケンス』で�2�、�4�、�5� の番号が付されているステートメント・グループの一連のステートメントです。

execution_partこれは、 17ページの『ステートメントの順序および実行シーケンス』で、�4� および �6� の番号が付いたステートメント・グループの一連のステートメントであり、先頭のステートメントは �6� のステートメント・グループのものである必要があります。

internal_subprogram_part詳しくは、 182ページの『内部プロシージャー』 を参照してください。

end_separate_module_subprogram_statement構文について詳しくは、 387ページの『END』 を参照してください。

規則

分離モジュール・サブプログラムのインターフェースは、次のいずれかの場所でモジュール・プロシージャー・インターフェース本体によって宣言される必要があります。

v 分離モジュール・プロシージャーが定義されているプログラム単位のspecification_part

v 上位モジュール

v 上位サブモジュール

Separate module subprogram

�� separate_module_subprogram_statement ��

��specification_part

��

��execution_part

��

��internal_subprogram_part

��

�� end_separate_module_subprogram_statement ��

第 8 章 プログラム単位およびプロシージャー 213

Page 240: IBM XL Fortran for Linux, V15.1

分離モジュール・サブプログラムによって定義されている分離モジュール・プロシージャーが関数である場合、その関数結果の変数名は、対応するモジュール・プロシージャー・インターフェース本体内の FUNCTION ステートメントによって決定されます。

この例では、サブモジュール内の分離モジュール・サブプログラムによって分離モジュール・プロシージャーがどのように定義されるのかを示しています。

MODULE mINTEGER :: i

INTERFACEMODULE SUBROUTINE sub(arg)

INTEGER :: argEND SUBROUTINE

END INTERFACEEND MODULE

SUBMODULE (m) nINTEGER :: j

CONTAINSMODULE PROCEDURE sub ! Separate module subprogram

arg = 1i = 2j = 3

END PROCEDUREEND SUBMODULE

関連情報v 199ページの『モジュール』

v 203ページの『サブモジュール (Fortran 2008)』

v 211ページの『分離モジュール・プロシージャー (Fortran 2008)』

ブロック・データ・プログラム単位ブロック・データ・プログラム単位は、名前付き共通ブロック内のオブジェクトに初期値を設定します。

BLOCK_DATA_statement

構文の詳細については、 333ページの『BLOCK DATA』を参照してください。

�� BLOCK_DATA_statement ��

��specification_part

��

�� END_BLOCK_DATA_statement ��

214 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 241: IBM XL Fortran for Linux, V15.1

specification_part

17ページの『ステートメントの順序および実行シーケンス』で �2�、�4�、�5� の番号が付されているステートメント・グループの一連のステートメントです。

END_BLOCK_DATA_statement

構文の詳細については、 387ページの『END』を参照してください。

specification_part には、型宣言、USE、IMPLICIT、COMMON、 DATA、EQUIVALENCE、および整数ポインター・ステートメント、派生型定義、使用可能な属性仕様ステートメントを指定できます。指定可能な属性は、 BIND

、 DIMENSION、INTRINSIC、PARAMETER、POINTER、SAVE、TARGET、および ASYNCHRONOUS だけです。

ブロック・データの specification_part 内の型宣言ステートメントには、ALLOCATABLE および EXTERNAL 属性指定子を入れることはできません。

1 つの実行可能プログラム内には、複数のブロック・データ・プログラム単位を入れることができますが、名前を指定しなくてよいのはその中の 1 つだけです。また、1 つのブロック・データ・プログラム単位内で複数の名前付き共通ブロックを初期化することができます。

ブロック・データ・プログラム単位内の共通ブロックに関する制約事項は、以下のとおりです。

v 名前付き共通ブロック内のすべての項目は、それらがすべて初期化されない場合でも、 COMMON ステートメント内に入れる必要があります。

v 同一の名前付き共通ブロックを、2 つの異なるブロック・データ・プログラム単位内で参照してはなりません。

v 名前付き共通ブロック内のポインター以外のオブジェクトだけが、ブロック・データ・プログラム単位内で初期化できます。

v 無名共通ブロック内のオブジェクトは、初期化できません。

例PROGRAM MAIN

COMMON /L3/ C, X(10)COMMON /L4/ Y(5)

END PROGRAMBLOCK DATA BDATA

COMMON /L3/ C, X(10)DATA C, X /1.0, 10*2.0/ ! Initializing common block L3

END BLOCK DATA

BLOCK DATA ! An unnamed block data program unitPARAMETER (Z=10)DIMENSION Y(5)COMMON /L4/ YDATA Y /5*Z/

END BLOCK DATA

第 8 章 プログラム単位およびプロシージャー 215

Page 242: IBM XL Fortran for Linux, V15.1

組み込みプロシージャー組み込みプロシージャーは、XL Fortran によって、あらかじめ定義されているプロシージャーです。詳しくは、 623ページの『第 14 章 組み込みプロシージャー』を参照してください。

組み込みプロシージャーには、総称名で参照できるもの、特定名で参照できるもの、および両方で参照できるものがあります。

総称組み込み関数例外はありますが、一般的に引数が特定の型である必要はなく、結果は引数の型と同じになります。同じプロシージャー名を複数の型の引数に使用できるため、総称名を利用すれば組み込みプロシージャーの参照を簡略化することができます。この場合、引数の型および kind 型パラメーターによって、使用される特定の関数が決まります。

特定組み込み関数特定の型の引数を必要とし、結果も固有の型となります。

特定組み込み関数名は、実引数として渡すことができます。特定組み込み関数の名前が総称組み込み関数と同じ場合、特定名が参照されます。特定組み込みプロシージャーに関連しているダミー・プロシージャーに対する参照は、すべてその組み込みプロシージャーのインターフェースと整合性のある引数を使用する必要があります。特定組み込み関数は、プロシージャー・ポインターのターゲットにすることができます。

組み込みプロシージャーの名前を引数として渡せるか否かについては、プロシージャーによって異なります。 INTRINSIC 属性で指定されている組み込みプロシージャーの特定名は、プロシージャー参照の実引数として使用することができます。

v IMPLICIT ステートメントでは、組み込み関数のタイプは変更されません。

v 組み込み名が INTRINSIC 属性で指定される場合、その名前は常に組み込みプロシージャーとして認識されます。

組み込みプロシージャー名と他の名前の競合データ・オブジェクトを組み込みプロシージャーと同じ名前で宣言すると、その組み込みプロシージャーにはアクセスできなくなります。

総称インターフェース・ブロックは、 185ページの『インターフェース・ブロック』に説明されているように、総称組み込み関数の拡張または再定義を行うことができます。その関数に既に INTRINSIC 属性がある場合は拡張され、この属性がない場合は再定義されます。

216 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 243: IBM XL Fortran for Linux, V15.1

引数

実引数の指定

arg_keyword

呼び出し中のプロシージャーの明示的インターフェース内に指定される仮引数名です。

argument

実引数です。

%VAL、%REF引き渡し方法を指定します。詳しくは、 221ページの『%VAL および%REF (IBM 拡張)』を参照してください。

実引数は、プロシージャー参照の引数リストに入れます。プロシージャー参照で有効な実引数は以下のとおりです。

v 式

v 変数

v プロシージャー名

v 代替戻り指定子 (実引数が CALL ステートメント内にある場合)。形式は、「*stmt_label」となります。stmt_label は、CALL ステートメントと同じ有効範囲単位にある分岐ターゲット・ステートメントのステートメント・ラベルを表しています。

ステートメント関数参照内で指定される実引数は、スカラー・オブジェクトでなければなりません。

Fortran 2003 では、プロシージャー名は、特定名でない場合、内部プロシージャーの名前、ステートメント関数、およびプロシージャーの総称名にすることはできません。 F2008 ただし、Fortran 2008 では、内部プロシージャーの名前を使用できます。 F2008

プロシージャーの参照の規則および制約事項は、 209ページの『プロシージャー参照』に記載されています。Fortran 95 では、非組み込みエレメント型プロシージャーを実引数として使用することはできません。

��arg_keyword =

argument(1)

%VAL ( argument )(2)

%REF ( argument )

��

注:

1 IBM 拡張

2 IBM 拡張

第 8 章 プログラム単位およびプロシージャー 217

Page 244: IBM XL Fortran for Linux, V15.1

引数キーワード引数キーワードを利用すれば、実引数を仮引数とは異なる順序で指定することができます。引数キーワードを使用すると、オプションの仮引数に対応する実引数を省略することができます。つまり、単にプレースホルダーとして機能するだけの仮引数を必要としません。

各引数キーワードは、参照されるプロシージャーの明示的インターフェースにある仮引数の名前でなければなりません。暗黙のインターフェースが設定されたプロシージャーの引数リスト内に、引数キーワードを入れることは、しないでください。

引数リスト内で、実引数を引数キーワードを使用して指定される場合、リスト内のその後の実引数もすべて引数キーワードによって指定しなければなりません。

引数キーワードは、ラベル・パラメーターに対して指定することはできません。ラベル・パラメーターは、そのプロシージャー参照内で引数キーワードを参照する前に指定しなければなりません。

例INTEGER MYARRAY(1:10)INTERFACE

SUBROUTINE SORT(ARRAY, DESCENDING, ARRAY_SIZE)INTEGER ARRAY_SIZE, ARRAY(ARRAY_SIZE)LOGICAL, OPTIONAL :: DESCENDING

END SUBROUTINEEND INTERFACECALL SORT(MYARRAY, ARRAY_SIZE=10) ! No actual argument corresponds to the

! optional dummy argument DESCENDINGENDSUBROUTINE SORT(ARRAY, DESCENDING, ARRAY_SIZE)

INTEGER ARRAY_SIZE, ARRAY(ARRAY_SIZE)LOGICAL, OPTIONAL :: DESCENDINGIF (PRESENT(DESCENDING)) THEN

.

.

.END SUBROUTINE

仮引数

仮引数は、ステートメント関数ステートメント、 FUNCTION ステートメント、SUBROUTINE ステートメント、または、ENTRY ステートメントで指定します。

�� dummy_arg_name(1)

%VAL ( dummy_arg_name )*

(2)%REF ( dummy_arg_name )

*

��

注:

1 IBM 拡張

2 IBM 拡張

218 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 245: IBM XL Fortran for Linux, V15.1

ステートメント関数、関数サブプログラム、インターフェース本体、およびサブルーチン・サブプログラムの仮引数は、実引数の型を示し、さらに、各引数がスカラー値、配列、プロシージャー、またはステートメント・ラベルのいずれであるかを示します。外部サブプログラム、モジュール・サブプログラム、内部サブプログラムの定義内、またはインターフェース本体内の仮引数は、次のいずれかに分類されます。

v 変数名

v プロシージャー名

v アスタリスク (サブルーチン内に限られ、選択戻り点を示す)

IBM 拡張

%VAL および %REF は、インターフェース・ブロックにある FUNCTION または SUBROUTINE ステートメントの仮引数に対してのみ指定することができます。インターフェースは、Fortran 以外のプロシージャー・インターフェースに合ったものにしてください。 %VAL または %REF が、外部プロシージャーのインターフェース・ブロックにある場合、この引き渡し方法がそのプロシージャーに対する参照ごとに暗黙指定されます。外部プロシージャーの参照で実引数が %VAL または%REF を指定する場合、対応する仮引数用のインターフェース・ブロックで同じ引き渡し方法を指定する必要があります。詳しくは、 221ページの『%VAL および%REF (IBM 拡張)』を参照してください。

IBM 拡張 の終り

ステートメント関数定義の仮引数は、変数名として分類されます。

指定名は、仮引数リスト内に一度だけ入れることができます。

ステートメント関数のステートメントに仮引数として指定される変数名の有効範囲は、指定されているステートメントの有効範囲と同じです。この変数名の型は、ステートメント関数を含む有効範囲単位内の変数名である場合に持つ型になります。変数名は、アクセス可能な配列と同じ名前にはできません。

引数関連付け実引数は、関数またはサブルーチンが参照されると、仮引数に関連付けられます。プロシージャー参照では、実引数リストによって、そのリストにある実引数とサブプログラムの仮引数との間の対応が識別されます。

Fortran 2003

短縮された仮引数リストは、完全な仮引数リストとなるか、オブジェクト受け渡し仮引数がある場合、そのオブジェクト受け渡し仮引数のある仮引数リストは省略されます。引数キーワードがない場合、実引数は、短縮された仮引数リスト内で対応する位置にある仮引数に関連付けられます。最初の実引数が、短縮リストの最初の仮引数に関連付けられ、2 番目の実引数が 2 番目の仮引数に、という要領で、以下同様にリストの最後に至るまで関連付けが行われます。すべての実引数が、仮引数

第 8 章 プログラム単位およびプロシージャー 219

Page 246: IBM XL Fortran for Linux, V15.1

と関連付けられる必要があります。

Fortran 2003 の終り

キーワードがある場合、実引数は引数キーワードと同じ名前の仮引数に関連付けられます。プロシージャー参照のある有効範囲単位では、仮引数の名前はアクセス可能な明示的インターフェース内になければなりません。

サブプログラム内の引数関連付けは、そのプログラム内で RETURN または ENDステートメントの実行時に終了します。サブプログラムが参照されたときの引数関連付けが、次のサブプログラムの参照時まで保管されることはありません。ただし、-qxlf77=persistent が指定され、サブプログラムに 1 つ以上の入り口プロシージャーが指定されている場合には、引数関連付けは次の参照時まで持ち越されます。

プロシージャー参照のヌル引数と関連付けられた場合、対応する仮引数は未定義または定義解除可能となります。

IBM 拡張

%VAL または VALUE 属性が使用される場合を除いて、サブプログラムでは仮引数のためにストレージが予約されることはありません。計算用には、対応する実引数が使用されます。したがって、仮引数が変わると、実引数の値も変わります。対応する実引数が、式またはベクトル添え字付きの配列セクションである場合、呼び出し側のプロシージャーが実引数のストレージを予約するため、サブプログラムでは仮引数を定義、再定義、または定義解除することはできません。

実引数が、%VAL で指定されるか、または対応する仮引数に VALUE 属性がある場合、サブプログラムには、実引数のストレージ域へのアクセス権がなくなります。

IBM 拡張 の終り

実引数は、その型および型パラメーター (仮引数がポインターまたは想定形状のいずれかの場合は、形状) が対応する仮引数と一致する必要があります。ただし、サブルーチン名に型がなく、サブルーチンであるダミー・プロシージャー名と関連付ける必要がある場合、および代替戻り指定子に型がなく、アスタリスクと関連付ける必要がある場合を除きます。

引数関連付けは、複数レベルにわたるプロシージャー参照まで、持ち越される場合があります。

サブプログラムの参照によって、参照されたサブプログラム内の仮引数が、その参照されたサブプログラム内の別の仮引数に関連付けられる場合、そのサブプログラムの実行時にどちらの仮引数も定義、再定義、または定義解除することはできません。例えば、次のようなサブルーチンの定義があるとします。

SUBROUTINE XYZ (A,B)

このサブルーチンを、次の方法で参照します。

CALL XYZ (C,C)

220 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 247: IBM XL Fortran for Linux, V15.1

この場合、仮引数 A と B が、それぞれ同じ実引数 C に関連付けられます。その結果、A と B が互いに関連することになります。この場合、A も B も、サブルーチン XYZ の実行時、または XYZ によって参照されるいずれのプロシージャーによっても定義、再定義、または定義解除することはできません。

仮引数が、共通ブロック内のエンティティー、または、使用関連付けやホスト関連付けによってアクセス可能なエンティティーに関連付けられる場合、エンティティーが仮引数に関連付けられている間は、エンティティーの値は、その仮引数名の使用によってのみ変更することができます。データ・オブジェクトのいずれかの部分が仮引数によって定義される場合、そのデータ・オブジェクトは、定義が発生する前か後かにかかわらず、その仮引数によってのみ参照することができます。この制限は、ポインター・ターゲットについても適用されます。

この制限に従わないプログラムがある場合、コンパイラー・オプション、-qalias=nostd を使用するようにしてください。詳しくは、「XL Fortran コンパイラー・リファレンス」の『-qalias オプション』を参照してください。

実引数の割り振り済み割り振り可能コンポーネントで、その実引数がINTENT(OUT) 仮引数に関連付けられている場合、そのコンポーネントはプロシージャーに入るときに割り振り解除されるので、仮引数の対応するコンポーネントには、割り振られていないという割り振り状況が設定されます。これにより、変数の割り振り可能コンポーネントの前の内容を指し示すポインターが、確実に未定義になります。

%VAL および %REF (IBM 拡張)Fortran 以外の言語で書かれたサブプログラム (例えば、ユーザー作成の C プログラム、または Linux オペレーティング・システム・ルーチンなど) を呼び出すには、XL Fortran で使用されているデフォルトの方法とは異なる方法で実引数を渡さなければならない場合があります。デフォルトの方法では、実引数のアドレスを渡し、実引数が文字型の場合は長さを渡します。 (-qnullterm コンパイラー・オプションを使用して、スカラー文字定数式が確実に終端ヌル・ストリングと共に渡されるようにします。詳しい説明については、「XL Fortran コンパイラー・リファレンス」の『-qnullterm オプション』を参照してください)

デフォルトの受け渡し方法は、CALL ステートメントまたは 関数参照の引数リスト内で %VAL および %REF 組み込み関数使用することによって、あるいはインターフェース本体内で仮引数を使うことによって、変更することができます。これらの組み込み関数は、外部サブプログラムに実引数を渡す方法を指定します。

%VAL および %REF 組み込み関数は、Fortran プロシージャー参照の引数リスト内で使用することはできません。また、代替戻り指定子と共に使用することもできません。

これらの引数リストの組み込み関数は、次のとおりです。

%VALこの組み込み関数は、実引数が CHARACTER(1)、論理、整数、実数、複素数の式、または順序派生型である場合にその実引数について使用することができます。派生型のオブジェクトには、長さが 1 バイトより長い文字構造体コンポーネント、および配列を入れることはできません。

第 8 章 プログラム単位およびプロシージャー 221

Page 248: IBM XL Fortran for Linux, V15.1

%VAL は、配列、割り振り可能コンポーネントのある派生型、プロシージャー名、または 1 バイトより長い文字式である実引数については、使用することはできません。

%REF この組み込み関数を実行すると、実引数が参照によって渡されるようになります。すなわち、実引数のアドレスだけが渡されます。デフォルトの引き渡し方法とは異なり、%REF では、文字引数の長さは渡されません。そのような文字引数を C ルーチンに渡す場合は、C ルーチンがストリングの長さを判別できるように (-qnullterm オプションを使うなど)、ストリングをヌル文字で終了させる必要があります。

例EXTERNAL FUNCCALL RIGHT2(%REF(FUNC)) ! procedure name passed by referenceREAL XVARCALL RIGHT3(%VAL(XVAR)) ! real argument passed by value

IVARB=6CALL TPROG(%VAL(IVARB)) ! integer argument passed by value

%VAL の標準適応の代替方法については、 538ページの『VALUE (Fortran 2003)』を参照してください。

詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」の『言語間呼び出し』を参照してください。

仮引数の意図INTENT 属性を使用すると、仮引数の使用意図を明示的に指定することができます。明示的インターフェースがある場合、この属性を使用すれば、プログラムの呼び出しプロシージャーの最適化を改善させることができます。また、引数の意図が明らかになることにより、エラー検査の機会が増える効果も期待できます。構文の詳細については、 446ページの『INTENT』を参照してください。

IBM 拡張

次の表は、内部プロシージャーについて、XL Fortran の引数引き渡し方法をまとめたものです (ただし、想定形状仮引数、ポインター仮引数、または割り当て可能仮引数は含まれません)。

表 21. 引き渡し方法および意図 (INTENT)

引数の型 Intent(IN) Intent(OUT) Intent(INOUT) No Intent

非 CHARACTER スカラー

VALUE デフォルト デフォルト デフォルト

CHARACTER*1 スカラー

VALUE REFERENCE REFERENCE REFERENCE

CHARACTER*n スカラー

REFERENCE REFERENCE REFERENCE REFERENCE

CHARACTER*(*)

スカラーデフォルト デフォルト デフォルト デフォルト

派生型 1 スカラー VALUE デフォルト デフォルト デフォルト

派生型 2 スカラー デフォルト デフォルト デフォルト デフォルト

222 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 249: IBM XL Fortran for Linux, V15.1

表 21. 引き渡し方法および意図 (INTENT) (続き)

引数の型 Intent(IN) Intent(OUT) Intent(INOUT) No Intent

非 CHARACTER 配列

デフォルト デフォルト デフォルト デフォルト

CHARACTER*1 配列

REFERENCE REFERENCE REFERENCE REFERENCE

CHARACTER*n 配列

REFERENCE REFERENCE REFERENCE REFERENCE

CHARACTER*(*)

配列デフォルト デフォルト デフォルト デフォルト

派生型 3 配列 デフォルト デフォルト デフォルト デフォルト

IBM 拡張 の終り

オプションの仮引数OPTIONAL 属性を指定すると、プロシージャーの参照で、仮引数を実引数に関連付ける必要がなくなります。OPTIONAL 属性には、次のような利点があります。

v オプションの仮引数を使用すると、デフォルトの動作をオーバーライドできます。 218ページの『引数キーワード』に具体例がありますので、参照してください。

v プロシージャーの参照がさらに柔軟になります。例えば、プロシージャーには、エラー・ハンドラーまたは戻りコード用のオプションの引数を指定できますが、どのプロシージャー参照が対応する実引数を渡すかを選択することができます。

構文および規則の詳細については、 468ページの『OPTIONAL』を参照してください。

オブジェクト受け渡し仮引数

Fortran 2003

オブジェクト受け渡し仮引数があるプロシージャーを参照する場合、実引数として、関数参照または呼び出しステートメントの data_ref が、そのオブジェクト受け渡し仮引数に関連付けられます。オブジェクト受け渡し仮引数を参照してください。

Fortran 2003 の終り

指定されていないオプションの仮引数に関する制約事項ある仮引数が、サブプログラムのインスタンス内に指定されるのは、その仮引数が仮引数自身ではない実引数と関連付けられているか、あるいはその仮引数が非オプ

1.配列コンポーネントまたは CHARACTER*n コンポーネント (n > 1) を持たない派生型のデータ・オブジェクト

2.配列コンポーネントまたは CHARACTER*n コンポーネント (n > 1) を持つ派生型のデータ・オブジェクト

3.任意の型、サイズ、ランクのコンポーネントを持つ派生型のデータ・オブジェクト

第 8 章 プログラム単位およびプロシージャー 223

Page 250: IBM XL Fortran for Linux, V15.1

ションまたは呼び出しサブプログラムに存在する仮引数と関連付けられている場合です。オプションでない仮引数は、必ず指定されなければなりません。

仮引数または仮引数にホスト関連付けで関連付けられたエンティティーは、以下のいずれかの条件を満たす場合、指定されていないと見なされます。

v 実引数に対応していない。

v 存在しない実引数に対応している。

F2008 -qxlf2008=checkpresence オプションが有効な場合、仮引数または仮引数に親子結合で関連付けられたエンティティーは、以下のいずれかの条件を満たす場合にも、指定されていないと見なされます。

v ALLOCATABLE 属性が設定されておらず、対応する実引数に ALLOCATABLE

属性が設定されているが、割り振りが行われていない。

v POINTER 属性が設定されておらず、対応する実引数に POINTER 属性が設定されているが、関連付けが行われていない。

例外:

-qxlf2008=checkpresence オプションは、以下のいずれかの条件が満たされる場合、引数の有無に影響しません。

v プロシージャー・ポインター実引数が、オプションの仮プロシージャー引数に対して提供されている。

v ポインター実引数または割り振り可能実引数が、組み込みプロシージャーのオプション引数に対して提供されている。

v ポインター実引数または割り振り可能実引数が、エレメント型プロシージャーのオプション仮引数に対して提供されている。

F2008

オプションの仮引数のうち、指定されていないものは、次の規則に従う必要があります。

v ダミー・データ・オブジェクトの場合、定義または参照はできません。ダミー・データ・オブジェクトがデフォルトの初期化が指定できる型である場合、初期化に対する効果はなくなります。

v ポインター代入の data_target または proc_target として使用することはできません。

v プロシージャーまたはプロシージャー・ポインターの場合、呼び出しはできません。

v オプションではない仮引数に対応する実引数として指定することはできません。ただし、PRESENT 組み込み関数の引数として指定することはできます。

v 指定されていないオプションの仮引数のサブオブジェクトは、オプションの仮引数に対応する実引数として使用することはできません。

v 指定されていないオプションの仮引数が配列である場合、実引数としてエレメント型プロシージャーに渡すことはできません。ただし、同じランクの配列が、そのエレメント型プロシージャーのオプションでない仮引数に対応する実引数として渡される場合を除きます。

224 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 251: IBM XL Fortran for Linux, V15.1

v 指定されていないオプションの仮引数がポインターである場合、非ポインター仮引数に対応する実引数として、割り振り、割り振り解除、無効化、ポインター代入、および引き渡しをすることはできません。ただし、PRESENT 組み込み関数の引数は例外です。

v 指定されていないオプションの仮引数が割り振り可能である場合、割り振り不可の仮引数に対応する実引数として、割り振り、割り振り解除、または引き渡しを行うことはできません。ただし、PRESENT 組み込み関数の引数とする場合は例外です。

v length 型パラメーターがある場合、それらの型パラメーターは、照会の対象とはできません。

v 指定されていないオプションの仮引数を、 ASSOCIATE またはSELECT TYPE 構文のセレクター として使用することはできません。

文字引数の長さ文字仮引数の長さが、非定数の宣言式またはコロンになっている場合、オブジェクトは実行時の長さを持つ仮引数です。コロンの長さが指定されている文字仮引数は、長さが据え置きの文字仮引数になります。仮引数ではないオブジェクトが実行時の長さを持ち、長さが据え置きではない場合、そのオブジェクトは自動オブジェクトになります。詳しくは、 21ページの『自動オブジェクト』を参照してください。

仮引数の長さ指定子が括弧で囲まれたアスタリスクの場合、仮引数の長さは、実引数から「継承され」ます。仮引数を含んでいるプログラム単位外で長さが指定されているため、その長さを継承することになるわけです。関連した実引数が配列名である場合、仮引数が継承する長さは、その関連した実引数配列における配列エレメントの長さです。継承された長さを持つ文字仮引数には、%REF を指定することはできません。

仮引数が変数の場合仮引数が割り振り可能でもポインターでもない場合、関連付けられた実引

数と型互換性がなければなりません。仮引数が割り振り可能またはポインターになっている場合、関連付けられた実引数は、その仮引数がポリモアフィックで、実引数の宣言型が、仮引数の宣言型と同じ場合に限ってポリモアフィックになります。

実引数がスカラーである場合、対応する仮引数は以下のいずれかのカテゴリーに属します。

v 実引数が以下のいずれかの条件を満たさない限り、仮引数はスカラーである必要がある。

– 実引数が、デフォルト文字型である。

– 実引数が、C 文字種類を持つ文字型である。

– 実引数が、想定形状でもポインター配列でもない配列のエレメントまたはエレメントのサブストリングである。

vTS 29113 仮引数は想定ランク・オブジェクトです。 TS 29113

vTS 29113 仮引数は想定型の想定サイズ配列です。 TS 29113

第 8 章 プログラム単位およびプロシージャー 225

Page 252: IBM XL Fortran for Linux, V15.1

実引数が割り振り可能である場合は、対応する仮引数も割り振り可能でなければなりません。プロシージャーが総称名によって参照されるか、定義済み演算子または定義済み代入として参照される場合、実引数と対応する仮引数のランクは一致する必要があります。スカラー仮引数を関連付けられるのは、スカラー実引数だけです。

プロシージャーがエレメント型ではなく、総称名によって参照されるか、定義済み演算子または定義済み代入として参照される場合、実引数と対応する仮引数のランクは一致する必要があります。

エレメント型サブプログラム内で使用される仮引数には、以下の規則が適用されます。

v すべての仮引数はスカラーでなければならず、 ALLOCATABLE またはPOINTER 属性を設定することはできません。

v 仮引数、またはそのサブオブジェクトは、宣言式内で使用することはできません。ただし、それが BIT_SIZE、KIND、または、LEN 組み込み関数に対する引数として、または数値照会の組み込み関数のいずれかに対する引数として使用される場合を除きます。 623ページの『第 14 章 組み込みプロシージャー』を参照してください。

v 仮引数にアスタリスクを指定することはできません。

v 仮引数にダミー・プロシージャーを指定することはできません。

スカラー仮引数が文字型である場合、その長さは、実引数の長さ以下でなければなりません。仮引数は、実引数の左端の文字に関連付けられます。文字型の仮引数は、配列であり、長さの制限は各配列エレメントにではなく配列全体に適用されます。つまり、仮引数配列全体の長さを実引数配列全体より長くすることはできませんが、関連した配列エレメントの長さを変更することはできます。

仮引数が想定形状配列である場合は、 実引数のランクは、仮引数のランクと同じになっていなければならず、 実引数は想定サイズ配列およびスカラーであってはなりません (配列エレメントまたは配列エレメントのサブストリングの指定子を含みます)。

仮引数が明示的形状配列または想定サイズ配列で、実引数が文字以外の配列である場合、仮引数のサイズは実引数配列のサイズを超えてはなりません。各実配列エレメントは、対応する仮配列エレメントに関連付けられます。実引数が、添え字値 as

の文字以外の配列エレメントである場合、仮引数配列のサイズは、(実引数配列のサイズ + 1 - as) を超えてはなりません。添え字値が ds の仮引数配列エレメントは、添え字値が (as + ds - 1) の実引数配列エレメントに関連付けられます。

実引数が、文字配列、文字配列エレメント、または文字サブストリングのいずれかで、配列の文字記憶単位 acu で始まる場合、関連付けられた仮引数配列の文字記憶単位 dcu は、実配列引数の文字記憶単位 (acu+dcu-1) に関連付けられます。

関連した実引数が変数の場合、仮引数を変数名としてサブプログラム内で定義することができます。関連した実引数が定義可能でない場合は、変数名としての仮引数をサブプログラム内で再定義してはなりません。

226 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 253: IBM XL Fortran for Linux, V15.1

実引数がベクトル添え字を持つ配列セクションの場合、関連付けられる仮引数は定義することができず、さらに INTENT(OUT)、INTENT(INOUT)、VOLATILE、および ASYNCHRONOUS 属性を設定することはできません。

実引数が配列セクションまたは想定形状配列で、対応する仮引数に VOLATILE または ASYNCHRONOUS 属性のいずれも設定されていない場合、その仮引数は、想定形状配列でなければなりません。

実引数が、VOLATILE 属性または ASYNCHRONOUS 属性が設定された非ポインターであるが、 F2008 単純連続ではなく、 F2008 対応する仮引数に、VOLATILE 属性または ASYNCHRONOUS 属性が設定されている場合、その仮引数は、 F2008 CONTIGUOUS 属性を持たない F2008

想定形状配列でなければなりません。

実引数が、VOLATILE 属性または ASYNCHRONOUS 属性が設定された配列ポインターであるが、 F2008 CONTIGUOUS 属性は設定されておらず、 F2008 対応する仮引数に VOLATILE 属性またはASYNCHRONOUS 属性が設定されている場合、その仮引数は、 F2008

CONTIGUOUS 属性を持たない F2008 配列ポインターまたは想定形状配列でなければなりません。

F2008 仮引数がCONTIGUOUS 属性を持つポインターである場合、対応する実引数は単純連続でなければなりません。 F2008

組み込み照会関数に関連する場合を除き、 非ポインターの仮引数が、ポインターの実引数に関連付けられている場合、その実引数は、現在ターゲットに関連付けられていなければならず、そのターゲットに対してその仮引数が引数関連となります。引き渡し方法に関する制限がある場合は、それらが実引数のターゲットに適用されます。

組み込み照会関数に関連する場合を除き、仮引数が割り振り不可で、実引数が割り振り可能である場合、実引数を割り振る必要があります。

仮引数に VALUE 属性がある場合、その仮引数は、その初期値が実引数の初期値になっている、定義可能な無名データ・オブジェクトに関連付けられます。その後に仮引数の値または定義状況が変更されても、それは実引数には影響しません。

仮引数がターゲットでもポインターでもない場合は、実引数に関連付けられたポインターは、プロシージャー呼び出し時に、対応する仮引数に関連付けられません。

仮引数と実引数の両方がターゲット (TARGET 属性が設定されている) であり、以下の表の左側にリストされている条件がすべて満たされる場合は、右側にリストされている関連付けが行われます。

第 8 章 プログラム単位およびプロシージャー 227

Page 254: IBM XL Fortran for Linux, V15.1

仮引数と実引数の両方がターゲットである場合の条件 関連付け

1. 仮引数に VALUE 属性が設定されていない。�1�

2. 実引数が単純連続であるか、仮引数がスカラーまたは CONTIGUOUS 属性を持たない想定形状配列である。�2�

3. 実引数が、同じ指標を持つオブジェクトでないか、ベクトル添え字を持つ配列セクションではない。

1. 実引数に関連したポインターはすべて、プロシージャー呼び出し時に対応する仮引数に関連付けられます。

2. プロシージャーの実行が完了しても、仮引数に関連したポインターは実引数に関連付けられたままになります。

1. 仮引数が、明示的形状配列、CONTIGUOUS

属性�2�を持つ想定形状配列、または想定サイズ配列である。

2. 実引数が単純連続ではない。�2�

3. 実引数がベクトル添え字を持つ配列セクションではない。

1. 実引数に関連付けられたポインターが、プロシージャーの呼び出し時に対応する仮引数に関連付けられるかどうかは、プロセッサーに依存します。

2. プロシージャーの実行が完了しても、仮引数に関連付けられたポインターが実引数に関連付けられたままになるかどうかは、プロセッサーに依存します。

注:

�1� Fortran 2003

�2� Fortran 2008

仮引数がターゲットであり、それに対応する実引数がターゲットではないか、または、ベクトル添え字を持つ配列セクションである場合、仮引数に関連付けられたポインターは、プロシージャーの実行完了時に未定義になります。

仮引数に TARGET 属性と VALUE 属性がある場合、仮引数に関連付けられたポインターは、プロシージャーの実行完了時に未定義になります。

仮引数が割り振り可能オブジェクトの場合 (Fortran 2003)F2008 割り振り可能仮引数に関連付けられた実引数は変数でなければなりません。 F2008 割り振り可能仮引数が配列である場合、関連付けられた実引数も同じランクの配列でなければなりません。実引数の非据え置き型パラメーターは、仮引数の対応するパラメーターと一致する必要があります。

割り振り可能な仮引数に関連付けられる実引数は、仮引数と同じ型パラメーターを据え置きにする必要があります。

プロシージャーの開始時における、割り振り可能な仮引数の割り振り状況は、関連付けられた実引数の割り振り状況になります。仮引数が INTENT(OUT) で、関連付けられた実引数が割り振り済みの場合は、仮引数の割り振り状況が、割り振られていないという割り振り状況になるように、プロシージャー呼び出し時にその実引数が割り振り解除されます。仮引数が INTENT(OUT) ではなく、実引数が割り振り済みの場合は、仮引数の値は関連付けられた実引数の値になります。

228 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 255: IBM XL Fortran for Linux, V15.1

プロシージャーがアクティブな間は、INTENT(IN) が指定されていない割り振り可能な仮引数は、割り振り、割り振り解除、定義、または定義解除を行うことができます。これらのイベントのいずれかが発生した場合、異なる別名を介して関連した実引数を参照することは許されません。

ルーチンの終了時には、実引数の割り振り状況は、割り振り可能な仮引数の状況になります ( 割り振り可能な仮引数に INTENT(IN) がある場合は、当然ながら変更されません)。仮引数から実引数に値を伝搬する場合、通常の規則が適用されます。

割り振り可能な仮引数の自動割り振り解除は、仮引数のプロシージャー内のRETURN または END ステートメントの実行結果としては行われません。

注: INTENT(IN) 属性が設定された割り振り可能仮引数は、呼び出し先のプロシージャー内で変更された割り振り状況を持つことはできません。このような仮引数と通常の仮引数との主な違いは、このような仮引数は、プロシージャーの開始時に(およびプロシージャーの実行中にわたって) 割り振り解除される可能性がある点です。

例SUBROUTINE LOAD(ARRAY, FILE)

REAL, ALLOCATABLE, INTENT(OUT) :: ARRAY(:, :, :)CHARACTER(LEN=*), INTENT(IN) :: FILEINTEGER UNIT, N1, N2, N3INTEGER, EXTERNAL :: GET_LUNUNIT = GET_LUN() ! Returns an unused unit numberOPEN(UNIT, FILE=FILE, FORM='UNFORMATTED')READ(UNIT) N1, N2, N3ALLOCATE(ARRAY(N1, N2, N3))READ(UNIT) ARRAYCLOSE(UNIT)

END SUBROUTINE LOAD

仮引数がポインターの場合仮データ・ポインターに対応する実引数には、以下の要件が適用されます。

v 仮引数がポインターの場合、実引数もポインターでなければなりません。F2008 ただし、仮引数に INTENT(IN) 属性が設定されており、実引数に

TARGET 属性が設定されている場合を除きます。 F2008 仮引数の型、非据え置き型パラメーター、およびランクが、対応する実引数と一致している必要があります。

v F2008 実引数に関連付けられた仮引数がポインターであり、その仮引数にCONTIGUOUS 属性が設定されている場合、実引数は単純連続でなければなりません。 F2008

v ポインターである仮引数に関連付けられる実引数は、仮引数と同じ型パラメーターを据え置きにする必要があります。

v 実引数参照は、ポインター自体に対するもので、ターゲットに対するものではありません。プロシージャーが呼び出されると、次のようになります。

– 仮引数は、実引数のポインター関連付け状況を獲得します。

– 実引数が関連付けられる場合、仮引数も同じターゲットに関連付けられます。

第 8 章 プログラム単位およびプロシージャー 229

Page 256: IBM XL Fortran for Linux, V15.1

関連付け状況は、プロシージャーの実行中に変更が可能です。プロシージャーの実行が完了すると、仮引数の関連付け状況は、関連付けられている場合、未定義になります。

引き渡し方法は参照渡しでなければなりません。つまり、%VAL をポインター実引数に指定することはできません。

関連情報v F2008 連続性 F2008

仮引数がプロシージャーの場合プロシージャー またはプロシージャー・ポインター として識別された仮引数は、それぞれダミー・プロシージャーおよび ダミー・プロシージャー・ポインター と呼ばれます。

仮引数が POINTER 属性を持たないダミー・プロシージャーの場合、関連付けられた実引数は、外部プロシージャー、モジュール・プロシージャー、ダミー・プロシージャー、または組み込みプロシージャーの特定名でなければなりません。この名前は、引数、関連付けられたプロシージャー・ポインター、または参照として、関連付けられたプロシージャー・ポインターを戻す関数に渡すことができます。この特定名も総称名で、その特定のプロシージャーのみが仮引数と関連付けられます。

仮引数がプロシージャー・ポインターの場合、関連付けられた実引数は、プロシージャー・ポインター、プロシージャー・ポインターを戻す関数への参照、またはNULL 組み込み関数への参照でなければなりません。

外部プロシージャー名またはダミー・プロシージャー名を実引数として使用する場合、そのインターフェースが明示的であるか、または EXTERNAL 属性で明示的に宣言する必要があります。

仮引数のインターフェースが明示的である場合、その特性は関連付けられた実引数および対応する仮引数と同じでなければなりません。ただし、純粋な実引数が純粋でない仮引数と関連付けられる場合は除きます。

仮引数のインターフェースが暗黙的で、仮引数の名前が明示的な型付きであるか、または、関数として参照される場合、仮引数はサブルーチンとして参照されてはならず、実引数は関数、 関数プロシージャー・ポインター 、またはダミー・プロシージャーでなければなりません。

仮引数のインターフェースが暗黙的で、そのインターフェースに対する参照が、見かけ上サブルーチン参照と思われる場合、実引数はサブルーチン、 サブルーチン・プロシージャー・ポインター 、またはダミー・プロシージャーでなければなりません。

内部サブプログラムを、ダミー・プロシージャー引数に関連付けることはできません。 Fortran 95 では、非組み込みエレメント型プロシージャーを実引数として使用することはできません。

230 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 257: IBM XL Fortran for Linux, V15.1

仮引数がプロシージャーの例PROGRAM MYPROGINTERFACE

SUBROUTINE SUB (ARG1)EXTERNAL ARG1INTEGER ARG1

END SUBROUTINE SUBEND INTERFACEEXTERNAL IFUNC, RFUNCREAL RFUNC

CALL SUB (IFUNC) ! Valid referenceCALL SUB (RFUNC) ! Invalid reference!! The first reference to SUB is valid because IFUNC becomes an! implicitly declared integer, which then matches the explicit! interface. The second reference is invalid because RFUNC is! explicitly declared real, which does not match the explicit! interface.END PROGRAM

SUBROUTINE ROOTSEXTERNAL NEGX = QUAD(A,B,C,NEG)RETURN

ENDFUNCTION QUAD(A,B,C,FUNCT)

INTEGER FUNCTVAL = FUNCT(A,B,C)RETURN

END

FUNCTION NEG(A,B,C)RETURN

END

関連情報v 実引数として渡すことができる組み込みプロシージャーについては、 623ページの『第 14 章 組み込みプロシージャー』を参照してください。

v プロシージャーを参照する場合の規則および制約事項については、 209ページの『プロシージャー参照』を参照してください。

仮引数がアスタリスクの場合アスタリスクの形の仮引数を指定できるのは、サブルーチン・サブプログラム内のSUBROUTINE ステートメントまたは ENTRY ステートメントの仮引数リスト内に限られます。対応する実引数は、代替戻り指定子でなければなりません。この指定子は、CALL ステートメントと同じ有効範囲にある分岐ターゲット・ステートメントのステートメント・ラベルを示し、制御はこの CALL ステートメントに戻されます。

例CALL SUB(*10)STOP ! STOP is never executed

10 PRINT *, 'RETURN 1'CONTAINS

SUBROUTINE SUB(*)...

RETURN 1 ! Control returns to statement with label 10END SUBROUTINE

END

第 8 章 プログラム単位およびプロシージャー 231

Page 258: IBM XL Fortran for Linux, V15.1

プロシージャー参照の解決プロシージャー参照内のサブプログラム名は、総称名として確立されるか、特定名としてのみ確立されるか、あるいは確立されないかのいずれかです。

以下の条件のうちの 1 つ以上が当てはまる場合、サブプログラム名は有効範囲単位内で総称名として確立されます。

v 有効範囲単位にその名前のインターフェース・ブロックがある。

v サブプログラム名が、INTRINSIC 属性によって有効範囲単位内に指定された総称組み込みプロシージャーの名前と同じである。

v 有効範囲単位が、使用関連付けを介してモジュールにある総称名を使用している。

v 有効範囲単位内にサブプログラム名の宣言はないが、その名前がホスト有効範囲単位内で総称名として確立されている。

サブプログラム名が総称名として確立されておらず、以下の条件のいずれかが当てはまる場合、そのサブプログラム名は、有効範囲単位内で特定名としてのみ確立されます。

v 有効範囲単位内に同じ名前のインターフェース本体がある。

v 同じ名前のステートメント関数、モジュール・プロシージャー、または内部サブプログラムが有効範囲単位内にある。

v サブプログラム名が、INTRINSIC 属性によって有効範囲単位内に指定された特定組み込みプロシージャーの名前と同じである。

v 有効範囲単位に、そのサブプログラム名が指定された EXTERNAL ステートメントがある。

v 有効範囲単位が、使用関連付けを介してモジュールにある特定名を使用している。

v 有効範囲単位内にサブプログラム名の宣言はないが、その名前がホスト有効範囲単位内で特定名として確立されている。

サブプログラム名が総称名または特定名のいずれとしても確立されない場合、そのサブプログラム名は確立されません。

プロシージャー参照を名前に解決する場合の規則プロシージャー参照を総称名として確立された名前に解決する場合、次の規則が使用されます。

1. その名前のあるインターフェース・ブロックが有効範囲単位内にあるか、または、使用関連付けによってアクセス可能で、参照がそのインターフェース・ブロックの特定のインターフェースの 1 つへの非エレメント型参照と一致している場合、その参照は、その特定インターフェースに関連付けられた特定プロシージャーに対する参照となります。

2. 規則 1 が当てはまらない場合、有効範囲単位内にその名前のインターフェース・ブロックがあるか、または使用関連付けによってアクセス可能で、参照がそのインターフェース・ブロックの特定インターフェースのいずれかに対するエレメント型参照と一致している場合には、その参照は、その特定インターフェースに関連付けられた特定のエレメント型プロシージャーに対する参照となります。

232 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 259: IBM XL Fortran for Linux, V15.1

3. 規則 1、規則 2 のいずれも当てはまらない場合で、有効範囲単位内のプロシージャー名が、 INTRINSIC 属性で指定されるか、またはその名前が INTRINSIC属性で指定されるモジュール・エンティティーを使用している場合には、その参照は、その組み込みプロシージャーのインターフェースと一致します。

4. 規則 1、規則 2、および規則 3 のいずれも当てはまらないが、名前がホストの有効範囲単位内で総称名として確立される場合、その名前はホスト有効範囲単位にこれらの規則を適用することによって解決されます。この規則を適用するには、ホスト有効範囲単位と、関数またはサブルーチンのいずれかの名前を持つ有効範囲単位が一致する必要があります。

プロシージャー参照を特定名としてのみ確立された名前に解決する場合、次の規則が使用されます。

1. 有効範囲単位がサブプログラムで、その名前のインターフェース本体が含まれているか、名前に EXTERNAL 属性がある場合、および名前がそのプログラムの仮引数である場合には、その仮引数はダミー・プロシージャーとなります。参照は、そのダミー・プロシージャーに対する参照となります。

2. 規則 1 が当てはまらない場合で、有効範囲単位にその名前のインターフェース本体が含まれているか、名前に EXTERNAL 属性がある場合、その参照は、外部サブプログラムに対する参照となります。

3. 有効範囲単位内で、その名前のステートメント関数または内部サブプログラムがある場合、参照は、そのプロシージャーに対する参照となります。

4. 有効範囲単位で、名前に INTRINSIC 属性がある場合、参照はその名前の組み込みプロシージャーに対する参照となります。

5. 有効範囲単位には、使用関連付けを介して使用されるモジュール・プロシージャー名に対する参照があります。 USE ステートメント内で名前変更の可能性があるため、参照名は元のプロシージャー名とは異なる場合があります。

6. 以上いずれの規則も当てはまらない場合、参照はホスト有効範囲単位にこれらの規則を適用することによって解決されます。

プロシージャー参照を確立されない名前に解決する場合、次の規則が使用されます。

1. 有効範囲単位がサブプログラムで、名前がそのサブプログラムの仮引数名である場合、その仮引数はダミー・プロシージャーとなります。参照は、そのダミー・プロシージャーに対する参照となります。

2. 規則 1 が当てはまらず、名前が組み込みプロシージャー名の場合、参照はその組み込みプロシージャーに対する参照となります。この規則を適用するには、組み込みプロシージャー定義と、関数またはサブルーチンのいずれかの名前を持つ参照が一致する必要があります。

3. 規則 1、規則 2 のいずれも当てはまらない場合、参照は、その名前の外部プロシージャーに対する参照になります。

再帰直接または間接的にそのプロシージャー自身を参照することのできるプロシージャーを再帰プロシージャーと呼びます。このようなプロシージャーは、特定の条件を満たすまで、無限にそのプロシージャー自身を参照することができます。例えば、正整数 N の階乗は、次のように指定できます。

第 8 章 プログラム単位およびプロシージャー 233

Page 260: IBM XL Fortran for Linux, V15.1

INTEGER N, RESULTREAD (5,*) NIF (N.GE.0) THEN

RESULT = FACTORIAL(N)END IFCONTAINS

RECURSIVE FUNCTION FACTORIAL (N) RESULT (RES)INTEGER RESIF (N.EQ.0) THEN

RES = 1ELSE

RES = N * FACTORIAL(N-1)END IF

END FUNCTION FACTORIALEND

構文および規則の詳細については、 419ページの『FUNCTION』、 517ページの『SUBROUTINE』、または、 397ページの『ENTRY』を参照してください。

プロシージャーで、RECURSIVE または RESULT キーワードが指定される場合に、XL Fortran は、-qrecur コンパイラー・オプションを無視しますが、このオプションを指定すると、外部プロシージャーを再帰的に呼び出すこともできます。

純粋プロシージャー純粋プロシージャーは副次作用がないため、設計上、参照先のすべてのプロシージャーで副次作用が起こらないことが要求される FORALL ステートメントおよび構文で特に有用です。

純粋プロシージャーは、以下のいずれかの条件を満たすプロシージャーです。

v プロシージャーに、PURE プレフィックス指定子がある。

v プロシージャーに、ELEMENTAL プレフィックス指定子があるが、 F2008

IMPURE 指定子はない F2008 。

次のコンテキストでは、プロシージャーが純粋でなければなりません。

v 純粋プロシージャーの内部プロシージャー

v 定義済み演算子、定義済み代入、または、最終化によって参照されたものを含め、 FORALL ステートメントまたは構文の scalar_mask_expr または本体で参照されるプロシージャー

v 純粋プロシージャーで参照されるプロシージャー

v 純粋プロシージャーに対するプロシージャー実引数

組み込み関数 (RAND、XL Fortran 拡張を除く )、およびサブルーチン、MOVE_ALLOC、 MVBITS は、必ず純粋になります。これらについては、明示的に純粋であると宣言する必要はありません。ステートメント関数は、参照する関数がすべて純粋である場合にのみ、純粋になります。

純粋関数の specification_part は、プロシージャー引数、POINTER 属性が設定された引数、 F2008 および VALUE 属性が設定された引数 F2008 を除き、すべての仮引数が INTENT(IN) を持つように指定しなければなりません。純粋サブルーチンの specification_part では、プロシージャー引数、アスタリスク、POINTER 属性を持つ引数、 F2008 および VALUE 属性を持つ引数 F2008 を除き、すべての仮引

234 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 261: IBM XL Fortran for Linux, V15.1

数の意図 (INTENT) を指定する必要があります。このような純粋プロシージャーのためのインターフェース本体は同様に、仮引数の意図を指定しなければなりません。

純粋プロシージャーの execution_part および internal_subprogram_part は、値を変化させる可能性のあるコンテキスト、つまり副次作用を引き起こすコンテキストでは、INTENT(IN) の意図を持つ仮引数、グローバル変数 (または関連したストレージであるオブジェクト)、またはそのサブオブジェクトを参照できません。純粋関数の execution_part および internal_subprogram_part は、次のようなコンテキストでは、仮引数、グローバル変数 (またはグローバル変数に関連付けられたオブジェクト)、その関数のサブオブジェクトを使用してはなりません。

v 変数 がどのレベルかにかかわらずポインター・コンポーネントを持つ派生型である場合、代入ステートメントの中の変数、または代入ステートメントの中の式

v ポインター代入ステートメント内の pointer_object またはターゲット

v DO または暗黙 DO 変数

v READ ステートメント内の input_item

v WRITE ステートメント内の内部ファイル識別子

v 入出力ステートメント内の IOSTAT=、SIZE=、または IOMSG= 指定子変数

v ALLOCATE、DEALLOCATE、 NULLIFY、または ASSIGN ステートメント内の変数

v POINTER 属性を伴う仮引数、あるいは OUT または INOUT の意図に関連付けられた実引数

v LOC に対する引数

v STAT= または ERRMSG= 指定子

v READ ステートメントに指定された NAMELIST 内の変数

v SELECT TYPE または ASSOCIATE 構文の関連名が変数定義コンテキストに指定されている場合に、それらの構文のセレクターとなっている変数

純粋プロシージャーは、いかなるエンティティーも VOLATILE とは指定できません。また、使用関連付けまたはホスト関連付けによりアクセスされるデータが、VOLATILE となっている場合、そうしたデータへの参照を含めることはできません。これには、NAMELIST I/O により生じるデータの参照も含まれます。

F2008 純粋なサブプログラムのローカル変数、または純粋なサブプログラム内のBLOCK 構文のローカル変数には、SAVE 属性を設定できません。 F2008

純粋プロシージャーでは、内部入出力だけを行うことができます。したがって、入出力ステートメントの装置識別子をアスタリスク (*) にしたり、外部装置を参照したりすることはできません。入出力ステートメントは、次のとおりです。

v BACKSPACE

v CLOSE

v ENDFILE

v FLUSH

v INQUIRE

v OPEN

第 8 章 プログラム単位およびプロシージャー 235

Page 262: IBM XL Fortran for Linux, V15.1

v PRINT

v READ

v REWIND

v WAIT

v WRITE

PAUSE 文および STOP 文は、純粋プロシージャーでは使用できません。

純粋関数と純粋サブルーチンには、次の 2 つの違いがあります。

1. サブルーチンの非ポインター・ダミー・データ・オブジェクトは任意の意図を設定できますが、関数の非ポインター・ダミー・データ・オブジェクトは、INTENT(IN) でなければなりません。

2. POINTER 属性を伴うサブルーチンのダミー・データ・オブジェクトは、関連付け状況または定義状況、あるいはその両方を変更する場合があります。

プロシージャーが純粋として定義されていない場合、インターフェース本体で純粋と宣言することはできません。しかし、その逆は真ではありません。すなわち、プロシージャーで純粋と定義されている場合でも、インターフェース本体では純粋と宣言する必要はありません。その場合、当然のことながら、インターフェース本体がプロシージャーを純粋と宣言しない場合は、そのプロシージャー (明示的インターフェースによって参照する場合) は、純粋プロシージャー参照だけが許可されるところでは参照として使用できません (FORALL ステートメント内など)。

例PROGRAM ADD

INTEGER ARRAY(20,256)INTERFACE ! Interface required for

PURE FUNCTION PLUS_X(ARRAY) ! a pure procedureINTEGER, INTENT(IN) :: ARRAY(:)INTEGER :: PLUS_X(SIZE(ARRAY))

END FUNCTIONEND INTERFACEINTEGER :: XX = ABS(-4) ! 組み込み関数

! is always pureFORALL (I=1:20, I /= 10)

ARRAY(I,:) = I + PLUS_X(ARRAY(I,:)) ! Procedure references in! FORALL must be pure

END FORALLEND PROGRAMPURE FUNCTION PLUS_X(ARRAY)

INTEGER, INTENT(IN) :: ARRAY(:)INTEGER :: PLUS_X(SIZE(ARRAY)),XINTERFACE

PURE SUBROUTINE PLUS_Y(ARRAY)INTEGER, INTENT(INOUT) :: ARRAY(:)

END SUBROUTINEEND INTERFACEX=8PLUS_X = ARRAY+XCALL PLUS_Y(PLUS_X)

END FUNCTION

PURE SUBROUTINE PLUS_Y(ARRAY)INTEGER, INTENT(INOUT) :: ARRAY(:) ! Intent must be specified

236 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 263: IBM XL Fortran for Linux, V15.1

INTEGER :: YY=6ARRAY = ARRAY+Y

END SUBROUTINE

エレメント型プロシージャーエレメント型プロシージャーとは、ELEMENTAL 接頭部指定子を持つエレメント型組み込みプロシージャーまたはエレメント型サブプログラムです。ELEMENTAL プレフィックス指定子が使用される場合、RECURSIVE 指定子は使用できません。

エレメント型プロシージャーを指定した場合、-qrecur オプションは使用できません。

エレメント型サブプログラムは、 F2008 IMPURE F2008 接頭部指定子を持っていない限り、純粋なサブプログラムです。

エレメント型プロシージャーは、以下の規則に従っていなければなりません。

v エレメント型関数の結果はスカラーでなければならず、またALLOCATABLE 属性または POINTER 属性を持っていてはなりません。

v エレメント型サブプログラム内で使用される仮引数には、以下の規則が適用されます。

– 仮引数はスカラー・データ・オブジェクトでなければならず、またALLOCATABLE 属性または POINTER 属性を持っていてはなりません。

– エレメント型関数の結果はスカラーでなければならず、またALLOCATABLE 属性または POINTER 属性を持っていてはなりません。

– 仮引数が、エレメント型関数の結果の型パラメーター値を指定する宣言式内にあるオブジェクト指定子の基本オブジェクトである場合、オブジェクト指定子は宣言照会の対象としてのみ使用しなければならず、照会は据え置かれているプロパティーに依存していてはなりません。

– 仮引数にアスタリスクを指定することはできません。

– F2008 VALUE 属性を持たない仮引数には、INTENT 属性が指定されていなければなりません。 F2008

v エレメント型サブプログラムには ENTRY ステートメントを指定することができますが、ENTRY ステートメントに ELEMENTAL プレフィックスを指定することはできません。 ELEMENTAL プレフィックスを SUBROUTINE またはFUNCTION ステートメント中に指定すると、 ENTRY ステートメントで定義されるプロシージャーはエレメント型になります。

v エレメント型プロシージャーは、要素式の定義済み演算子として使用できますが、 117ページの『演算子と式』で説明されている要素式の規則に従わなければなりません。

エレメント型プロシージャーに対する参照では、以下の規則が適用されます。

第 8 章 プログラム単位およびプロシージャー 237

Page 264: IBM XL Fortran for Linux, V15.1

v 実引数が配列である場合、INTENT(OUT) または INTENT(INOUT) のいずれかの仮引数に対応する実引数はすべて、配列でなければなりません。

v 実引数はすべて適合可能でなければなりません。

エレメント型関数に対する参照では、以下の規則が適用されます。

v 結果の形状は、最大ランクを持つ実引数の形状と同じです。

v 実引数がない場合、またはすべての実引数がスカラーである場合、結果はスカラーです。

エレメント型プロシージャーの実引数が配列である場合、結果のエレメントの値(ある場合) は、プロシージャーが個々に、エレメントの順序で、各配列実引数の対応するエレメントに適用された場合に得られるものと同じになります。

例 1:

! Example of an elemental functionPROGRAM PINTERFACE

ELEMENTAL REAL FUNCTION LOGN(X,N)REAL, INTENT(IN) :: XINTEGER, INTENT(IN) :: N

END FUNCTION LOGNEND INTERFACE

REAL RES(100), VAL(100,100)...

DO I=1,100RES(I) = MAXVAL( LOGN(VAL(I,:),2) )

END DO...

END PROGRAM P

例 2:

! Elemental procedure declared with a generic interfaceINTERFACE RAND

ELEMENTAL FUNCTION SCALAR_RAND(x)REAL, INTENT(IN) :: X

END FUNCTION SCALAR_RAND

FUNCTION VECTOR_RANDOM(x)REAL X(:)REAL VECTOR_RANDOM(SIZE(x))

END FUNCTION VECTOR_RANDOMEND INTERFACE RAND

REAL A(10,10), AA(10,10)

! The actual argument AA is a two-dimensional array. The procedure! taking AA as an argument is not declared in the interface block.! The specific procedure SCALAR_RAND is then called.

A = RAND(AA)

! The actual argument is a one-dimensional array section. The procedure! taking a one-dimensional array as an argument is declared in the! interface block. The specific procedure VECTOR_RANDOM is then called.

238 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 265: IBM XL Fortran for Linux, V15.1

! This is a non-elemental reference since VECTOR_RANDOM is not elemental.

A(:,1) = RAND(AA(6:10,2))END

関連情報v 318ページの『ALLOCATABLE (Fortran 2003)』

v 649ページの『BIT_SIZE(I)』

v 397ページの『ENTRY』

v 419ページの『FUNCTION』

v 446ページの『INTENT』

v 623ページの『第 14 章 組み込みプロシージャー』

v 701ページの『KIND(X)』

v 703ページの『LEN(STRING, KIND)』

v 731ページの『MVBITS(FROM, FROMPOS, LEN, TO, TOPOS)』

v 472ページの『POINTER (Fortran 90)』

v 234ページの『純粋プロシージャー』

v 517ページの『SUBROUTINE』

v 538ページの『VALUE (Fortran 2003)』

第 8 章 プログラム単位およびプロシージャー 239

Page 266: IBM XL Fortran for Linux, V15.1

240 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 267: IBM XL Fortran for Linux, V15.1

第 9 章 XL Fortran の入出力

XL Fortran では、同期および非同期、両方の入出力 (I/O) をサポートしています。同期 I/O は、 I/O 操作が完了するまで、実行中のアプリケーションを停止します。非同期 I/O の場合は、バックグラウンドで I/O 操作が行われている間もアプリケーションが処理を続行できます。どちらのタイプの I/O でも、次のファイル・アクセス方式をサポートしています。

v 順次アクセス

v 直接アクセス

v ストリーム・アクセス

どのアクセス方式にも、レコード、ファイル、および装置といった I/O 概念に基づき、それぞれ利点と制約があります。

また、このセクションには、XL Fortran I/O ステートメントの使用時に発行される可能性がある IOSTAT= 指定子コードについての説明も記載されています。

レコードレコードには、一連の文字または数値が含まれます。XL Fortran では、次の 3 つのレコード・タイプをサポートしています。

v 定様式

v 不定形式

v ファイル終了

定様式レコード定様式レコードは、読み取り可能な形式で印刷できる一連の ASCII 文字で構成されます。定様式レコードを読み取る場合、データ値が読み取り可能文字から内部表記に変換されます。定様式レコードを書き込む場合は、内部表記から読み取り可能な文字にデータが変換されます。

不定形式レコード不定形式レコードには、一連の内部表記の値が含まれており、文字データと文字以外のデータの両方が含まれています。不定形式レコードには、データがないこともあります。また、不定形式レコードを読み書きする場合、レコードのデータが内部表記から変換されることはありません。

ファイル終了レコードファイル終了レコードが存在する場合、ファイル終了レコードがファイルの最終レコードになります。これには、長さはありません。ファイル終了レコードは、ENDFILE ステートメントによって明示的に書き込むことができます。順次アクセスのために接続されたファイルに対して、最後のデータ転送ステートメントが

© Copyright IBM Corp. 1996, 2015 241

Page 268: IBM XL Fortran for Linux, V15.1

WRITE ステートメントで、そのファイルを参照するファイル位置決めのステートメントが何の干渉を受けずに実行され、以下のいずれかが真の場合は、ファイル終了レコードが暗黙的に書き込まれます。

v そのファイルが接続されている装置を、REWIND または BACKSPACE ステートメントが参照している。

v そのファイルが、CLOSE ステートメントによって明示的に、エラー条件が原因ではないプログラム終了処理によって暗黙的に、または同じ装置に対する別のOPEN ステートメントによって暗黙的にクローズされる。

ファイルファイルとは、一連の内部または外部レコードまたはファイル記憶単位です。ユーザーは、ファイルを装置に接続するときのアクセス方式を決定します。外部ファイルには、以下の 3 つの方法でアクセスできます。

v 順次アクセス

v 直接アクセス

v ストリーム・アクセス

内部ファイルには、順次アクセスしか実行できません。

外部ファイルの定義外部ファイルは、ディスクまたは端末装置などの I/O デバイスに関連付ける必要があります。外部ファイルは、プログラムがそのファイルを作成する場合、そのプログラムに対して存在対象となり、読み取りおよび書き込みを行う場合、そのプログラムに対して使用対象となります。外部ファイルを削除すると、そのファイルは存在しなくなります。外部ファイルは、 レコードがなくても、存在する場合があります。

外部ファイルをファイル名で指定するには、有効なオペレーティング・システムのファイル名を指定する必要があります。各ファイル名には、最大 255 文字まで使用することができます。絶対パス名を指定する場合は、最大 4095 文字まで使用できます。

外部ファイルの位置は、先行する I/O ステートメントによって決められます。外部ファイルの位置は、次のように決めることができます。

v 初期点。これは、最初のレコードないし最初のファイル記憶単位の直前の位置です。

v 終端点。これは、最後のレコードないし最後のファイル記憶単位の直後の位置です。

v 現行レコード。これは、ファイル位置が特定のレコード内にある場合です。そうでない場合、現行レコードはありません。

v 先行レコード。これは、現行レコードの直前のレコードです。現行レコードがない場合、先行レコードは現在のファイル位置の直前のレコードです。ファイル位置が初期点、またはファイルの最初のレコード内にあるときには、先行レコードは存在しません。

242 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 269: IBM XL Fortran for Linux, V15.1

v 次のレコード。これは、現行レコードの直後のレコードです。現行レコードがない場合、次のレコードは現在の位置の直後のレコードです。ファイル位置が終端点、またはファイルの最後のレコード内にあるときには、先行レコードは存在しません。

外部ファイルの位置は、エラーの後では不確定になることもあります。

ファイル・アクセス方式

順次アクセス順次アクセスを使用すると、ファイル内のレコードは、そのファイルのレコードの論理順序に基づいて読み取り、書き取りが行われます。順次アクセスは、 内部ファイル、外部ファイルの両方をサポートしています。

外部ファイル: 順次アクセス用に接続されたファイルには、書き込まれた順にレコードが入ります。レコードは、すべてが定様式か、すべてが不定形式 のいずれかでなければなりません。ファイルの最後のレコードは、 ファイル終了レコードでなければなりません。ファイルが順次アクセス用に接続されている間は、直接アクセス

またはストリーム・アクセス I/O ステートメントによって、レコードを読み取ったり、書き込んだりしてはなりません。

内部ファイル: 内部ファイルは、ベクトル添え字が設定された配列セクションではない文字変数です。内部ファイルを作成する必要はありません。内部ファイルは常に存在し、アプリケーションで使用可能です。

内部ファイルがスカラー文字変数の場合、ファイルは、そのスカラー変数と等しい長さを持つ 1 つのレコードで構成されます。内部ファイルが文字配列の場合、配列の各エレメントは、ファイルのレコードとなり、各レコードの長さは同一になります。

内部ファイルに含まれるのは、定様式レコードだけでなければなりません。内部ファイルを指定できるステートメントは、READ および WRITE に限られます。WRITE ステートメントによって書き込む内容がレコード全体に満たない場合、そのレコードの残りの部分にはブランクが埋め込まれます。

内部ファイルは、子データ転送ステートメントの場合を除き、データ転送前に最初のレコードの先頭に置かれます。このレコードが現行レコードになります。

直接アクセス直接アクセスを使用すると、外部ファイルのレコードを任意の順序で読み取り、および書き込むことができます。レコードは、すべてが定様式か、すべてが不定形式のいずれかでなければなりません。順次またはストリーム・アクセス、リスト指示形式設定または名前リスト形式設定、あるいは非アドバンス入出力ステートメントを使用して、レコードの読み取りまたは書き込みを行ってはなりません。ファイルが以前に順次アクセス用に接続されていた場合、ファイルの最後のレコードは ファイル終了レコードになります。ファイル終了レコードは、直接アクセス用に接続されたファイルの一部とは見なされません。

第 9 章 XL Fortran の入出力 243

Page 270: IBM XL Fortran for Linux, V15.1

直接アクセス用に接続されているファイルでは、各レコードには、ファイル内でのレコードの順序を識別するためのレコード番号が付いています。レコード番号は整数値で、レコードの読み取りまたは書き込み時に指定する必要があります。レコードには順に番号が付けられています。最初のレコードが 1 番になります。レコードの読み取りまたは書き込みは、レコード番号順に行う必要はありません。例えば、9

番、5 番、および 11 番のレコードを、それらの間のレコードは書き込まずに、この順序で書き込むこともできます。

直接アクセスに接続されたファイル内のレコードは、すべて同じ長さになります。この長さは、ファイルを接続するときに、OPEN ステートメントで指定します。

直接アクセス用に接続されたファイル内のレコードを削除することはできませんが、新しい値に書き換えることはできます。また、レコードは、先に書き込まなければ読み取ることはできません。

ストリーム・アクセス (Fortran 2003)ストリーム・アクセス用の外部ファイルは、 定様式または不定形式のいずれかとして接続できます。どちらの形式も、1 バイト・ファイル記憶単位で構成される外部ストリーム・ファイルを使用します。不定形式ストリーム・アクセス用に接続されたファイルは、ストリーム構造体のみを持ちますが、定様式ストリーム・アクセス用に接続されたファイルはレコードとストリーム構造体の両方を持ちます。こうした二重構造ファイルには以下の特性があります。

v ファイル記憶単位の中にレコード・マーカーを表すものがあります。

v レコード構造は、ファイルに保管されているレコード・マーカーから推測されます。

v レコード長に理論的な制限はありません。

v レコード・マーカーのない空のレコードの書き込みは無効です。

v ファイルの終わりにレコード・マーカーがない場合、最終レコードは不完全になりますが、空にはなりません。

v 以前に順次アクセス用に接続されたファイル内のファイル終了レコードは、そのファイルをストリーム・アクセス用として接続した場合、ファイルの一部とは見なされません。

定様式ストリーム・アクセス用に接続されたファイルの最初のファイル記憶単位の位置は 1 になります。後続の各記憶単位の位置は、直前の記憶単位よりも大きくなります。後の記憶単位の位置は必ずしも連続するとは限らず、位置指定可能なファイルの読み取りまたは書き込みを位置順に行う必要はありません。定様式ストリーム・アクセス用に接続されたファイル記憶単位の位置を判別するには、INQUIREステートメントの POS= 指定子を使用します。ファイルを位置指定できる場合は、INQUIRE ステートメントを使用して取得した値を使って、そのファイルを位置指定することができます。ファイル作成以降、記憶単位が書き込まれ、接続が READステートメントを許可する限り、ファイルに接続されている間にファイルからの読み取りを行います。定様式ストリーム・アクセス用に接続されたファイルのファイル記憶単位は、定様式ストリーム・アクセス入出力ステートメントによってのみ、読み取りまたは書き込みを行うことができます。

不定形式ストリーム・アクセス用に接続されたファイルの最初のファイル記憶単位の位置は 1 になります。後続の各記憶単位の位置の値は、直前の記憶単位よりも 1

244 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 271: IBM XL Fortran for Linux, V15.1

ずつ大きくなります。位置指定可能なファイルの読み取りまたは書き込みは、位置順に行う必要はありません。ファイル作成以降、記憶単位が書き込まれ、接続がREAD ステートメントを許可する限りファイルに接続されている間はファイルから記憶単位を読み取ることができます。不定形式ストリーム・アクセス用に接続されたファイルのファイル記憶単位は、ストリーム・アクセス入出力ステートメントによってのみ、読み取りまたは書き込みを行うことができます。

装置装置とは、外部ファイルを参照する手段です。プログラムは、入出力ステートメント内の装置指定子により指定した装置番号によって、外部ファイルを参照します。装置指定子の形式については、 [UNIT=] を参照してください。

装置の接続接続とは、外部ファイルと装置間の関連付けを示します。接続が行われてからでなければ、ファイルのレコードを読み取ることも、書き込むこともできません。

ファイルと装置を接続するには、次の 3 つの方法があります。

v 事前接続

v 暗黙接続

v OPEN ステートメントを使用した明示接続

事前接続事前接続は、プログラムの実行開始時に行われます。事前接続は、あらかじめOPEN ステートメントを実行しなくても、I/O ステートメントに指定することができます。 3 つの装置が、定様式順次アクセス用に、標準エラー装置、標準入力装置、および標準出力装置に事前定義されています。 ISO_FORTRAN_ENV モジュールの ERROR_UNIT、INPUT_UNIT、および OUTPUT_UNIT 定数を使用して、これらの装置を、I/O ステートメント内で参照することができます。

IBM 拡張

これらの装置は、以下の値を使用して直接参照することもできます。

v 装置 0 (標準エラー装置用)

v 装置 5 (標準入力装置用)

v 装置 6 (標準出力装置用)

事前接続された装置は、以下の例外を除いて、OPEN ステートメントのデフォルトの指定子値を使用します。

v STATUS='OLD'

v ACTION='READWRITE'

v FORM='FORMATTED'

IBM 拡張 の終り

第 9 章 XL Fortran の入出力 245

Page 272: IBM XL Fortran for Linux, V15.1

暗黙の接続 (IBM 拡張)暗黙接続が行われるのは、順次ステートメント (ENDFILE、 PRINT、READ、REWIND、または WRITE) が、外部ファイルにまだ接続されていない装置に対して実行された場合です。実行されるステートメントは、事前に決められた名前のファイルにその装置を接続します。デフォルトでは、この接続は、装置 n からファイル fort.n への接続になります。暗黙接続の場合、事前にファイルを作成する必要はありません。別のファイル名に暗黙接続する場合は、「XL Fortran コンパイラー・リファレンス」の『実行時オプションの設定』に記載されている UNIT_VARS 実行時オプションを参照してください。

暗黙接続の場合、装置 0 は指定できません。

事前接続装置は、その装置と外部ファイルとの間の接続を終了した場合にのみ暗黙的に接続できます。次の例では、事前接続された装置がクローズしてから、暗黙接続が行われています。

暗黙接続の例

PROGRAM TRYMEWRITE ( 6, 10 ) "Hello1" ! "Hello1" written to standard outputCLOSE ( 6 )WRITE ( 6, 10 ) "Hello2" ! "Hello2" written to fort.6

10 FORMAT (A)END

暗黙接続の装置は、FORM= 指定子および ASYNCH= 指定子を除き、OPEN ステートメントのデフォルトの指定子値を使用します。FORM= および ASYNCH= の値は、最初のデータ転送ステートメントによって決定されます。

最初の I/O ステートメントが形式指示、リスト指示、または、名前リスト形式設定を使用する場合、FORM= 指定子の値は、 FORMATTED に設定されます。不定形式 I/O ステートメントでは、この指定子は、 UNFORMATTED に設定されます。

最初の I/O ステートメントが非同期である場合、ASYNCH= 指定子が YES に設定されます。同期 I/O ステートメントの場合は、この指定子は、NO に設定されます。

切断ファイルは、CLOSE ステートメントによって装置から切断されます。切断されたファイルは、同一のプログラム内で、同じ装置に再接続することも、別の装置に再接続することも可能です。切断された装置についても、同一のプログラム内で、同じファイルに再接続することも、別のファイルに再接続することも可能です。

v 装置 0 はクローズできません。

v 装置 5 がクローズした後に、この装置を標準入力に再接続することはできません。

v 装置 6 がクローズした後に、この装置を標準出力に再接続することはできません。

246 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 273: IBM XL Fortran for Linux, V15.1

データ転送ステートメントREAD ステートメントは、外部または 内部ファイルからデータを取得し、そのデータを内部ストレージに転送します。入力リストを指定した場合、値はファイルから指定のデータ項目に転送されます。

WRITE ステートメントは、データを内部ストレージから外部または内部ファイルに転送します。

PRINT ステートメントは、データを内部ストレージから外部ファイルに転送します。 -qport=typestmt コンパイラー・オプションを指定すると、PRINT と同一の機能をサポートする TYPE ステートメントを使用できるようになります。出力リストと形式仕様を指定した場合、値は指定のデータ項目からファイルに転送されます。出力リストを指定しない場合、 PRINT ステートメントは、参照する FORMAT ステートメントの最初の指定に文字ストリング編集記述子またはスラッシュ編集記述子が含まれていない限り、ブランク・レコードを出力装置に転送します。最初の指定にそのような編集記述子がある場合は、その指定によって示されたレコードが、出力装置に転送されます。

存在しないファイルに対して WRITE または PRINT ステートメントを実行すると、エラーが発生しない限り、そのファイルが作成されます。

入出力項目がポインターの場合、データはファイルと関連ターゲットの間で転送されます。

入力項目または出力項目がポリモアフィックである場合、あるいはポインターまたは割り振り可能コンポーネントを持つ派生型である場合、その項目は、ユーザー定義の派生型入出力プロシージャーによって処理されなければなりません。

PAD= 指定子に NO の値が設定されたファイルからのアドバンス入力時、入力リストおよび形式仕様が、レコード内にある文字数を超える文字をレコードに要求してはなりません。 PAD= 指定子に YES の値が設定されている場合は、入力リストおよび形式仕様がレコード内にある文字数を超える文字を必要とする場合、ブランク文字が入れられます。

順次アクセス用に接続されたファイルに埋め込みを行いたい場合、-qxlf77=noblankpad コンパイラー・オプションを指定してください。また、このコンパイラー・オプションは、PAD= 指定子のデフォルト値を、直接ファイルおよびストリーム・ファイルについては NO に設定し、順次ファイルについてはYES に設定します。

PAD= 指定子に NO の値が設定されたファイルからの非アドバンス入力時、入力リストおよび形式仕様が、レコード内にある文字数を超える文字をレコードに要求すると、 レコード終了条件が発生することになります。 PAD= 指定子に YES の値が設定されている場合は、入力項目および対応するデータ編集記述子がレコード内にある文字数を超える文字を必要とする場合、レコード終了条件が発生し、ブランク文字が入れられます。レコードがストリーム・ファイルの最後のレコードの場合は、 ファイル終了条件が発生します。

第 9 章 XL Fortran の入出力 247

Page 274: IBM XL Fortran for Linux, V15.1

非同期入出力READ および WRITE データ転送ステートメントを指定して、非同期データ転送を開始することができます。データ転送の完了を待たずに、非同期 I/O ステートメントの後の実行が続行します。

データ転送ステートメントの ID= 変数に戻された値と同じ値 ID= と一致するWAIT ステートメントを実行すると、データ転送ステートメントの完了が検出されるか、またはデータ転送ステートメントの完了が待機されます。

非同期 I/O ステートメントの I/O 項目のデータ転送は、以下のタイミングで完了します。

v 非同期データ転送ステートメントの実行時

v 対応する WAIT ステートメントの実行の前の任意の時点

v 対応する WAIT ステートメント時

非同期データ転送ステートメントの実行中にデータ転送が完了しなければならない状況については、「XL Fortran 最適化およびプログラミング・ガイド」の『XL

Fortran 入出力のインプリメンテーションの詳細』を参照してください。

非同期データ転送ステートメントの実行時にエラーが発生すると、ID= 指定子に関連付けられた変数が未定義のままになります。 IOSTAT= 指定子は、入出力操作と制御の状況が、ERR= 指定子によって指定されたステートメントに転送されることを示します。

対応する WAIT ステートメントの実行までは、非同期データ転送ステートメントの入出力リストにある変数に関連付けられた変数または項目を参照、定義、または定義解除してはなりません。

非同期データ転送ステートメントと、対応する WAIT ステートメントとの間での、割り振り可能オブジェクトとポインターの割り振り解除およびポインターの関連付け状況の変更は許可されません。

同一の装置に対する複数の未処理データ転送操作を、READ およびWRITE の両方にすることができます。WAIT ステートメントは、ID= 指定子が省略された場合、指定された装置に対して保留になっているすべてのデータ転送を待機する待機操作を実行します。

直接アクセスの場合、非同期 WRITE ステートメントで、対応する WAIT ステートメントが実行されていない非同期 WRITE ステートメントと同じ装置とレコード番号の両方を指定してはなりません。 ストリーム・アクセスの場合、非同期 WRITE ステートメントで、対応する WAIT ステートメントが実行されていない非同期 WRITE ステートメントと同じ装置、およびファイル内の同じ位置のいずれも指定してはなりません。

プログラム内で、非同期データ転送ステートメントと、対応する WAIT ステートメントとの間で実行される部分では、そのデータ転送ステートメントの NUM= 指定子の integer_variable に関連する変数または項目を参照、定義、あるいは定義解除してはなりません。

非同期入出力の使用法

248 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 275: IBM XL Fortran for Linux, V15.1

SUBROUTINE COMPARE(ISTART, IEND, ISIZE, A)INTEGER, DIMENSION(ISIZE) :: AINTEGER I, ISTART, IEND, ISIZEDO I = ISTART, IEND

IF (A (I) /= I) THENPRINT *, "Expected ", I, ", got ", A(I)

END IFEND DOEND SUBROUTINE COMPARE

PROGRAM SAMPLEINTEGER, PARAMETER :: ISIZE = 1000000INTEGER, PARAMETER :: SECT1 = (ISIZE/2) - 1, SECT2 = ISIZE - 1INTEGER, DIMENSION(ISIZE), STATIC :: AINTEGER IDVAR

OPEN(10, STATUS="OLD", ACCESS="DIRECT", ASYNCH="YES", RECL=(ISIZE/2)*4)A = 0

! Reads in the first part of the array.

READ(10, REC=1) A(1:SECT1)

! Starts asynchronous read of the second part of the array.

READ(10,ID=IDVAR, REC=2) A(SECT1+1:SECT2)

! While the second asynchronous read is being performed,! do some processing here.

CALL COMPARE(1, SECT1, ISIZE, A)

WAIT(ID=IDVAR)

CALL COMPARE(SECT1+1, SECT2, ISIZE, A)END

アドバンス入出力および非アドバンス入出力アドバンス I/O は、エラー条件が発生しない限り、最後に読み取りまたは書き込みが行われたレコードの後にファイルを位置付けます。

非アドバンス I/O は、現行レコード内の文字位置、または後続のレコードにファイルを位置付けることができます。非アドバンス I/O を使用すると、それぞれがレコードの一部にアクセスする一連の I/O 文によって、ファイルのレコードの READまたは WRITE を行うことができます。また、可変長レコードを読み取り、そのレコードの長さを照会することもできます。

非アドバンス I/O

! Reads digits using nonadvancing input

INTEGER COUNTCHARACTER(1) DIGITOPEN (7)DOREAD (7,FMT="(A1)",ADVANCE="NO",EOR=100) DIGIT

COUNT = COUNT + 1IF ((ICHAR(DIGIT).LT.ICHAR('0')).OR.(ICHAR(DIGIT).GT.ICHAR('9'))) THEN

PRINT *,"Invalid character ", DIGIT, " at record position ",COUNTSTOP

END IFEND DO

100 PRINT *,"Number of digits in record = ", COUNT

第 9 章 XL Fortran の入出力 249

Page 276: IBM XL Fortran for Linux, V15.1

END

! When the contents of fort.7 is '1234¥n', the output is:

! Number of digits in record = 4

ユーザー定義の派生型入出力プロシージャー・インターフェース(Fortran 2003)

ユーザー定義の派生型入出力プロシージャーを使用すると、プログラムがデータ転送入出力ステートメントの派生型のオブジェクトおよび値のデフォルトの処理をオーバーライドできます。

ユーザー定義の派生型入出力プロシージャーは、dtio_generic_spec によってアクセス可能なプロシージャーです。特定のユーザー定義派生型入出力プロシージャーは、以下のいずれかの存在に従って選択されます。

1. 次の両方が設定された適切な総称インターフェース

a. データ転送の方向 (読み取りまたは書き込み) および形式 (定様式または不定形式) に適した dtio_generic_spec

b. dtv 引数が有効項目と互換性のある特定のインターフェース。dtv の詳細については、 194ページの『ユーザー定義の派生型入出力プロシージャー(Fortran 2003)』を参照してください。

2. 有効項目の宣言型に対する適切な総称バインディング

特定の派生型入出力プロシージャーが、上記のように選択されると、そのプロシージャーは、その有効範囲単位で実行された適切なデータ転送入出力ステートメントに対して呼び出されます。このプロシージャーによって、派生型入出力リスト項目の実際のデータ転送操作が制御されます。

派生型入出力リスト項目を含み、ユーザー定義の派生型入出力プロシージャーを呼び出すデータ転送ステートメントは、親データ転送ステートメントと呼ばれます。一方、親データ転送ステートメントの処理中に実行され、ユーザー定義の派生型入出力プロシージャーに渡される装置を指定するデータ転送ステートメントは、子データ転送ステートメントと呼ばれます。

子データ転送ステートメントの処理は、子データ転送ステートメントではないデータ転送ステートメントの処理と以下の点で異なります。

v 子データ転送ステートメントを実行しても、データ転送前のファイルの位置付けは行われません。

v 不定形式の子データ転送ステートメントでは、データ転送完了後にファイルの位置付けを行いません。

ユーザー定義の派生型入出力 (Fortran 2003)特定の派生型および特定の kind 型パラメーター値のセットに対しては、定様式入力、定様式出力、不定形式入力、および不定形式出力のそれぞれについて 1 つずつ、計 4 つの ユーザー定義の派生型入出力プロシージャーがあります。これら 4

つすべてのプロシージャーを指定する必要はありません。派生型入出力に使用されるプロシージャーは、インターフェース・ブロックまたは総称バインディングに

250 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 277: IBM XL Fortran for Linux, V15.1

dtio_generic_spec (dtio_generic_spec の値は 195ページの表 20に記載されています)

を設定することによって指定することができます。

親データ転送ステートメントがアクティブな間は、次の規則が適用されます。

v 親 READ ステートメントがアクティブな場合、入出力ステートメントは、仮引数 unit で指定された装置以外のいかなる外部装置からも読み取りを行わず、いかなる外部装置に対しても書き込みを行いません。

v 親 WRITE または PRINT ステートメントがアクティブな場合、入出力ステートメントは、仮引数 unit で指定された装置以外のいかなる外部装置に対しても書き込みを行わず、いかなる外部装置からも読み取りを行いません。

v 内部ファイルを指定するデータ転送ステートメントが認められています。

v OPEN、CLOSE、BACKSPACE、ENDFILE、および REWIND ステートメントは実行されません。

v ユーザー定義プロシージャー、およびそのプロシージャーが呼び出すあらゆるプロシージャーは、 dtv 引数による場合を除き、入出力リスト項目、対応する形式、またはアクティブな親データ転送ステートメント内の指定子によって参照されるストレージ・ロケーションを定義または定義解除することはできません。

次に記載するのは、ユーザー定義の派生型入出力プロシージャー・データ転送ステートメントに適用される追加規則です。

v プロシージャーは、それ自体が派生型の派生型コンポーネントの処理に、DT 編集記述子を指定した FORMAT を使用することができます。子データ転送ステートメントで、リスト指示または名前リスト入出力ステートメントになっているステートメントには、派生型のリスト項目を入れることができます。

v 子データ転送ステートメントは、データ転送前にファイルの位置付けを行わないため、親データ転送ステートメントが最後に処理した有効リスト項目またはレコード位置付け編集記述子によってファイルが位置付けられた場所からデータの転送を開始します。これは、必ずしもレコードの先頭ではありません。

v TL および TR など、子データ転送ステートメントによって unit に対して使用されるレコード位置付け編集記述子があっても、プロシージャーが呼び出されたときのレコードの位置より前にレコードの位置付けが行われることはありません。

v 親および子のデータ転送ステートメントを非同期にすることはできません。

v 子データ転送ステートメントについては、入出力制御リストに ID=、POS=、または REC= 指定子を指定することはできません。

例 1:

! Example of an elemental functionPROGRAM PINTERFACE

ELEMENTAL REAL FUNCTION LOGN(X,N)REAL, INTENT(IN) :: XINTEGER, INTENT(IN) :: N

END FUNCTION LOGNEND INTERFACE

REAL RES(100), VAL(100,100)...

第 9 章 XL Fortran の入出力 251

Page 278: IBM XL Fortran for Linux, V15.1

DO I=1,100RES(I) = MAXVAL( LOGN(VAL(I,:),2) )

END DO...

END PROGRAM P

例 2:

! Elemental procedure declared with a generic interfaceINTERFACE RAND

ELEMENTAL FUNCTION SCALAR_RAND(x)REAL, INTENT(IN) :: X

END FUNCTION SCALAR_RAND

FUNCTION VECTOR_RANDOM(x)REAL X(:)REAL VECTOR_RANDOM(SIZE(x))

END FUNCTION VECTOR_RANDOMEND INTERFACE RAND

REAL A(10,10), AA(10,10)

! The actual argument AA is a two-dimensional array. The procedure! taking AA as an argument is not declared in the interface block.! The specific procedure SCALAR_RAND is then called.

A = RAND(AA)

! The actual argument is a one-dimensional array section. The procedure! taking a one-dimensional array as an argument is declared in the! interface block. The specific procedure VECTOR_RANDOM is then called.! This is a non-elemental reference since VECTOR_RANDOM is not elemental.

A(:,1) = RAND(AA(6:10,2))END

データ転送が行われる前後のファイルの位置POSITION= 指定子を指定する順次またはストリーム I/O 用の明示接続 (OPEN ステートメントを使用する) の場合、ファイルを先頭、最後、または空いている位置に明示的に位置付けることができます。

OPEN ステートメントで、POSITION= 指定子が指定されていない場合は、次のようになります。

v STATUS= 指定子に値 NEW または SCRATCH がある場合、ファイルは先頭に位置付けられます。

IBM 拡張

v STATUS='OLD' に -qposition=appendold コンパイラー・オプションを付けて指定し、ファイル位置を変更する次の操作が WRITE ステートメントである場合、ファイルの位置は最後になります。これらの条件が満たされない場合、ファイル位置は先頭になります。

v STATUS='UNKNOWN' を -qposition=appendunknownコンパイラー・オプションを使用して指定し、次の操作が WRITE ステートメントである場合、ファイルの位置は最後になります。これらの条件が満たされない場合、ファイル位置は先頭になります。

暗黙 OPEN の後では、ファイル位置は以下のように先頭になります。

252 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 279: IBM XL Fortran for Linux, V15.1

v ファイルに対する最初の入出力操作が READ である場合、アプリケーションはファイルの最初のレコードを読み取ります。

v ファイルに対する最初の入出力操作が WRITE または PRINT である場合、アプリケーションは、ファイルの内容を削除し、最初のレコードに書き込みを行います。

IBM 拡張 の終り

REWIND ステートメントを使用してファイルを先頭に位置付けることができます。事前接続された装置 0、5、および 6 は、アプリケーションの親プロセスから渡されるときに位置付けられます。

データ転送が行われる前のファイルの位置は、アクセス方式の違いによって次のように異なります。

v 外部ファイルの順次アクセス:

– アドバンス入力の場合、ファイル位置は次のレコードの先頭になります。このレコードが現行レコードになります。

– アドバンス出力の場合、新しいレコードが作成され、それがファイルの最後のレコードになります。

v 内部ファイルの順次アクセス:

– ファイル位置は、ファイルの最初のレコードの先頭になります。このレコードが現行レコードになります。

v 直接アクセス:

– ファイル位置は、REC= 指定子によって示されたレコードの先頭になります。このレコードが現行レコードになります。

v ストリーム・アクセス:

– ファイル位置は、POS= 指定子が示すファイル記憶単位の直前になります。POS= 指定子がない場合は、ファイル位置は変更されません。

子データ転送ステートメントのファイルの位置付けは、子データ転送ステートメントではないデータ転送ステートメントの処理と以下の点で異なります。

v 子データ転送ステートメントを実行しても、データ転送前のファイルの位置付けは行われません。

v 不定形式の子データ転送ステートメントでは、データ転送完了後にファイルの位置付けを行いません。

アドバンス I/O データ転送の後のファイル位置は、次のとおりです。

v ファイル終了レコードを読み取った結果として、ファイル終了条件が存在する場合は、終了レコードを超えた位置。

v エラー条件またはファイル終了条件が存在しない場合は、最後に読み取りまたは書き込みが行われたレコードを超えた位置。その最後のレコードが先行レコードになります。順次アクセスまたは定様式ストリーム・アクセス用に接続されたファイルに書き込まれたレコードは、ファイルの最後のレコードになります。

非アドバンス入力の後のファイル位置は、次のとおりです。

第 9 章 XL Fortran の入出力 253

Page 280: IBM XL Fortran for Linux, V15.1

v エラー条件またはファイル終了条件が発生せずに、レコード終了条件が発生した場合、ファイル位置は読み取られたレコードの直後になります。

v 非アドバンス入力ステートメントで、エラー条件、ファイル終了条件、レコード終了条件のいずれも発生しなかった場合、ファイルの位置は変更されません。

v 非アドバンス出力ステートメントで、エラー条件が発生しなかった場合、ファイルの位置は変更されません。

v これ以外のすべての場合では、ファイル位置は読み取りまたは書き込みが行われたレコードの直後になり、そのレコードが先行レコードになります。

ファイル終了レコードを超えた位置にファイルがある場合、 READ、WRITE、PRINT、および ENDFILE ステートメントは、コンパイラー・オプション-qxlf77=softeof が設定されていない場合は実行できません。 BACKSPACE またはREWIND ステートメントを使用すれば、ファイル位置を変更できます。

-qxlf77=softeof オプションを使用すれば、ファイルの終わりを超えた位置での読み取り、書き込みができるようになります。

エラーのない定様式ストリーム出力については、ステートメントによってデータが転送された先の最も大きな値の位置にファイルの終端点が設定されます。エラーのない不定形式ストリーム出力については、ファイル位置は変更されません。ファイル位置がファイルの前の終端点を超えると、終端点はファイル位置に設定されます。POS= 指定子で空の出力リストを指定すれば、データを書き込まずにファイルの終端点を拡張できます。データ転送後にエラーが発生した場合、ファイル位置は不確定になります。

条件および IOSTAT 値IOSTAT 値は、入出力ステートメントの実行時にファイル終了条件、 レコード終了条件、またはエラー条件が発生した場合に、IOSTAT= 指定子の変数に割り当てられる値です。IOSTAT= 指定子は、以下のタイプのエラー条件を報告します。入力ステートメントまたは出力ステートメントが成功すると、IOSTAT 値は 0 (ゼロ)

になります。

v 致命的

v 重大

v 回復可能

v 変換

v 言語

レコード終了条件アプリケーションは、IOSTAT= 指定子を指定してレコード終了条件を検出した場合、IOSTAT= 指定子により指定された変数の値を -4 に設定し、EOR= ラベルがある場合には、そのラベルに分岐します。I/O ステートメントに IOSTAT= およびEOR= 指定子がない場合に、アプリケーションがレコード終了条件を検出すると、アプリケーションは停止します。

254 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 281: IBM XL Fortran for Linux, V15.1

表 22. レコード終了条件の IOSTAT 値

IOSTAT 値 レコード終了条件の内容

-4 内部または外部ファイルの非アドバンス、形式指示 READ で検出されたレコードの終わり

ファイル終了条件以下の場合、ファイル終了条件が発生する可能性があります。

v 入力ステートメントの実行開始時

v 入力リストと形式の相互処理で複数のレコードを必要とする定様式入力ステートメントの実行時

v ストリーム入力ステートメントの実行時

v 順次アクセス用に接続されたファイルの読み取り中にファイル終了レコードが検出された場合

v 内部ファイルの終わりを超えてレコードの読み取りを行おうとした場合

ストリーム・アクセスの場合、ファイルの終わりを超えて読み取りを行おうとすると、ファイル終了条件が発生します。ファイル終了条件は、定様式アクセス用に接続されたストリーム・ファイルの最終レコードを超えて読み取りを行おうとした場合にも発生します。

入力ステートメントに IOSTAT= および END= 指定子がある場合、ファイル終了条件により、IOSTAT= 指定子が以下の定義された値のいずれかに設定され、ファイル終了条件は END= ラベルに分岐します。IOSTAT= および END= 指定子が入力ステートメントにない場合にファイル終了条件が検出されると、プログラムは停止します。

表 23. ファイル終了条件の IOSTAT 値

IOSTAT 値 ファイル終了条件の内容

-1 外部ファイルの順次またはストリーム READ

でファイルの終わりが検出された、または直接アクセス読み取りで END= が指定されているが、レコードが存在しない。

-1�1� 内部ファイルの READ でファイルの終わりが検出された。

-2 内部ファイルの READ でファイルの終わりが検出された。

注:

�1� Fortran 2003。詳しくは、IOSTAT_END 実行時オプションを参照してください。

エラー条件

致命的エラー致命的エラーは、ランタイム・システム内で検出されるシステム・レベルのエラーで、このエラーが発生すると、プログラムの実行が継続できなくなります。致命的エラーが発生すると、短い (翻訳されていない) メッセージが装置 0 に書き込ま

第 9 章 XL Fortran の入出力 255

Page 282: IBM XL Fortran for Linux, V15.1

れ、その後に、C ライブラリー・ルーチン abort() に対する呼び出しが行われます。メモリー・ダンプの結果は、実行環境がどのように構成されているかによって異なります。

重大エラー重大エラーは、ERR_RECOVERY 実行時オプションの値を YES に指定していた場合でも、回復させることはできません。入出力ステートメントに IOSTAT= およびERR 指定子がある場合、重大エラーにより、IOSTAT= 指定子が以下の定義された値のいずれかに設定され、ERR= ラベルが分岐します。 IOSTAT= および ERR 指定子が入出力ステートメントにない場合に重大エラー条件が検出されると、プログラムは停止します。

表 24. 重大エラー条件の IOSTAT 値

IOSTAT 値 エラーの内容

1 END= が直接アクセス READ に指定されておらず、レコードが存在しない。

2 内部ファイルの WRITE でファイルの終わりが検出された。

6 ファイルが見つからないが、STATUS='OLD'

が OPEN ステートメントに指定されている。

10 直接ファイルで読み取りエラーが発生した。

11 直接ファイルで書き込みエラーが発生した。

12 順次ファイルまたはストリーム・ファイルで読み取りエラーが発生した。

13 順次ファイルまたはストリーム・ファイルで書き込みエラーが発生した。

14 ファイルを開くときにエラーが発生した。

15 ファイルで永続的な I/O エラーが検出された。

37 動的なメモリー割り振りの失敗 - メモリー不足。

38 REWIND エラー。

39 ENDFILE エラー。

40 BACKSPACE エラー。

107 ファイルが存在するのに STATUS='NEW' がOPEN ステートメントに指定されている。

119 磁気テープ装置に接続された装置で、BACKSPACE ステートメントを実行しようとした。

122 直接アクセス READ 時に不完全なレコードが検出された。

130 パイプに接続するための OPEN ステートメントに ACTION='READWRITE' が指定された。

256 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 283: IBM XL Fortran for Linux, V15.1

表 24. 重大エラー条件の IOSTAT 値 (続き)

IOSTAT 値 エラーの内容

135 ユーザー・プログラムが、サポートされないバージョンの XL Fortran ランタイム環境を呼び出している。

139 ACTION= 指定子に正しい値を使ってファイルが開かれなかったため、 I/O 操作が装置上で許可されなかった。

142 CLOSE エラー。

144 エラー。

152 順次アクセスしかできないファイルに対して、ACCESS='DIRECT' が OPEN ステートメントに指定された。

153 POSITION='REWIND' またはPOSITION='APPEND' が OPEN ステートメントで指定されたが、ファイルがパイプである。

156 OPEN ステートメントで RECL= 指定子に無効な値が指定された。

159 関連するデバイスが見つからないため、外部ファイル入力をフラッシュできなかった。

165 読み取りまたは書き込みが可能な次のレコードのレコード番号が、INQUIRE ステートメントの NEXTREC= 指定子で指定された変数の範囲外である。

169 装置は同期 I/O 専用で接続されているため、非同期 I/O ステートメントを完了できない。

172 ファイルが非同期 I/O 不可であるため、接続に失敗した。

173 非同期 WRITE ステートメントが同じ装置を待って保留中に非同期 READ ステートメントが実行されたか、または非同期 READ ステートメントが同じ装置を待って保留中に非同期 WRITE ステートメントが実行された。

174 前の非同期 I/O ステートメントが完了していないため、同期 I/O ステートメントを完了できない。

175 ID= 指定子の値が無効であるため、WAIT ステートメントを完了できない。

176 対応する非同期 I/O ステートメントが別の有効範囲単位内にあるため、 WAIT ステートメントを完了できない。

178 同じレコードの前の非同期直接 WRITE ステートメントがまだ完了していないため、レコードの非同期の直接 WRITE ステートメントが実行できない。

第 9 章 XL Fortran の入出力 257

Page 284: IBM XL Fortran for Linux, V15.1

表 24. 重大エラー条件の IOSTAT 値 (続き)

IOSTAT 値 エラーの内容

179 装置上に未完了の非同期 I/O 操作があるため、その装置で I/O 操作ができない。

181 複数接続は同期 I/O にしか許可されないため、ファイルを装置に接続できない。

182 UWIDTH= オプションの値が無効。この値は、32 または 64 でなければならない。

183 装置の最大レコード長が、INQUIRE ステートメントの RECL= 指定子で指定されたスカラー変数の範囲外になっている。

184 送信データのバイト数が、I/O ステートメントの SIZE= または NUM= 指定子で指定されたスカラー変数の範囲外になっている。

185 同じファイルを UWIDTH 値が異なる 2 つの装置には接続できない。

186 装置番号は、0 から 2,147,483,647 の範囲内である必要があります。

192 ファイル位置の値が、INQUIRE ステートメントの POS= 指定子で指定されたスカラー変数の範囲外になっている。

193 ファイル・サイズの値が、INQUIRE ステートメントの SIZE= 指定子で指定されたスカラー変数の範囲外になっている。

200 FLUSH エラー。

201 FLUSH ステートメントに指定された装置は、シークできないファイルに接続されている。

回復可能エラー回復可能エラーは、回復できるエラーのことです。入出力ステートメントにIOSTAT= 指定子および ERR= ラベルがある場合、回復可能エラーが発生すると、IOSTAT= 指定子が以下に定義された値のいずれかに設定され、ERR= ラベルが分岐します。IOSTAT= および ERR= 指定子が入出力ステートメントにない場合にERR_RECOVERY 実行時オプションが YES に設定されていると、回復処理が行われ、プログラムが継続します。IOSTAT= および ERR= 指定子が入出力ステートメントになく、ERR_RECOVERY 実行時オプションが NO に設定されていると、プログラムは停止します。

表 25. 回復可能エラー条件の IOSTAT 値

IOSTAT 値 エラーの内容

16 直接 I/O の REC= 指定子の値が無効。

17 直接ファイルで I/O ステートメントが許可されない。

18 未接続の装置に対して直接 I/O ステートメントが実行された。

258 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 285: IBM XL Fortran for Linux, V15.1

表 25. 回復可能エラー条件の IOSTAT 値 (続き)

IOSTAT 値 エラーの内容

19 定様式ファイルに対して不定形式入出力を行おうとした。

20 不定形式ファイルに対して定様式入出力を行おうとした。

21 直接ファイルに対して順次入出力またはストリーム入出力を行おうとした。

22 順次ファイルまたはストリーム・ファイルに対して直接入出力を行おうとした。

23 既に別の装置に接続済みのファイルに接続しようとした。

24 OPEN 指定子が、接続されたファイルの属性と一致しない。

25 直接ファイルについて、OPEN ステートメントで RECL= 指定子が省略された。

26 OPEN ステートメントの RECL= 指定子が負の値になっている。

27 OPEN ステートメントの ACCESS= 指定子が無効。

28 OPEN ステートメントの FORM= 指定子が無効。

29 OPEN ステートメントの STATUS= 指定子が無効。

30 OPEN ステートメントの BLANK= 指定子が無効。

31 OPEN または INQUIRE ステートメントのFILE= 指定子が無効。

32 STATUS='SCRATCH' および FILE= 指定子が同一の OPEN ステートメントに指定された。

33 ファイルが STATUS='SCRATCH' で開かれたときに、STATUS='KEEP' が CLOSE ステートメントに指定された。

34 CLOSE ステートメントの STATUS= 指定子の値が無効。

36 I/O ステートメントに無効な装置番号が指定された。

47 名前リスト入力項目が、ランクがゼロではない 1 つ以上のコンポーネントで指定された。

48 名前リスト入力項目で、ゼロ・サイズの配列が指定された。

58 形式指定エラー。

93 I/O ステートメントは、エラー装置 (装置 0)

に対しては許可されない。

第 9 章 XL Fortran の入出力 259

Page 286: IBM XL Fortran for Linux, V15.1

表 25. 回復可能エラー条件の IOSTAT 値 (続き)

IOSTAT 値 エラーの内容

110 定様式 I/O のデータ項目で、無効な編集記述子が使用された。

120 NLWIDTH の設定値がレコードの長さを超えた。

125 不定形式ファイルの OPEN ステートメントに BLANK= 指定子が指定された。

127 直接ファイルの OPEN ステートメントで、POSITION= 指定子が指定された。

128 OPEN ステートメントの POSITION= 指定子の値が無効。

129 OPEN ステートメントの ACTION= 指定子の値が無効。

131 不定形式ファイルの OPEN ステートメントに DELIM= 指定子が指定された。

132 OPEN ステートメントの DELIM= 指定子の値が無効。

133 不定形式ファイルの OPEN ステートメントに PAD= 指定子が指定された。

134 OPEN ステートメントの PAD= 指定子の値が無効。

136 READ ステートメントの ADVANCE= 指定子の値が無効。

137 SIZE= が READ ステートメントに指定されているのに、ADVANCE='NO' が指定されていない。

138 EOR= が READ ステートメントに指定されているのに、ADVANCE='NO' が指定されていない。

145 ファイルがファイル終了レコードの後に位置付けられているときに、READ またはWRITE を実行しようとした。

163 非ランダム・アクセス装置上にあるファイルへの複数接続は許可されない。

164 ACTION='WRITE' またはACTION='READWRITE' を指定した複数の接続は許可されない。

170 OPEN ステートメントの ASYNCH= 指定子の値が無効。

171 FORM= 指定子が FORMATTED に設定されているため、OPEN ステートメントに指定された ASYNCH= 指定子は無効。

177 未完了の非同期 I/O 操作があるのに、装置がクローズされた。

260 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 287: IBM XL Fortran for Linux, V15.1

表 25. 回復可能エラー条件の IOSTAT 値 (続き)

IOSTAT 値 エラーの内容

191 ACCESS='STREAM' の OPEN ステートメントに RECL= 指定子が指定されている。

194 BACKSPACE ステートメントが、不定形式ストリーム I/O 用に接続された装置を指定した。

195 I/O ステートメントの POS= 指定子が 1 よりも小さい。

196�1� ストリーム・アクセス用に装置が接続されていないため、その装置に対してストリームI/O ステートメントを実行できない。

197 I/O ステートメントの POS= 指定子が、シークできないファイルに接続されている装置に対して指定された。

198 未接続の装置に対してストリーム I/O ステートメントが実行された。

202�1� ID=、POS=、または REC= 指定子は、子のREAD または WRITE ステートメントに対しては許可されない。

203�1� 子の READ または WRITE ステートメントに、親ステートメントの装置番号と一致しない装置番号が指定された。

204�1� 親ステートメントが READ または WRITE

ステートメントでないため、子の READ または WRITE ステートメントは許可されない。

205 ユーザー定義の派生型 I/O プロシージャーでIOSTAT 変数が設定されているが、親ステートメントで IOSTAT= が指定されていない。

209 READ ステートメントの BLANK= 指定子の値が正しくない。

210 READ ステートメントの指定子の値に正しくないものがある。

211 WRITE ステートメントの DELIM= 指定子の値が正しくない。

212�1� 定様式 READ または WRITE ステートメントのデータ項目は、DT 編集記述子によって処理される必要があるが、そのようになっていない。READ または WRITE ステートメントは無視された。

213 NAMELIST 項目名が NAMELIST READ ステートメントによって検出されたが、その後に等号 ('=') が指定されていなかった。

214 内部 WRITE ステートメントの DELIM= 指定子の値が正しくない。

第 9 章 XL Fortran の入出力 261

Page 288: IBM XL Fortran for Linux, V15.1

表 25. 回復可能エラー条件の IOSTAT 値 (続き)

IOSTAT 値 エラーの内容

215 WRITE ステートメントの SIGN= 指定子の値が、外部ファイルに対して無効。

216 WRITE ステートメントの SIGN= 指定子の値が、内部ファイルに対して無効。

217 不定形式ファイルの OPEN ステートメントに SIGN= 指定子が指定された。

218 OPEN ステートメントの SIGN 指定子の値が無効。

219 DECIMAL= 指定子が外部ファイルに対して無効。

220 DECIMAL= 指定子が内部ファイルに対して無効。

221 不定形式の I/O ステートメントにDECIMAL= 指定子が使用された。

222 ROUND= 指定子が、FORM='UNFORMATTED' の OPEN ステートメント内に指定された。

223 I/O ステートメントの ROUND= 指定子の値が正しくない。

224 ID= 指定子で指定された未処理の非同期データ転送がない。

225 OPEN ステートメントの指定子の値に正しくないものがある。

226 未処理の非同期データ転送が指定されていない。

227 非同期データ転送エラーが、指定された装置に関連付けられていない。

228 UFMT_BIGENDIAN オプションが定様式 I/O

用に接続された装置に対して指定された。

229 DT 編集記述子の v-list に想定外の文字が含まれている。

230 DT 編集記述子の v-list に想定外の印刷不能文字が含まれている。

231 非同期データ転送エラーが、指定されたファイルに関連付けられていない。

232 使用可能な OpenMP スレッド番号がない。

233 BACKSPACE が、読み取りアクセスのない装置に対して実行された。

235 不定形式ファイルの OPEN ステートメントに ENCODING= 指定子が使用された。

236 OPEN ステートメントの ENCODING= 指定子の値が誤りである。

262 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 289: IBM XL Fortran for Linux, V15.1

表 25. 回復可能エラー条件の IOSTAT 値 (続き)

IOSTAT 値 エラーの内容

240�2� OPEN ステートメントの NEWUNIT= 指定子で、FILE= が欠落しているか、STATUS= に値「SCRATCH」が指定されていない。

242 CONVERT= 指定子に対して無効な値が指定された。プログラムは CONVERT= 指定子を無視することによって回復する。

243 CONVERT= 指定子を含む OPEN ステートメントが定様式データ・ファイルに接続されている。回復するには、CONVERT= 指定子を無視する。

注:

1. Fortran 2003

2. Fortran 2008

変換エラー変換エラーは、データが無効な場合、または、データ転送ステートメントでデータの長さが正しくない場合にその結果として発生します。入出力ステートメントにIOSTAT= および ERR ラベルがあり、 CNVERR オプションが YES に設定されている場合、変換エラーにより、IOSTAT= 指定子が以下の定義された値のいずれかに設定され、ERR= ラベルが分岐します。 IOSTAT= および ERR= 指定子が入出力ステートメントにない場合に CNVERR オプションと ERR_RECOVERY オプションが共に YES に設定されていると、回復処理が行われ、プログラムが継続します。 IOSTAT= および ERR= 指定子が入出力ステートメントにない場合にCNVERR オプションが YES に、 ERR_RECOVERY オプションが NO に設定されていると、プログラムは停止します。 CNVERR が NO に設定されている場合は、ERR= ラベルには分岐せず、以下に示すように IOSTAT= 指定子が設定される場合があります。

表 26. 変換エラー条件の IOSTAT 値

IOSTAT 値 エラーの内容

CNVERR=NO

の場合のIOSTAT の設

3 不定形式ファイルでレコードの終わりが検出された。 no

4 アドバンス I/O を使用する定様式外部ファイルでレコードの終わりが検出された。

no

5 内部ファイルでレコードの終わりが検出された。 no

7 外部ファイルで誤った形式のリスト指示入力が検出された。

yes

8 内部ファイルで誤った形式のリスト指示入力が検出された。

yes

9 内部ファイルに対してリスト指示または NAMELIST データ項目が長すぎる。

yes

41 外部ファイルに有効な論理入力が見つからなかった。 no

第 9 章 XL Fortran の入出力 263

Page 290: IBM XL Fortran for Linux, V15.1

表 26. 変換エラー条件の IOSTAT 値 (続き)

IOSTAT 値 エラーの内容

CNVERR=NO

の場合のIOSTAT の設

42 内部ファイルに有効な論理入力が見つからなかった。 no

43 外部ファイルで、リスト指示または NAMELIST 入力を使用した複素数値が想定されていたが、値が検出されなかった。

no

44 内部ファイルで、リスト指示または NAMELIST 入力を使用した複素数値が想定されていたが、値が検出されなかった。

no

45 NAMELIST 入力で NAMELIST 項目名が指定されたが、派生型コンポーネント名が不明または誤っていた。

no

46 NAMELIST 入力で NAMELIST 項目名が指定されたが、サブストリング範囲が無効だった。

no

49 リスト指示または名前リスト入力に、区切り文字で区切られた無効な文字ストリングが含まれていた。

no

56 B、O、または Z 形式の編集記述子の入力に、無効な数字が検出された。

no

84 外部ファイルに NAMELIST グループ・ヘッダーが見つからなかった。

yes

85 内部ファイルに NAMELIST グループ・ヘッダーが見つからなかった。

yes

86 外部ファイルに無効な NAMELIST 入力値が検出された。 no

87 内部ファイルに無効な NAMELIST 入力値が検出された。 no

88 NAMELIST 入力に無効な名前が検出された。 no

90 入力の NAMELIST グループまたは項目名に無効文字が検出された。

no

91 NAMELIST の入力構文が無効。 no

92 入力の NAMELIST 項目に無効な添え字リストが検出された。

no

94 外部ファイルのリスト指示または NAMELIST 入力に対して無効な繰り返し指定子が指定された。

no

95 内部ファイルのリスト指示または NAMELIST 入力に対して無効な繰り返し指定子が指定された。

no

96 入力の整数がオーバーフローした。 no

97 入力に無効な 10 進数が検出された。 no

98 B、O、または Z 形式の編集記述子に対する入力が長すぎる。

no

121 NAMELIST 項目名または NAMELIST グループ名の出力長が、最大レコード長または NLWIDTH オプションで指定した出力幅よりも長い。

yes

264 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 291: IBM XL Fortran for Linux, V15.1

Fortran 90、95、2003、および 2008 標準の言語エラーFortran 90 標準の言語エラー

Fortran 90 言語エラーは、コンパイル時に検出できない Fortran 90 言語に対して、XL Fortran の拡張機能を使用することによって起こります。Fortran 90 言語エラーは、LANGLVL 実行時オプションに値 90STD が指定され、 ERR_RECOVERY 実行時オプションが設定されていないか、NO に設定されている場合、重大エラーと見なされます。LANGLVL=90STD および ERR_RECOVERY=YES が共に指定されている場合は、回復可能エラーと見なされます。LANGLVL= EXTENDED が指定されている場合は、このエラー条件はエラーとは見なされません。

Fortran 95 標準の言語エラー

Fortran 95 言語エラーは、コンパイル時に検出できない Fortran 95 言語に対して、XL Fortran の拡張機能を使用することによって起こります。Fortran 95 言語エラーは、LANGLVL 実行時オプションに値 95STD が指定され、 ERR_RECOVERY 実行時オプションが設定されていないか、NO に設定されている場合、重大エラーと見なされます。LANGLVL=95STD および ERR_RECOVERY=YES が共に指定されている場合は、回復可能エラーと見なされます。LANGLVL= EXTENDED が指定されている場合は、このエラー条件はエラーとは見なされません。

Fortran 2003 標準の言語エラー

Fortran 2003 標準 言語エラーは、コンパイル時に検出できない Fortran 2003 言語標準に対して、 XL Fortran の拡張機能を使用することによって起こります。Fortran

2003 言語エラーは、LANGLVL 実行時オプションに値 2003STD が指定され、ERR_RECOVERY 実行時オプションが設定されていないか、NO に設定されている場合、重大エラーと見なされます。LANGLVL=2003STD およびERR_RECOVERY=YES が共に指定されている場合は、回復可能エラーと見なされます。LANGLVL= EXTENDED が指定されている場合は、このエラー条件はエラーとは見なされません。

Fortran 2008 標準の言語エラー

Fortran 2008 標準 言語エラーは、コンパイル時に検出できない Fortran 2008 言語標準に対して、 XL Fortran の拡張機能を使用することによって起こります。Fortran

2008 言語エラーは、LANGLVL 実行時オプションに値 2008STD が指定され、ERR_RECOVERY 実行時オプションが設定されていないか、NO に設定されている場合、重大エラーと見なされます。LANGLVL=2008STD およびERR_RECOVERY=YES が共に指定されている場合は、回復可能エラーと見なされます。LANGLVL= EXTENDED が指定されている場合は、このエラー条件はエラーとは見なされません。

表 27. Fortran 90、95、2003、および 2008 標準の言語エラー条件に対する IOSTAT の値

IOSTAT 値 エラーの内容

53 定様式 I/O での編集記述子と項目タイプの不一致。

58 形式指定エラー。

第 9 章 XL Fortran の入出力 265

Page 292: IBM XL Fortran for Linux, V15.1

表 27. Fortran 90、95、2003、および 2008 標準の言語エラー条件に対する IOSTAT の値(続き)

IOSTAT 値 エラーの内容

140 I/O ステートメントを実行しようとしたが、装置が接続されていない。これは、READ、WRITE、PRINT、REWIND、およびENDFILE の場合のみに該当する。

141 REWIND または BACKSPACE が間にないにもかかわらず、装置に対して 2 つのENDFILE ステートメントがある。

151 OPEN ステートメントで、FILE= 指定子がなく、かつ STATUS= 指定子が 'SCRATCH' の値になっていない。

187 NAMELIST コメントは、Fortran 90 標準では許可されない。

199 Fortran 90 または Fortran 95 の場合、STREAM は OPEN ステートメントのACCESS= 指定子の値としては無効。

266 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 293: IBM XL Fortran for Linux, V15.1

第 10 章 入出力の形式設定

定様式の READ、WRITE、および PRINT データ転送ステートメントでは、形式設定情報を使用して、内部データ表現と定様式レコード内の文字表現との間の変換を指示します。この変換処理は編集と呼ばれますが、形式設定タイプを使用して制御することができます。次の形式設定とアクセス・タイプ の表に、各形式設定タイプをサポートするアクセス・タイプが記載されています。

表 28. 形式設定とアクセス・タイプ

形式設定タイプ アクセス・タイプ

形式指示 順次、直接、およびストリーム

リスト指示 順次およびストリーム

名前リスト 順次およびストリーム

編集は、レコード内のすべてのフィールドで行われます。フィールドはレコードの一部で、形式制御でデータまたは文字ストリング編集記述子を処理するときに入力で読み取られ、出力で書き込まれます。フィールド幅は、文字数で示したフィールドのサイズです。

形式指示の形式設定形式指示の形式設定では、形式仕様で編集記述子を使用して編集を制御できます。形式仕様は、FORMAT ステートメントで指定するか、あるいは、データ転送ステートメントの文字配列または文字式の値として指定します。編集記述子を使用すると、次のように編集を制御できます。

v データ編集記述子では、データ型ごとの編集を指定できます。

v 制御編集記述子は、編集プロセス自体を制御します。

v 文字ストリング編集記述子は、ストリング出力を制御します。

複素数編集複素数の値を編集するには、1 対のデータ編集記述子を使用して、複素数編集を指定する必要があります。複素数値は、1 対の異なる実数コンポーネントからなる値です。複素数編集を指定すると、最初の編集記述子は、数値の実数部に適用されます。2 番目の編集記述子は、数値の虚数部に適用されます。

複素数編集の対に対して異なる編集記述子を指定し、その対の編集記述子間で 1 つ以上の制御編集記述子を使用できます。その対の編集記述子間に、データ編集記述子を指定することはできません。

データ編集記述子データ編集記述子では、データ型ごとの編集を指定できます。これらの記述子を使用すれば、文字、数値、論理、および派生型のデータを編集することができます。

© Copyright IBM Corp. 1996, 2015 267

Page 294: IBM XL Fortran for Linux, V15.1

以下に示すデータ編集記述子 の表は、すべての文字、文字ストリング、数値、論理、および派生型の編集記述子の全リストを示しています。数値データは、整数、実数、および複素数値を示しています。

表 29. データ編集記述子

形式 使途

A

Aw

文字値を編集します。

Bw

Bw.m

2 進値を編集します。

DT •

DTchar-literal-constant •

DT(v-list) •

DTchar-literal-constant(v-list) •

派生型の項目を編集します。派生型の項目のデフォルト入出力形式設定に代えて、プロシージャーを使用することができます。

Ew.d

Ew.dEe

Ew.dDe *

Ew.dQe *

Dw.d

ENw.d

ENw.dEe

ESw.d

ESw.dEe

Qw.d *

指数付きの実数および複素数を編集します。

Fw.d 指数なしの実数および複素数を編集します。

Gw.d

Gw.dEe

Gw.dDe *

Gw.dQe *

データの型に出力形式を適用し、組み込み型のデータ・フィールドを編集します。また、データの型が実数の場合、データの絶対値を編集します。

Iw

Iw.m

整数を編集します。

Lw 論理値を編集します。

Ow

Ow.m

8 進値を編集します。

Q * 入力レコード * 内に残っている文字数のカウントを戻します。

Zw

Zw.m

16 進値を編集します。

ここで、

268 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 295: IBM XL Fortran for Linux, V15.1

char-literal-constant

kind パラメーターを指定できない DT 編集記述子内に文字リテラル定数を指定します。

v Fortran 2003

* IBM 拡張を指定します。

d 小数点以下の桁数を指定します。

e 指数フィールド内の桁数を指定します。

m 印刷する桁数を指定します。

n リテラル・フィールド内の文字数を指定します。ブランクも文字カウントに含まれます。

v-listkind パラメーターの同じ整数リテラル定数のコンマ区切りリストです。

w 正の値で、すべてのブランクを含むフィールド幅を指定します。

B、F、 I、O、または、 Z を指定する場合、出力の編集記述子および w

の値はゼロにできます。

データ編集記述子および修飾子に関する規則kind 型パラメーターを指定してはなりません。

編集記述子修飾子は、符号なし整数のリテラル定数でなければなりません。

IBM 拡張

w、m、d、および e 修飾子の場合、スカラー整数式は、不等号括弧 (< および >)

で囲む必要があります。詳しくは、 418ページの『変数形式設定式 (IBM 拡張)』を参照してください。

注:

Q データ編集記述子には 2 つのタイプがあります。

拡張精度 QQw.d という構文の Q 編集記述子。

文字カウント QQ という構文の Q 編集記述子。

IBM 拡張 の終り

入力の数値編集記述子に関する規則先行ブランクは無視されます。その他のブランクの解釈は、OPEN または READステートメントの BLANK= 指定子、および BN、BZ の 2 つの編集記述子によって制御できます。すべてブランクのフィールドは、ゼロと見なされます。

正符号の指定はオプションですが、B、 O、Z 編集記述子には、正符号を指定できません。

第 10 章 入出力の形式設定 269

Page 296: IBM XL Fortran for Linux, V15.1

F、E、 EN、ES、 D、G、および拡張精度 Q 編集では、入力フィールド内にある小数点は、小数点位置を指定する編集記述子の部分をオーバーライドします。フィールドには、内部的に表現できる桁数を超える桁を入れることができます。

IEEE 例外値の入力

実数および複素数編集の場合、XL Fortran では、IEEE 例外値を入力できるようになりました。 Fortran 2003 標準では、XL Fortran でサポートされるようになったIEEE NaN (Not-a-Number: 非数値 ) および IEEE 無限大に対する値のセット、および XL Fortran に固有の別の IEEE NaN 値のセットを指定できます。実数および複素数編集での IEEE 例外値の入力は、実数または複素数編集記述子のフィールド幅によって調整されます。入力時の IEEE 例外値は、大文字と小文字の区別はありません。IEEE 例外値の入力は、F、E、EN、 ES、D、 G、および Q 編集記述子でサポートされます。

Fortran 2003 標準では、IEEE 無限大の値として、「INF」、「+INF」、「-INF」、「INFINITY」、「+INFINITY」、または「-INFINITY」を使用できます。これらの値の前後には、ブランクを入れることができます。

Fortran 2003 標準では、IEEE NaN の値として、「NAN」、「+NAN」、または、「-NAN」を使用できます。XL Fortran では、「NAN」の前に符号を付けても、有効な意味を持ちません。これらの値の前後にも、ブランクを入れることができます。また、IEEE NaN の直後にゼロ個以上の文字を括弧に入れて指定することもできます。括弧は、静止 NaN または信号 NaN を示す場合に使用されます。「NAN」または「NAN()」とだけ指定された場合は、静止 NaN と解釈されます。「NAN(Q)」は静止 NaN、「NAN(S)」は信号 NaN と解釈されます。その他括弧内に指定された英数字は、有効な意味を持たず、デフォルトでは静止 NaN と解釈されます。

IBM 拡張として、XL Fortran では、IEEE NaN の値として、「NANQ」または「NANS」を使用できます。これらの例外的な値では、大/小文字が区別されません。「NANQ」は静止 NaN、「NANS」は信号 NaN と解釈されます。この形式のIEEE NaN が使用できるのは、実行時オプション、「langlvl」を「extended」に設定した場合に限られます。

出力の数値データ編集記述子に関する規則フィールド内の文字は、右寄せになります。

フィールドの文字数がフィールド幅より少ない場合、残りのフィールド・スペースは先行ブランクで埋められます。

フィールドの文字数がフィールド幅を超える場合、または指数が指定した幅を超える場合、フィールド・スペース全体がアスタリスクで埋められます。

負符号は、負の値の接頭部になります。正の値、またはゼロの値の場合は、S、SP、または SS 編集記述子を指定しない限り、出力で正符号の接頭部が付くことはありません。

-qxlf90 コンパイラー・オプションを指定すると、 E、D、Q(拡張精度)、 F、EN、ES、および G(一般編集) 編集記述子による負の値の出力が、 signedzero サブオプションの指定によって異なった出力になります。

270 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 297: IBM XL Fortran for Linux, V15.1

v signedzero サブオプションを指定すると、負のゼロの場合でも出力フィールドに負の値を示す負符号が表示されます。この動作は Fortran 95、Fortran 2003、および Fortran 2008 の各標準に準拠しています。

XL Fortran では、REAL(16) 内部値がゼロの場合、それを負のゼロとして評価することはありません。

v nosignedzero サブオプションを指定すると、内部値が負であっても、値がゼロの場合、出力フィールドに負符号 (-) は書き込まれません。

EN および ES 編集記述子では、値が負の場合、サブオプションが signedzero、nosignedzero のいずれの場合も負符号を出力します。

IEEE 例外値の出力

XL Fortran では、実数および複素数編集について、IEEE 例外値の出力をサポートしています。 IEEE 例外値の出力値は、Fortran 2003 標準に準拠するか、以前のリリースの XL Fortran と互換性のある形式のいずれかにすることができます。新規のコンパイラー・オプションおよび実行時オプションによって、IEEE 例外値の出力が制御されます。-qxlf2003=oldnaninf コンパイラー・オプションを指定すると、IEEE

例外値が以前のリリースの XL Fortran と同様の出力になり、-qxlf2003=nooldnaninfを指定すると、 IEEE 例外値は Fortran 標準に従った出力になります。また、このコンパイラー・オプションだけでなく、新たな実行時オプション、naninfoutput を使用すれば、IEEE 例外値を強制的に Fortran 2003 標準または以前のリリースのXL Fortran に準拠した出力にすることができます。naninfoutput 実行時オプションの詳細については、「XL Fortran コンパイラー・リファレンス」の『XL Fortran プログラムの実行』のセクションを参照してください。 IEEE 例外値の出力は、F、E、 EN、ES、 D、G、および Q 編集記述子でサポートされます。

実数および複素数編集での IEEE 例外値の出力は、実数または複素数編集記述子のフィールド幅によって調整されます。出力時の IEEE 例外値は、大文字と小文字が区別されます。

Fortran 2003 の標準出力

IEEE 無限大は、「Inf」と出力されます。この前に、右寄せに必要な数のブランクを入れることができます。内部値が正の無限大の場合、フィールド幅が十分であれば、オプションの正符号をすぐ前に入れることができます。フィールド幅が 2 以下の場合は、アスタリスクが出力されます。ただし、SIGN= 指定子の値が「PLUS」になっているか、または「sp」記述子が使用されている場合、正符号は必須となり、その場合、最小フィールド幅は 4 になります。内部値が負の無限大の場合は、必ず負符号を前に付けなければなりません。最小フィールド幅は 4 になります。フィールド幅が 3 以下の場合は、アスタリスクが出力されます。

IEEE NaN は、「NaN」と出力されます。この前に、右寄せに必要な数のブランクを入れることができます。フィールド幅が 5 以上の場合、Fortran 標準では、オプションで、ゼロ個以上の英数字を括弧に入れて「NaN」の後に続けることができます。XL Fortran では、フィールド幅が 6 以上であれば、静止 NaN の場合「NaN(Q)」を、信号 NaN の場合「NaN(S)」を出力し、フィールド幅が 5 以下の場合は「NaN」のみを出力します。フィールド幅が 2 以下の場合は、アスタリスクが出力されます。

第 10 章 入出力の形式設定 271

Page 298: IBM XL Fortran for Linux, V15.1

以前の XL Fortran 出力

IEEE 無限大は、「INF」と出力されます。この前に、右寄せに必要な数のブランクを入れることができます。フィールド幅が 2 以下の場合は、アスタリスクが出力されます。

IEEE NaN は、静止 NaN の場合「NaNQ」、信号 NaN の場合「NaNS」と出力されます。また、直前にオプションの符号を付けることもできます。この前に、右寄せに必要な数のブランクを入れることができます。フィールド幅が 3 以下の場合は、アスタリスクが出力されます。

派生型編集記述子に関する規則 (Fortran 2003)DT 編集記述子を使用すれば、派生型のリスト項目処理のデフォルト入出力形式設定に代えて、プロシージャーを指定することができます。オプションのchar-literal-constant を指定すれば、文字値 DT が char-literal-constant に連結され、それがユーザー定義の派生型入出力プロシージャーに、入出力タイプ引数として渡されます。

DT 編集記述子の v-list の値は、定義した派生型入出力プロシージャーに v_list 配列引数として渡されます。

派生型変数または値が、DT 編集記述子に対応している場合、その派生型の派生型入出力プロシージャーにアクセス可能なインターフェースがなければなりません。

DT 編集記述子を非派生型リスト項目として指定してはなりません。

制御編集記述子表 30. 制御編集記述子

形式 使途

/

r /

現在のレコードに関するデータ転送の終わりを指定します。

: 入出力リスト内にこれ以上項目がない場合に、形式制御の終わりを指定します。

$ * 出力 * 内のレコードの終わりを抑制します。

BN 数値入力フィールド内の先行ブランク以外のブランクを無視します。

BZ 数値入力フィールド内の先行ブランク以外のブランクをゼロとして解釈します。

DC v 10 進コンマを 10 進編集モードとして指定します。

DP v 小数点を 10 進編集モードとして指定します。

kP 実数および複素数項目に対してスケール因数を指定します。

RU v UP 丸めモードを指定します。

RC v COMPATIBLE 丸めモードを指定します。

RD v DOWN 丸めモードを指定します。

RN v NEAREST 丸めモードを指定します。

RP v PROCESSOR_DEFINED 丸めモードを指定します。

272 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 299: IBM XL Fortran for Linux, V15.1

表 30. 制御編集記述子 (続き)

形式 使途

RZ v ZERO 丸めモードを指定します。

S

SS

正符号を書き込まないように指定します。

SP 正符号を書き込むように指定します。

Tc 次の文字の転送先または転送元のレコード内での絶対位置を指定します。

TLc 次の文字の転送先または転送元のレコード内での相対位置 (レコード内の現在の位置を基準として逆方向) を指定します。

TRc

oX

次の文字の転送先または転送元のレコード内での相対位置 (レコード内の現在の位置を基準として順方向) を指定します。

ここで、

v Fortran 2003

* IBM 拡張を指定します。

r 繰り返し指定子です。これは、符号なしの正のリテラル整定数です。

k 使用するスケール因数を指定します。これは、オプションで符号付きのリテラル整定数です。

c レコード内の文字位置を指定します。これは、符号なし、ゼロ以外のリテラル整定数です。

o レコード内の相対的な文字位置を指定します。これは、符号なし、ゼロ以外のリテラル整定数です。

制御編集記述子および修飾子に関する規則kind 型パラメーターを指定してはなりません。

r、k、c、および o は、整数値に評価される不等号括弧で囲まれた算術式としても表すことができます。

文字ストリング編集記述子文字ストリング編集記述子を使用すると、文字データを編集することができます。

形式 使途 ページ

nHstr 文字ストリング (str) を出力します。 288ページの『H

編集』

'str'

"str"

文字ストリング (str) を出力します。 274ページの『アポストロフィ/二重引用符編集』

n リテラル・フィールド内の文字数です。これは、符号なしの正のリテラル整定数です。ブランクも文字カウントに含まれます。kind 型パラメーターを指定することはできません。

第 10 章 入出力の形式設定 273

Page 300: IBM XL Fortran for Linux, V15.1

アポストロフィ/二重引用符編集目的

アポストロフィ/二重引用符の編集記述子は、出力形式仕様内に文字リテラル定数を指定します。

構文v 'character string'

v "character string"

規則

出力フィールド幅は、文字リテラル定数の長さになります。文字リテラル定数の追加情報については、 48ページの『文字演算子』を参照してください。

IBM 拡張

注:

1. 円記号は、デフォルトではエスケープ・シーケンスとして認識され、-qnoescapeコンパイラー・オプションが指定されている場合は円記号文字として認識されます。詳しくは、『エスケープ・シーケンス』を参照してください。

2. XL Fortran は、文字定数、ホレリス定数、文字ストリング編集記述子、およびコメント内のマルチバイト文字をサポートします。このサポートは、-qmbcs オプションによって提供されます。マルチバイト文字を含む定数を、ストリング全体を保持するのに十分大きくない変数に代入すると、マルチバイト文字内で切り捨てが行われることがあります。

3. Unicode 文字およびファイル名もサポートされます。環境変数 LANG がUNIVERSAL に設定され、-qmbcs コンパイラー・オプションが指定されている場合、コンパイラーは、Unicode の文字およびファイル名の読み取りおよび書き込みが可能です。

IBM 拡張 の終り

例ITIME=8WRITE(*,5) ITIME

5 FORMAT('The value is -- ',I2) ! The value is -- 8WRITE(*,10) ITIME

10 FORMAT(I2,'o''clock') ! 8o'clockWRITE(*,'(I2,7Ho''clock)') ITIME ! 8o'clockWRITE(*,15) ITIME

15 FORMAT("The value is -- ",I2) ! The value is -- 8WRITE(*,20) ITIME

20 FORMAT(I2,"o'clock") ! 8o'clockWRITE(*,'(I2,"o''clock")') ITIME ! 8o'clock

有効リスト項目 (Fortran 2003)このセクションでは、データ転送ステートメントの配列および派生型入出力リスト項目を拡張する場合の規則について説明します。この規則を適用して生成されたスカラー・オブジェクトは、有効項目と呼ばれます。ゼロ・サイズ配列および繰り返

274 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 301: IBM XL Fortran for Linux, V15.1

し回数がゼロの暗黙 DO リストからは、有効リスト項目は提供されません。一方、長さがゼロのスカラー文字項目は、有効リスト項目です。

拡張された各リスト項目に対して、次の規則が、適用される規則がなくなるまで、繰り返し適用されます。

1. 入出力リスト項目として、配列が指定された場合、その配列は、エレメントが配列エレメント順に指定されたものとして (エレメントがある場合) 処理されます。

2. 不定形式の入出力ステートメント内の派生型リスト項目が、ユーザー定義の派生型入出力プロシージャーによって処理されず、かつそのリスト項目のサブオブジェクトがユーザー定義の派生型入出力プロシージャーによって処理される場合、そのリスト項目は、オブジェクトのすべてのコンポーネントが、リスト内にコンポーネント順に指定されているものとして処理されます。それらのコンポーネントは、入出力ステートメントを含む有効範囲単位内でアクセス可能です。また、それらは、ポインターまたは割り振り可能であってはなりません。

3. 不定形式の入出力ステートメント内の派生型の有効入出力リスト項目は、そのリスト項目、またはリスト項目のサブオブジェクトがユーザー定義の派生型入出力プロシージャーによって処理される場合を除き、プロセッサー依存形式の単一値として扱われます。

4. 定様式 の入出力ステートメント内の派生型リスト項目が、ユーザー定義の派生型入出力プロシージャーによって処理されない場合、そのリスト項目は、リストのすべてのコンポーネントが、リスト内にコンポーネント順に指定されているものとして処理されます。それらのコンポーネントは、入出力ステートメントを含む有効範囲単位内でアクセス可能です。また、それらは、ポインターまたは割り振り可能であってはなりません。

5. 派生型のリスト項目が、個別コンポーネントのリストとして処理されない場合、そのリスト項目がユーザー定義の派生型入出力プロシージャーによって処理される場合を除き、その最終コンポーネントに POINTER または ALLOCATABLE属性を指定できません。

入出力リストと形式仕様の相互作用形式指示の形式設定を開始すると、形式制御が開始されます。形式制御の各アクションは、形式仕様内にある次の編集記述子、および入出力リスト内にある次の有効項目 (ある場合) に依存します。

入出力リストで少なくとも 1 つの有効項目を指定する場合、形式仕様でも少なくとも 1 つのデータ編集記述子を指定する必要があります。空の形式仕様 (括弧のみの仕様) は、入出力リストに有効項目がない場合、あるいは各項目がゼロ・サイズの配列か、または繰り返し回数ゼロの暗黙 DO リストである場合にしか使用できませんので注意してください。このような場合に、アドバンス入出力が有効であれば、入力レコードが 1 つスキップされるか、または文字を含まない出力レコードが 1

つ書き込まれます。非アドバンス入出力の場合には、ファイルの位置は変更されないままです。

第 10 章 入出力の形式設定 275

Page 302: IBM XL Fortran for Linux, V15.1

形式仕様は、繰り返し仕様 (r) がある場合を除いて、左から右に向かって解釈されます。繰り返し仕様が前に付いている形式項目は、繰り返し仕様が付いていない形式仕様または編集記述子と同様の形式仕様あるいは編集記述子が r 個あるリストとして処理されます。

入出力リストで指定される 1 つの有効項目は、それぞれ 1 つのデータ編集記述子に対応します。 1 つの複素数型の有効リスト項目には、F、E、EN 、 ES、D、G、または、拡張精度 Q の編集記述子を 2 つ解釈することが必要です。制御編集記述子または文字ストリング編集記述子に対しては、入出力リストで指定される項目は対応しません。形式制御は、直接レコードと情報を交換します。

形式制御は、次のように実行されます。

1. データ編集記述子が検出されると、形式制御は、有効入出力リスト項目があればその項目を処理し、リストが空ならば入出力コマンドを終了させます。処理される有効リスト項目が複素数型の場合は、いずれか 2 つの編集記述子が処理されます。

2. 入出力リストにそれ以上有効項目がない場合は、形式制御は、コロン編集記述子によって終了されます。入出力リストにまだ有効項目が残っているときにコロンが検出された場合、コロンは無視されます。

3. 形式仕様の終わりに達した場合、有効入出力リスト全体が処理されていれば、形式制御は終了します。それ以外の場合、制御は、前にある最後の右括弧で終わっている形式項目の始めに戻ります。後者の場合、次のような項目が適用されます。

v 形式仕様の再使用部分には、少なくとも 1 つのデータ編集記述子が含まれていなければなりません。

v 繰り返し仕様のすぐ後にある括弧に戻る場合は、その繰り返し仕様が再使用されます。

v 戻ること自体は、スケール因数や S、SP、または SS 編集記述子、あるいはBN または BZ 編集記述子には影響を与えません。

v 形式制御が戻る場合、ファイルは、スラッシュ編集記述子が処理される時のファイルの位置付けとまったく同様に位置付けられます。

読み取り操作では、レコード内の未処理文字は、次のレコードが読み取られるたびに、すべてスキップされます。形式指示の形式設定で処理される入力レコード内の非文字データ値のセパレーターとして、コンマまたはセミコロンを使用することができます。これらの値のセパレーターが、フィールド幅の最後より前にある場合、区切り文字は形式幅仕様をオーバーライドします。例えば、(I10,F20.10,I4) という形式は、以下のレコードを正しく読み取ります。

-345, .05E-3, 12

FORMAT ステートメントで Fortran レコードを定義する場合、入出力メディアで許可される最大サイズのレコードを考慮に入れることが重要です。例えば Fortran

レコードを印刷する場合、レコードの長さはプリンターの行の長さ以下でなければなりません。

276 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 303: IBM XL Fortran for Linux, V15.1

コンマで区切られた入出力 (IBM 拡張)形式指示入出力を使用して浮動小数点データを読み取るとき、入力内にコンマがあるとフィールドが終了します。これは、コンマで区切られた値を含むファイルを読み取る際に便利です。

例えば、下のプログラムは E 編集記述子を使用して 2 つの実数を読み取ります。このプログラムでは、フィールド幅が 16 文字でなければなりません。このプログラムは、レコード内の残りの文字を文字ストリングとして読み取ります。

> cat read.freal a,bcharacter*10 copen(11, access='sequential', form='formatted')read(11, '(2e16.10, A)') a,b,cprint *, aprint *, bprint *, cend

形式の指定どおりに、浮動小数点フィールド幅が 16 文字である場合は、プログラムが正常に実行されます。 (0.4000000000E+02 は、16 文字です。)

> cat fort.110.4000000000E+020.3000000000E+02hello> a.out40.0000000030.00000000hello

しかし、浮動小数点入力に含まれる文字数が 16 文字を下回る場合は、次のフィールドの一部が読み取られてしまうため、エラーが発生します。(0.400000E+02 は、12

文字です。)

> cat fort.110.400000E+020.3000000E+02hello> a.out1525-097 A READ statement using decimal base input found the invalid digit'.' in the input file.The program will recover by assuming a zero in its place.1525-097 A READ statement using decimal base input found the invalid digit'h' in the input file.The program will recover by assuming a zero in its place.1525-097 A READ statement using decimal base input found the invalid digit'e' in the input file.The program will recover by assuming a zero in its place.1525-097 A READ statement using decimal base input found the invalid digit'l' in the input file.The program will recover by assuming a zero in its place.1525-097 A READ statement using decimal base input found the invalid digit'l' in the input file.The program will recover by assuming a zero in its place.1525-097 A READ statement using decimal base input found the invalid digit'o' in the input file.The program will recover by assuming a zero in its place.INF0.0000000000E+00

ここで、コンマを使用してフィールドを終了させると、浮動小数点値が正しく読み取られます。 (0.400000E+02 は 12 文字ですが、各フィールドがコンマで区切られています。)

第 10 章 入出力の形式設定 277

Page 304: IBM XL Fortran for Linux, V15.1

> cat fort.110.400000E+02,0.3000000E+02,hello> a.out40.0000000030.00000000hello

10 進コンマ・モードが有効な場合、コンマではなく、セミコロンが値のセパレーターとして機能します。

データ編集記述子データ編集記述子の例では、出力列内の小文字 b は、その位置にブランクが表示されることを示します。

A (文字) 編集目的

A 編集記述子は、文字値の編集を指示します。これは、文字型またはその他の型の入出力リスト項目に対応することができます。対応するリスト項目によって、転送および変換されるすべての文字の kind 型パラメーターが暗黙的に示されます。

構文v A

v Aw

規則

入力の場合、w が入力リスト項目の長さ (len と言う) 以上の場合、入力フィールドの右端の len 文字が取られます。指定したフィールド幅が len より小さい場合、w

個の文字は、(len - w) 個の末尾ブランクを追加して左寄せされます。

出力の場合、w が len より大きい場合、出力フィールドは、(w - len) 個のブランクと、それに続く、内部表記の len 個の文字から構成されます。w が len 以下の場合、出力フィールドは、内部表記の左端の w 個の文字で構成されます。

w が指定されない場合、文字フィールドの幅は、対応する入出力リスト項目の長さになります。

定様式ストリーム・アクセス中、文字出力に改行文字が含まれている場合、その文字出力は複数のレコードに分割されます。

B (2 進) 編集目的

B 編集記述子は、内部形式のいずれかの型の値とその 2 進表記の間の編集を指示します。(2 進数は 0 か 1 のいずれかです。)

構文v Bw

v Bw.m

278 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 305: IBM XL Fortran for Linux, V15.1

規則

入力の場合、w 個の 2 進数が編集されて、入力リスト項目の値に対して内部表記が形成されます。入力フィールド内の 2 進数は、入力リスト項目に割り当てられた値の内部表記の右端の 2 進数に対応します。m は、入力に影響しません。

入力の場合、w は、ゼロより大きくする必要があります。

出力の場合、w は、ゼロにすることができます。w がゼロの場合、出力フィールドは、出力値を表示するのに必要な最低限の文字数で構成されます。

Bw の出力フィールドは、ゼロ個以上の先行ブランクと、それに続く、先行ゼロなしの 2 進数に等しい形式の内部値から構成されています。2 進定数は、常に少なくとも 1 桁から構成されています。

Bw.m の出力フィールドは、数字ストリングが、少なくとも m 桁から成るということを除いて、Bw と同じです。必要に応じて、数字ストリングは、先行ゼロで埋め込まれます。m の値は、w の値がゼロでない限り、w の値を超えてはいけません。m がゼロで、内部データの値がゼロの場合、出力フィールドは、有効な符号制御に関係なく、ブランク文字のみで構成されます。

m がゼロで、w が正の数で、内部データの値がゼロの場合、出力フィールドは、w

個のブランク文字で構成されます。w と m の両方がゼロで、内部データの値がゼロの場合、出力フィールドは、ブランク文字 1 個のみで構成されます。

-qxlf77 コンパイラー・オプションの nooldboz サブオプションが指定された場合(デフォルト)、出力フィールド幅が、出力全体を入れるには十分でない場合、アスタリスクが表示されます。入力の場合、BLANK= 指定子および BN と BZ 編集記述子は、B 編集記述子に影響を与えます。

-qxlf77 コンパイラー・オプションの oldboz サブオプションを指定する場合、出力に対して以下が行われます。

v m を w の最小値およびデータ項目の最大可能値を表示するのに必要な桁数と想定すると、Bw は、Bw.m として処理されます。

v 出力は、ブランクと、それに続く、少なくとも m 個の桁で構成されます。必要に応じて、数値の右端の桁から m 桁が、ゼロで埋め込まれます。数値が出力フィールドに対して大きすぎる場合、右端の m 桁のみが出力されます。

w がゼロの場合、oldboz サブオプションは無視されます。

oldboz サブオプションを使用すると、BLANK= 指定子および BN と BZ 編集記述子は、B 編集記述子に影響を与えません。

例 1: 入力での B 編集の例

Input Format Value111 B3 7110 B3 6

例 2: 出力での B 編集の例

第 10 章 入出力の形式設定 279

Page 306: IBM XL Fortran for Linux, V15.1

Value Format Output Output(with -qxlf77=oldboz) (with -qxlf77=nooldboz)

7 B3 111 1116 B5 00110 bb11017 B6.5 b10001 b1000117 B4.2 0001 ****22 B6.5 b10110 b1011022 B4.2 0110 ****0 B5.0 bbbbb bbbbb

2 B0 10 10

E、D、および Q (拡張精度) 編集目的

E、D、および拡張精度 Q 編集記述子は、内部形式の実数および複素数と指数を持つその文字表現の間の編集を指示します。E、D、または拡張精度 Q 編集記述子は、実数型の入出力リスト項目か、複素数型の入出力リスト項目の実数部または虚数部か、 または、XL Fortran の、少なくとも 4 バイトの長さの他の型

に対応します。

構文v Ew.d

v Ew.d Ee

v Dw.d

v Ew.d De

v Ew.d Qe

v Qw.d

規則

入力フィールドの形式は、F 編集の場合と同じです。e は、入力に影響しません。

スケール因数 0 に対する出力フィールドの形式は以下のとおりです。

digit_string

丸められた後、長さが、d 桁の、値の最上位数字である数字ストリングです。

decimal_exponent

以下のいずれかの形式の 10 進の指数です (z は数字)。

編集記述子 指数の絶対値 (スケール因数 0) 指数の形式

Ew.d |decimal_exponent| ≤ 99 E±z1z2

Ew.d 99<|decimal_exponent| ≤ 309 ±z1z2z3

��+-

. digit_string decimal_exponent0

��

280 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 307: IBM XL Fortran for Linux, V15.1

編集記述子 指数の絶対値 (スケール因数 0) 指数の形式

Ew.dEe |decimal_exponent| ≤ (10e)-1 E±z1z2 ...ze

Ew.dDe * |decimal_exponent| ≤ (10e)-1 * D±z1z2 ...ze *

Ew.dQe * |decimal_exponent| ≤ (10e)-1 * Q±z1z2 ...ze *

Dw.d |decimal_exponent| ≤ 99 D±z1z2

Dw.d 99<|decimal_exponent| ≤ 309 ±z1z2z3

Qw.d* |decimal_exponent| ≤ 99 * Q±z1z2 *

Qw.d* 99<|decimal_exponent| ≤ 309 * ±z1z2z3 *

注: * IBM 拡張

スケール因数 k ( 297ページの『P (スケール因数) 編集』を参照) は、小数部の正規化を制御します。-d<k≤0 の場合、出力フィールドには、|k| 個の先行ゼロが入り、小数点の後には d - |k| 桁の有効数字が入ります。0<k< d+2 の場合、出力フィールドには、小数点の左側には、k 桁の有効数字が入り、小数点の右側に d-k+1 桁の有効数字が含まれます。これ以外の k は使用できません。

入力での数値編集の一般情報については、 269ページの『入力の数値編集記述子に関する規則』を参照してください。

出力での数値編集に関して詳しくは、 270ページの『出力の数値データ編集記述子に関する規則』を参照してください。

例 1: 入力での E、D、および拡張精度 Q 編集の例

(BN 編集は、ブランク変換処理に対して有効であることを前提としています。)

Input Format Value12.34 E8.4 12.34.1234E2 E8.4 12.342.E10 E12.6E1 2.E10

例 2: 出力での E、D、および拡張精度 Q 編集の例

Value Format Output Output(with -qxlf77=noleadzero) (with -qxlf77=leadzero)

1234.56 E10.3 bb.123E+04 b0.123E+041234.56 D10.3 bb.123D+04 b0.123D+04

DT 編集 (Fortran 2003)目的

DT 編集記述子によって、派生型の入出力リスト項目を処理するために、デフォルトの入出力フォーマットの代わりに、ユーザー定義のプロシージャーを呼び出すように指定できます。

構文v DT

v DTchar-literal-constant

第 10 章 入出力の形式設定 281

Page 308: IBM XL Fortran for Linux, V15.1

v DT( v-list )

v DTchar-literal-constant( v-list )

規則

ユーザー定義の入出力プロシージャーに渡される iotype 仮引数には、char-literal-constant からのテキストが含まれています。接頭部は DT になります。char-literal-constant を含んでいない場合、iotype 引数には、DT のみが含まれます。

v-list は、v_list 整数配列の仮引数内で、ユーザー定義の入出力プロシージャーに渡されます。v-list を含んでいない場合、v_list 仮引数は、サイズがゼロの配列になります。

DT 編集記述子を使用する際、対応する派生型入出力リスト項目を、適切なユーザー定義の派生型入出力プロシージャーに関連付ける必要があります。

EN 編集目的

EN 編集記述子によって、出力値がゼロの場合を除いて、10 進の指数が 3 で割り切れて、仮数の絶対値が 1 以上 1000 未満といった技術表記による実数の形式で、出力フィールドが作成されます。スケール因数は、出力に影響しません。

EN 編集記述子は、実数型の入出力リスト項目か、複素数型の入出力リスト項目の実数部または虚数部か、 または、XL Fortran の、少なくとも 4 バイトの長さの他の型

に対応します。

構文v ENw.d

v ENw.dEe

規則

入力フィールドの形式および変換処理は、F 編集の場合と同じです。

出力フィールドの形式は、次のようになります。

yyy 丸められた後の、データの値の最上位数字を表す 1 から 3 までの 10 進数です (yyy は、1 ≤ yyy < 1000 の整数か、出力値がゼロの場合は、 yyy = 0

となります)。

��+-

. digit_string expyyy

��

282 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 309: IBM XL Fortran for Linux, V15.1

digit_string

丸められた後の、データの値の d 桁の次の最上位数字です。

exp 以下のいずれか形式の、3 で割り切れる 10 進の指数です (z は、数字)。

編集記述子 指数の絶対値 指数の形式

ENw.d |exp| ≤ 99 E±z1z2

ENw.d 99 < |exp| ≤ 309 ±z1z2z3

ENw.dEe |exp| ≤ 10e-1 E±z1 ... ze

入力での数値編集の一般情報については、 269ページの『入力の数値編集記述子に関する規則』を参照してください。

出力での数値編集に関して詳しくは、 270ページの『出力の数値データ編集記述子に関する規則』を参照してください。

例Value Format Output3.14159 EN12.5 b3.14159E+001.41425D+5 EN15.5E4 141.42500E+00033.14159D-12 EN15.5E1 ***************

(with -qxlf90=signedzero) (with -qxlf90=nosignedzero)-0.001 EN9.2 -1.00E-03 -1.00E-03

ES 編集目的

ES 編集記述子によって、出力値がゼロの場合を除いて、仮数の絶対値が 1 以上 10

未満といった浮動小数表記の実数の形式で、出力フィールドが作成されます。スケール因数は、出力に影響しません。

ES 編集記述子は、実数型の入出力リスト項目か、複素数型の入出力リスト項目の実数部または虚数部か、 または、XL Fortran の、少なくとも 4 バイトの長さの他の型

に対応します。

構文v ESw.d

v ESw.dEe

規則

入力フィールドの形式および変換処理は、F 編集の場合と同じです。

出力フィールドの形式は、次のようになります。

第 10 章 入出力の形式設定 283

Page 310: IBM XL Fortran for Linux, V15.1

y 丸められた後の、データの値の最上位数字を表す 10 進数です。

digit_string

丸められた後の、データの値の d 桁の次の最上位数字です。

exp 以下のいずれかの形式を持つ 10 進の指数です (z は数字)。

編集記述子 指数の絶対値 指数の形式

ESw.d |exp| ≤ 99 E±z1z2

ESw.d 99 < |exp| ≤ 309 ±z1z2z3

ESw.dEe |exp| ≤ 10e-1 E±z1 ... ze

入力での数値編集の一般情報については、 269ページの『入力の数値編集記述子に関する規則』を参照してください。

出力での数値編集に関して詳しくは、 270ページの『出力の数値データ編集記述子に関する規則』を参照してください。

例Value Format Output31415.9 ES12.5 b3.14159E+0414142.5D+3 ES15.5E4 bb1.41425E+000731415.9D-22 ES15.5E1 ***************

(with -qxlf90=signedzero) (with -qxlf90=nosignedzero)-0.001 ES9.2 -1.00E-03 -1.00E-03

F (指数なしの実数) 編集目的

F 編集記述子は、内部形式の実数および複素数と指数を持たないその文字表現の間の編集を指示します。

F 編集記述子は、実数型の入出力リスト項目か、複素数型の入出力リスト項目の実数部または虚数部か、 または、XL Fortran の、少なくとも 4 バイトの長さの他の型

に対応します。

構文v Fw.d

規則

F 編集記述子の入力フィールドは、以下の順序で構成されています。

1. オプションの符号。

��+-

. digit_string expy

��

284 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 311: IBM XL Fortran for Linux, V15.1

2. オプションで、小数点を含む数字のストリング。小数点がある場合、これは、編集記述子に指定されている d をオーバーライドします。小数点が省略されている場合、ストリングの右端の d 桁が、小数点以下と解釈された場合、必要であれば、先行ブランクがゼロに変換されます。

3. オプションで、以下のいずれかの形式を持つ指数。

v 符号付きの数字ストリング。

v ゼロまたは複数のブランクおよびオプションで符号付きの数字ストリングが続くE、D、または Q。E、D、および Q は、同じように処理されます。

F 編集記述子の出力フィールドは、以下の順序で構成されています。

1. 必要に応じて、ブランク。

2. 内部値が負の数の場合は、負符号、内部値がゼロか正の数の場合は、オプションの正符号。

3. 小数点を含み、効力のあるスケール因数によって変更されて、d 桁の小数桁に丸められた内部値の絶対値を表す数字のストリング。詳しくは、 297ページの『P

(スケール因数) 編集』を参照してください。

入力の場合、w は、ゼロより大きくする必要があります。

Fortran 95 では、出力の場合、w は、ゼロにすることができます。w がゼロの場合、出力フィールドは、出力値を表示するのに必要な最低限の文字数で構成されます。

入力での数値編集の一般情報については、 269ページの『入力の数値編集記述子に関する規則』を参照してください。

出力での数値編集に関して詳しくは、 270ページの『出力の数値データ編集記述子に関する規則』を参照してください。

例 1: 入力での F 編集の例

(BN 編集は、ブランク変換処理に対して有効であることを前提としています。)

Input Format Value-100 F6.2 -1.02.9 F6.2 2.94.E+2 F6.2 400.0

例 2: 出力での F 編集の例

Value Format Output Output(with -qxlf77=noleadzero) (with -qxlf77=leadzero)

+1.2 F8.4 bb1.2000 bb1.2000.12345 F8.3 bbbb.123 bbbb0.123-12.34 F6.2 -12.34 -12.34

-12.34 F0.2 -12.34 -12.34

(with -qxlf90=signedzero) (with -qxlf90=nosignedzero)-0.001 F5.2 -0.00 b0.00

第 10 章 入出力の形式設定 285

Page 312: IBM XL Fortran for Linux, V15.1

G (一般) 編集目的

G 編集記述子は、すべての型の入出力リスト項目に対応します。整数データの編集は、I 編集記述子の規則に従い、実数データおよび複素数データの編集は、E または F 編集記述子に従い (値の絶対値に応じて)、論理データの編集は、L 編集記述子の規則に従い、文字データの編集は、A 編集記述子の規則に従います。

構文v Gw.d

v Gw.dEe

v Gw.dDe

v Gw.dQe

規則

入力での数値編集の一般情報については、 269ページの『入力の数値編集記述子に関する規則』を参照してください。

出力での数値編集に関して詳しくは、 270ページの『出力の数値データ編集記述子に関する規則』を参照してください。

例Value Format Output Output

(with -qxlf77=gedit77) (with -qxlf77=nogedit77)0.0 G10.2 bb0.00E+00 bbb0.00.0995 G10.2 bb0.10E+00 bb0.1099.5 G10.2 bb100. bb0.10E+03

一般化された実数および複素数編集-qxlf77 オプションの nogedit77 サブオプション (デフォルト) が指定される場合、出力フィールド内の表示方式は、編集中のデータの絶対値によって決まります。内部データの絶対値を N とします。0 < N < 0.1-0.5×10 -d-1 または N ≥ 10d-0.5 または N が 0 で d が 0 の場合、Gw.d の出力編集は、kPE w.d の出力編集と同じで、Gw.dEe の出力編集は、kPEw.dEe の出力編集と同じです。ここで kP は現在有効なスケール因数 ( 297ページの『P (スケール因数) 編集』) を参照します。0.1-0.5×10-d-1 ≤ N < 10d-0.5 または N が、同じように 0 で d がゼロでない場合、スケール因数は、何の効果もなく、N の値が、以下のように編集を決定します。

データの絶対値 等価変換

N = 0 F(w-n).(d-1),n('b')

(d は 0 にしないでください)

0.1-0.5×10-d-1 ≤ N < 1-0.5×10-d F(w-n).d,n('b')

1-0.5×10-d ≤ N < 10-0.5×10-d+1 F(w-n).(d-1),n('b')

286 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 313: IBM XL Fortran for Linux, V15.1

データの絶対値 等価変換

10-0.5×10-d+1

≤ N < 100-0.5×10-d+2

F(w-n).(d-2),n('b')

... ...

10d-2-0.5×10-2 ≤ N < 10d-1-0.5×10-1 F(w-n).1,n('b')

10d-1-0.5×10-1 ≤ N < 10d-0.5 F(w-n).0,n('b')

ここで b は、ブランクです。n は、Gw.d に対して 4 に、Gw.dEe に対しては e+2

になります。w-n の値も正の数にする必要があります。

編集されるデータの絶対値が F 編集の有効な使用を可能にする範囲外にある場合を除いて、スケール因数は、何の影響も与えません。

0 < N < 0.1-0.5×10-d-1、N ≥ 10d-0.5、または N が 0 で d が 0 の場合、Gw.dDe の出力編集は、kPEw.dDe の出力編集と同じで、Gw.dQe の出力編集は、kPEw.dQe の出力編集と同じです。

出力の場合、-qxlf77 コンパイラー・オプションの gedit77 サブオプションが指定された場合、数値に応じて、E または F 編集のいずれかを使用して、数値が変換されます。フィールドは、必要に応じて、ブランクで右側が埋め込まれます。数値の絶対値を N とすると、編集は以下のようになります。

v N<0.1 または N≥10d の場合、

– Gw.d の編集は、Ew.d の編集と同じになります。

– Gw.dEe の編集は、Ew.dEe の編集と同じになります。

v N≥0.1 および N<10d の場合、

データの絶対値 等価変換

0.1 ≤ N < 1

1 ≤ N < 10

.

.

10d-2 ≤ N < 10d-1

10d-1 ≤ N < 10d

F(w-n).d, n('b')

F(w-n).(d-1), n('b')

.

.

F(w-n).1, n('b')

F(w-n).0, n('b')

注: FORTRAN 77 では、値の丸めによって出力フィールド形式にどのように影響を与えるかをアドレス指定しませんが、Fortran 90 では、アドレス指定します。その結果、値および G 編集記述子の特定の組み合わせに対して、-qxlf77=gedit77 を使用すると、-qxlf77=nogedit77 以外の、別の出力形式が作成される可能性があります。

第 10 章 入出力の形式設定 287

Page 314: IBM XL Fortran for Linux, V15.1

H 編集目的

H 編集記述子によって、文字ストリング (str) およびその長さ (n) を、出力形式仕様で指定します。ストリングは、文字リテラル定数内で使用できる任意の文字で構成されます。

構文v nH str

規則

H 編集記述子が、文字リテラル定数内にあり、定数区切り文字 (例えば、アポストロフィ) が、2 つ連続している場合、その定数区切り文字を str 内に表示できます。それ以外では、他の区切り文字を使用する必要があります。

入力の場合、H 編集記述子を使用しないでください。

注:

1. 円記号 (¥) は、デフォルトでは、エスケープ文字として認識され、-qnoescapeコンパイラー・オプションが指定された場合、円記号文字として認識されます。詳しくは、『エスケープ・シーケンス』を参照してください。

2. XL Fortran は、文字定数、ホレリス定数、文字ストリング編集記述子、およびコメント内のマルチバイト文字をサポートします。このサポートは、-qmbcs オプションによって提供されます。マルチバイト文字を含む定数を、ストリング全体を保持するのに十分大きくない変数に代入すると、マルチバイト文字内で切り捨てが行われることがあります。

3. Unicode 文字およびファイル名もサポートされます。環境変数 LANG がUNIVERSAL に設定され、-qmbcs コンパイラー・オプションが指定されている場合、コンパイラーは、Unicode の文字およびファイル名の読み取りおよび書き込みが可能です。

4. H 編集記述子は、FORTRAN 77 および Fortran 90 の両方の一部でしたが、Fortran 95 には含まれていません。詳しくは、 1117ページの『削除されたフィーチャー』を参照してください。

例50 FORMAT(16HThe value is -- ,I2)10 FORMAT(I2,7Ho'clock)

WRITE(*,'(I2,7Ho''clock)') ITIME

I (整数) 編集目的

I 編集記述子は、内部形式の整数と整数の文字表現の間の編集を指示します。対応する入出力リスト項目は、整数型、 または XL Fortran の他の型から成ります。

288 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 315: IBM XL Fortran for Linux, V15.1

構文v Iw

v Iw.m

規則

w はオプションの符号を含みます。

Fortran 95 で w がゼロの場合を除いて、m には w 以下の値を入れる必要があります。

I 編集記述子の入力フィールドは、すべてがブランクである場合を除いて、オプションで符号のついた数字ストリングにする必要があります。すべてがブランクの場合、入力フィールドはゼロとみなされます。

m は出力時にのみ有効です。これは、入力に影響しません。

入力の場合、w は、ゼロより大きくする必要があります。

出力の場合、w は、ゼロにすることができます。w がゼロの場合、出力フィールドは、出力値を表示するのに必要な最低限の文字数で構成されます。

I 編集記述子の出力フィールドは、以下の順序で構成されています。

1. ゼロまたは先行ブランク。

2. 内部値が負の値の場合は、負符号、内部値がゼロか正の数の場合は、オプションの正符号。

3. 以下の形式の絶対値。

v m を指定していない場合、先行ゼロなしの数字ストリング。

v m を指定していない場合は、m 桁以上の数字ストリング。必要に応じて、先行ゼロを付けます。内部値と m の両方がゼロの場合、ブランクが書き込まれます。

数値編集に関する追加情報については、編集を参照してください。

m がゼロで、w が正の数で、内部データの値がゼロの場合、出力フィールドは、w

個のブランク文字で構成されます。w と m の両方がゼロで、内部データの値がゼロの場合、出力フィールドは、ブランク文字 1 個のみで構成されます。

例 1: 入力での I 編集の例

(BN 編集は、ブランク変換処理に対して有効であることを前提としています。)

Input Format Value-123 I6 -123123456 I7.5 1234561234 I4 1234

例 2: 出力での I 編集の例

Value Format Output-12 I7.6 -00001212345 I5 12345

第 10 章 入出力の形式設定 289

Page 316: IBM XL Fortran for Linux, V15.1

0 I6.0 bbbbbb0 I0.0 b2 I0 2

L (論理) 編集目的

L 編集記述子は、内部形式の論理値とその文字表現の間の編集を指示します。L 編集記述子は、論理型の入出力リスト項目、 または XL Fortran の他の型

に対応します。

構文v Lw

規則

入力フィールドには、オプションのブランクと、それに続くオプションの小数点、さらにその後に続く、T (真の場合)、または F (偽の場合) から構成されます。 w

には、ブランクが含まれます。入力の場合、T または F の後にどのような文字があっても受け入れられますが、後続の文字は無視されます。したがって、 .TRUE. および .FALSE. というストリングは、受け入れ可能な入力形式です。

出力フィールドは、( w - 1) 個のブランクが前に来る T または F で構成されています。

例 1: 入力での L 編集の例

Input Format ValueT L4 true.FALSE. L7 false

例 2: 入力での L 編集の例

Value Format OutputTRUE L4 bbbTFALSE L1 F

O (8 進) 編集目的

O 編集記述子は、内部形式のいずれかの型の値とその 8 進表記の間の編集を指示します。(8 進数字は、0 から 7 です。)

構文v Ow

v Ow.m

規則

w には、ブランクが含まれます。

290 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 317: IBM XL Fortran for Linux, V15.1

入力の場合、w 個の 8 進数字が編集されて、入力リスト項目の値に対して内部表記が形成されます。入力フィールド内の 8 進数字は、入力リスト項目に割り当てられた値の内部表記の右端の 8 進数字に対応します。m は、入力に影響しません。

入力の場合、w は、ゼロより大きくする必要があります。

出力の場合、w は、ゼロにすることができます。w がゼロの場合、出力フィールドは、出力値を表示するのに必要な最低限の文字数で構成されます。

Ow の出力フィールドは、ゼロ個以上の先行ブランクと、それに続く、先行ゼロなしの 8 進数字に等しい形式の内部値から構成されています。8 進定数は、常に少なくとも 1 桁から構成されています。

Ow.m の出力フィールドは、数字ストリングが、少なくとも m 桁から成るということを除いて、Ow と同じです。必要に応じて、数字ストリングは、先行ゼロで埋め込まれます。m の値は、w の値がゼロでない限り、w の値を超えてはいけません。m がゼロで、内部データの値がゼロの場合、出力フィールドは、有効な符号制御に関係なく、ブランク文字のみで構成されます。

-qxlf77 コンパイラー・オプションの nooldboz サブオプションが指定された場合(デフォルト)、出力フィールド幅が、出力全体を入れるには十分でない場合、アスタリスクが表示されます。入力の場合、BLANK= 指定子および BN と BZ 編集記述子は、O 編集記述子に影響を与えます。

IBM 拡張

-qxlf77 コンパイラー・オプションの oldboz サブオプションを指定する場合、出力に対して以下が行われます。

v m を w の最小値およびデータ項目の最大可能値を表示するのに必要な桁数と想定すると、Ow は、Ow.m として処理されます。

v 出力は、ブランクと、それに続く、少なくとも m 個の桁で構成されます。必要に応じて、数値の右端の桁から m 桁が、ゼロで埋め込まれます。数値が出力フィールドに対して大きすぎる場合、右端の m 桁のみが出力されます。

w がゼロの場合、oldboz サブオプションは無視されます。

oldboz サブオプションを使用すると、BLANK= 指定子および BN と BZ 編集記述子は、O 編集記述子に影響を与えません。

IBM 拡張 の終り

m がゼロで、w が正の数で、内部データの値がゼロの場合、出力フィールドは、w

個のブランク文字で構成されます。w と m の両方がゼロで、内部データの値がゼロの場合、出力フィールドは、ブランク文字 1 個のみで構成されます。

例 1: 入力での O 編集の例

Input Format Value123 O3 83120 O3 80

第 10 章 入出力の形式設定 291

Page 318: IBM XL Fortran for Linux, V15.1

例 2: 出力での O 編集の例

Value Format Output Output(with -qxlf77=oldboz) (with -qxlf77=nooldboz)

80 O5 00120 bb12083 O2 23 **

0 O5.0 bbbbb bbbbb0 O0.0 b b80 O0 120 120

Q (文字カウント) 編集 (IBM 拡張)目的

文字カウント Q 編集記述子は、入力レコード内に残っている文字数を返します。その結果は、残りの入力を制御するのに使用できます。

構文v Q

規則

また、拡張精度 Q 編集記述子もあります。前に説明したように、デフォルトでは、XL Fortran は、拡張精度 Q 編集記述子のみを認識します。詳しくは、 280ページの『E、D、および Q (拡張精度) 編集』を参照してください。両方の Q 編集記述子を使用可能にするには、-qqcount コンパイラー・オプションを指定する必要があります。

-qqcount コンパイラー・オプションを指定する場合、コンパイラーは、Q 編集記述子の使用方法によって、2 つの Q 編集記述子を区別します。単独の Q のみが検出された場合、コンパイラーは、それを文字カウント Q 編集記述子として解釈します。 Qw. または Qw.d が検出された場合、XL Fortran は、それを拡張精度 Q 編集記述子として解釈します。XL Fortran が、指定した Q 編集記述子を正しく解釈するようにするには、正しい区切り文字を使用して正しい形式仕様を使用する必要があります。

文字カウント Q 編集記述子の結果として返された値は、入力レコードの長さおよびレコード内の現行文字位置によって異なります。位置が FORMAT ステートメント内の文字カウント Q 編集記述子の位置に相当する、READ ステートメントのスカラー整変数に、値が返されます。

文字カウント Q 編集記述子は、以下のファイル・タイプおよびアクセス・モードのレコードを読み取れます。

v 定様式順次外部ファイル。このファイル・タイプのレコードは、改行文字によって終了します。同じファイル内のレコードの長さはそれぞれ異なります。

v 定様式順次内部非配列ファイル。レコード長は、スカラー文字変数の長さです。

v 定様式順次内部配列ファイル。レコード長は、文字配列内のエレメントの長さです。

v 定様式直接の外部ファイル。レコード長は、OPEN ステートメント内で RECL=指定子で指定した長さです。

v 定様式ストリーム外部ファイル。このファイル・タイプのレコードは、改行文字によって終了します。同じファイル内のレコードの長さはそれぞれ異なります。

292 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 319: IBM XL Fortran for Linux, V15.1

出力操作では、文字カウント Q 編集記述子は無視されます。対応する出力項目はスキップされます。

例@PROCESS QCOUNT

CHARACTER(50) BUFINTEGER(4) NBYTESCHARACTER(60) STRING...BUF = 'This string is 29 bytes long.'READ( BUF, FMT='(Q)' ) NBYTESWRITE( *,* ) NBYTES

! NBYTES equals 50 because the buffer BUF is 50 bytes long.READ(*,20) NBYTES, STRING

20 FORMAT(Q,A)! NBYTES will equal the number of characters entered by the user.

END

Z (16 進) 編集目的

Z 編集記述子は、内部形式のいずれかの型の値とその 16 進表記の間の編集を指示します。(16 進数字は、0 から 9、A から F、a から f のいずれかです。)

構文v Zw

v Zw.m

規則

入力の場合、w 個の 16 進数字が編集されて、入力リスト項目の値に対して内部表記が形成されます。入力フィールド内の 16 進数字は、入力リスト項目に割り当てられた値の内部表記の右端の 16 進数字に対応します。m は、入力に影響しません。

出力の場合、w は、ゼロにすることができます。w がゼロの場合、出力フィールドは、出力値を表示するのに必要な最低限の文字数で構成されます。

Zw の出力フィールドは、ゼロ個以上の先行ブランクと、それに続く、先行ゼロなしの 16 進数字に等しい形式の内部値から構成されています。16 進定数は、常に少なくとも 1 桁から構成されています。

Zw.m の出力フィールドは、数字ストリングが、少なくとも m 桁から成るということを除いて、Zw と同じです。必要に応じて、数字ストリングは、先行ゼロで埋め込まれます。m の値は、w の値がゼロでない限り、w の値を超えてはいけません。m がゼロで、内部データの値がゼロの場合、出力フィールドは、有効な符号制御に関係なく、ブランク文字のみで構成されます。

m がゼロで、w が正の数で、内部データの値がゼロの場合、出力フィールドは、w

個のブランク文字で構成されます。

w と m の両方がゼロで、内部データの値がゼロの場合、出力フィールドは、ブランク文字 1 個のみで構成されます。

第 10 章 入出力の形式設定 293

Page 320: IBM XL Fortran for Linux, V15.1

-qxlf77 コンパイラー・オプションの nooldboz サブオプションが指定された場合(デフォルト)、出力フィールド幅が、出力全体を入れるには十分でない場合、アスタリスクが表示されます。入力の場合、BLANK= 指定子および BN と BZ 編集記述子は、Z 編集記述子に影響を与えます。

IBM 拡張

-qxlf77 コンパイラー・オプションの oldboz サブオプションを指定する場合、出力に対して以下が行われます。

v m を w の最小値およびデータ項目の最大可能値を表示するのに必要な桁数と想定すると、Zw は、Zw.m として処理されます。

v 出力は、ブランクと、それに続く、少なくとも m 個の桁で構成されます。必要に応じて、数値の右端の桁から m 桁が、ゼロで埋め込まれます。数値が出力フィールドに対して大きすぎる場合、右端の m 桁のみが出力されます。

w がゼロの場合、oldboz サブオプションは無視されます。

oldboz サブオプションを使用すると、BLANK= 指定子および BN と BZ 編集記述子は、Z 編集記述子に影響を与えません。

IBM 拡張 の終り

例 1: 入力での Z 編集の例

Input Format Value0C Z2 127FFF Z4 32767

例 2: 出力での Z 編集の例

Value Format Output Output(with -qxlf77=oldboz) (with -qxlf77=nooldboz)

-1 Z2 FF **12 Z4 000C bbbC

12 Z0 C C0 Z5.0 bbbbb bbbbb0 Z0.0 b b

制御編集記述子

/ (スラッシュ) 編集目的

スラッシュ編集記述子は、現行レコードに関するデータ転送の終わりを示します。繰り返し指定子 (r) のデフォルト値は 1 です。

構文v /

v r/

294 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 321: IBM XL Fortran for Linux, V15.1

規則

順次アクセスを使用して入力用にファイルを関連付ける場合、個々のスラッシュ編集記述子は、次のレコードの先頭にファイルを置きます。

順次アクセスを使用して出力用にファイルを関連付ける場合、個々のスラッシュ編集記述子は、新しいレコードを作成して、新しいレコードの先頭に書き込むファイルを置きます。

直接アクセスを使用して入力または出力用にファイルを関連付ける場合、個々のスラッシュ編集記述子は、1 つずつレコード番号を増やし、そのレコード番号を持つレコードの先頭にファイルを置きます。

Fortran 2003

ストリーム・アクセスを使用して入力用にファイルを関連付ける場合、個々のスラッシュ編集記述子は、現行レコードの残りの部分をスキップして、次のレコードの先頭にファイルを置きます。ストリーム・アクセス用に関連付けられたファイルに出力する場合、新規に作成された空のレコードが現行レコードに続きます。新しいレコードは、ファイルの現行レコードおよび最終レコードとなります。ファイルは、新しいレコードの先頭に置かれます。

Fortran 2003 の終り

例500 FORMAT(F6.2 / 2F6.2)100 FORMAT(3/)

: (コロン) 編集目的

コロン編集記述子は、項目が入出力リストになくなると、形式制御を終了します。コロンが検出された時に、入出力リストに項目が残っている場合、コロンは無視されます。

構文v :

規則

詳しくは、 275ページの『入出力リストと形式仕様の相互作用』を参照してください。

例10 FORMAT(3(:'Array Value',F10.5)/)

第 10 章 入出力の形式設定 295

Page 322: IBM XL Fortran for Linux, V15.1

$ (ドル記号) 編集 (IBM 拡張)目的

ドル記号編集記述子は、順次または定様式ストリームの WRITE ステートメントに対してレコード終了処理を禁止します。

構文v $

規則

通常、形式仕様の終わりに達すると、現行レコードのデータ伝送が中止され、次の入出力操作が新しいレコードを処理されるように、ファイルが置かれます。しかし、形式仕様でドル記号がある場合、自動的なレコード終了処置は抑制されます。後続の入出力ステートメントによって、同じレコードへの書き込みを続行できます。

応答に対してプロンプトを出したり、同じ行から応答を読み取るということが、ドル記号編集の一般的な使用方法です。

WRITE(*,FMT='($,A)')'Enter your age 'READ(*,FMT='(BN,I3)')IAGEWRITE(*,FMT=1000)

1000 FORMAT('Enter your height: ',$)READ(*,FMT='(F6.2)')HEIGHT

BN (ブランク・ヌル) および BZ (ブランク・ゼロ) 編集目的

BN および BZ 編集記述子は、後で処理される I、F、E、EN、ES、D、G、B、O、Z、および拡張精度 Q 編集記述子によって、非先行ブランクの変換処理を制御します。BN および BZ は、入力にのみ影響します。

構文v BN

v BZ

規則

BN は、数値入力フィールド内のブランクが無視されて、残りの文字が右寄せされているように、それらが解釈されるように指定します。すべてがブランクのフィールドには、値ゼロが入ります。

BZ は、数値入力フィールド内の非先行ブランクがゼロとして解釈されるように指定します。

ブランク変換処理の初期設定は、OPEN ステートメントの BLANK= 指定子によって決定されます。( 460ページの『OPEN』を参照。) 初期設定は、以下のように決定されます。

296 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 323: IBM XL Fortran for Linux, V15.1

v BLANK= を指定しない場合、ブランク変換処理は、BN 編集が指定された場合と同じになります。

v BLANK= を指定する場合、ブランク変換処理は、指定子の値が NULL の時は、BN 編集が指定された場合と同じに、指定子の値が ZERO の時は、BZ 編集が指定された場合と同じになります。

ブランク変換処理の初期設定は、定様式 READ ステートメントの先頭から、BN または BZ 編集記述子が検出されるか、形式制御が終了されるまで、有効です。BNまたは BZ 編集記述子が検出された場合いつでも、別の BN または BZ 編集記述子が検出されるか、形式制御が終了するまで、新しい設定が有効になります。

-qxlf77 コンパイラー・オプションの oldboz サブオプションを指定する場合、BN および BZ 編集記述子は、B、O、または Z 編集記述子で編集されたデータ入力には影響を与えません。ブランクは、ゼロとして解釈されます。

DC および DP (10 進) 編集 (Fortran 2003)目的

DC および DP の 10 進編集記述子は、10 進編集モードを、それぞれ、小数点を表すコンマとピリオドに変更します。

構文v DC

v DP

規則

10 進編集記述子は、定様式入出力で 10 進記号の表記を制御するのに使用されます。小数点を表すコンマまたはピリオドは、対応する編集記述子が検出される場合、有効です。これらは、別の DC または DP 編集記述子が検出されるか、現行入出力ステートメントが終わりに達するまで、有効です。

例program main

real :: pi=3.14print '(t2, dp, f4.2)', piprint '(t2, dc, f4.2)', pi

end program

Output3.143,14

P (スケール因数) 編集目的

スケール因数、k は、別のスケール因数が検出されるか、形式制御が終了するまで、後で処理されるすべての F、E、EN、ES、D、G、および拡張精度 Q 編集記述子に適用されます。個々の入出力ステートメントの先頭で、k の値はゼロです。これは、10 の累乗を表す、オプションの符号付き整数値です。

第 10 章 入出力の形式設定 297

Page 324: IBM XL Fortran for Linux, V15.1

構文v kP

規則

入力の場合、F、E、EN、ES、D、G、または拡張精度 Q 編集記述子を使用した入力フィールドに、指数が含まれている時、スケール因数は無視されます。それ以外では、内部値は、10(-k) で乗算した外部値に等しくなります。

出力の場合。

v F 編集では、外部値は、10k で乗算した内部値に等しくなります。

v E、D、および拡張精度 Q 編集では、外部 10 進フィールドは、10k で乗算されます。指数は、k によって削減されます。

v G 編集では、フィールドが、F 編集の使用が可能な範囲外にある場合を除いて、そのフィールドはスケール因数の影響を受けません。E 編集を使用する必要がある場合、スケール因数は E 出力編集と同じ効果を持ちます。

v EN および ES 編集では、スケール因数は、何にも影響しません。

例 1: 入力での P 編集の例

Input Format Value98.765 3P,F8.6 .98765E-198.765 -3P,F8.6 98765..98765E+2 3P,F10.5 .98765E+2

例 2: 出力での P 編集の例

Value Format Output Output(with -qxlf77=noleadzero) (with -qxlf77=leadzero)

5.67 -3P,F7.2 bbbb.01 bbb0.0112.34 -2P,F6.4 b.1234 0.123412.34 2P,E10.3 b12.34E+00 b12.34E+00

RC、RD、RN、RP、RU、および RZ (丸め) 編集 (Fortran 2003)目的

丸め編集記述子は、FORMAT ステートメントで使用され、RC、RD、RN、RP、RU、および RZ のいずれかになります。これは、それぞれ、COMPATIBLE、DOWN、NEAREST、PROCESSOR_DEFINED、UP、および ZERO 丸めモードに相当します。丸め編集記述子は、一時的に、定様式入出力での関連付け丸めモードを変更します。丸め編集記述子は、D、E、ES、EN、F および G 編集にのみ影響を与えます。

構文v RC

v RD

v RN

v RU

v RZ

298 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 325: IBM XL Fortran for Linux, V15.1

規則

丸め編集記述子のヘルプによって、定様式入出力中に、文字表記から 10 進数を内部表記 (すなわち、2 進数) へ変換する方法およびその逆にする方法を指定します。

例program main

real :: i100 format (f10.7, ru )open(UNIT=2,file ='temp.txt', form='formatted', round='compatible' )read(UNIT=2, 100) iprint '(f10.7 , ru)' i

end program

Input - temp.txt3.1415926Output - temp.txt3.1415928

S、SP、および SS (符号制御) 編集目的

S、SP、および SS 編集記述子は、別の S、SP、または SS 検出されるか、形式制御が終了するまで、後に処理されるすべての I、F、E、EN、ES、D、G、および拡張精度 Q 編集記述子による正符号の出力を制御します。

符号制御編集記述子は、関連付けのため、SIGN= 指定子で設定された SIGN モードを一時的に上書きします。S、SP、および SS 編集記述子は、SIGN= 指定子のデフォルトの値として、それぞれ PLUS および SUPPRESS に対応する符号モードを設定します。

構文v S

v SP

v SS

規則

S および SS によって、正符号の書き込みをしないことを指定します。 (これらの結果は同じになります。) SP によって、正符号の書き込みをすることを指定します。

例Value Format Output12.3456 S,F8.4 b12.345612.3456 SS,F8.4 b12.345612.3456 SP,F8.4 +12.3456

T、TL、TR、および X (定位置) 編集目的

T、TL、TR、および X 編集記述子によって、次の文字からレコードへ、またはレコードから次の文字への転送が開始する位置を指定します。

第 10 章 入出力の形式設定 299

Page 326: IBM XL Fortran for Linux, V15.1

構文v Tc

v TLc

v TRc

v oX

規則

T および TL 編集記述子は、ファイルの位置決めのための左のタブ制限を使用します。子以外のデータ転送の直前に、左のタブ制限の定義は、現行レコードの文字位置か、ストリーム・ファイルの現在位置になります。T、TL、TR、および X によって、以下のような文字位置を指定します。

v Tc の場合、左のタブ制限に関連した、レコードの c 番目の文字位置。

v TLc の場合、c が、現行文字位置と左のタブ制限間の差よりも大きい場合を除いて、現在位置から c 文字分、前へ戻った位置。レコードへの、またはレコードからの次の文字への伝送は、左のタブ制限で行われます。

v TRc の場合、現在位置から c 文字先の位置。

v oX の場合、現在位置から o 文字先の位置。

TR および X 編集記述子の結果は同じです。

入力の場合、TR または X 編集記述子によって、その位置から転送する文字がない場合、レコードの最後の文字の後に位置を指定できます。

出力の場合、T、TL、TR、または X 編集記述子によって、自動的に、文字を転送させることはありません。文字が編集記述子によって指定された位置以降に転送される場合、スキップされた位置および前に埋められていない位置がブランクで埋められます。結果は、レコード全体がブランクで最初に埋められたのと同じになります。

出力の場合、T、TL、TR、または X 編集記述子を使用した結果、他の編集記述子を使用する後続の編集で、文字が置き換えされるように位置変更ができます。

IBM 拡張

X 編集記述子は、文字位置なしで指定できます。これは、1X として処理されます。ソース・ファイルを -qlanglvl=90std または -qlanglvl=95std でコンパイルする場合、この拡張機能は、すべてのコンパイル時形式仕様で無効になり、oX の場合が実行されます。ランタイム形式でこの拡張機能を無効にするには、以下の実行時オプションを設定する必要があります。

XLFRTEOPTS="langlvl=90std" or "langlvl=95std" ; export XLFRTEOPTS

IBM 拡張 の終り

例 1: 入力での T、TL、および X 編集の例

300 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 327: IBM XL Fortran for Linux, V15.1

150 FORMAT(I4,T30,I4)200 FORMAT(F6.2,5X,5(I4,TL4))

例 2: 出力での T、TL、TR、および X 編集の例

50 FORMAT('Column 1',5X,'Column 14',TR2,'Column 25')100 FORMAT('aaaaa',TL2,'bbbbb',5X,'ccccc',T10,'ddddd')

リスト指示の形式設定リスト指示の形式設定では、読み取りまたは書き込みが行われるデータの長さおよび型を使用して編集処理を制御できます。リスト指示形式設定を使用できるのは、順次または ストリーム・アクセスの場合のみです。

リスト指示の形式設定には、アスタリスクの形式識別子を使用します。以下に例を示します。

REAL TOTAL1, TOTAL2PRINT *, TOTAL1, TOTAL2

値のセパレーター定様式レコードにリスト指示形式設定を指定した場合、そのレコードは、一連の値と、値のセパレーターで構成されます。

説明:

値 定数またはヌルです。

値の区切り文字レコード内の値と値の間に入れるコンマ、スラッシュ、セミコロン、または連続するブランクの集合です。コンマまたはスラッシュの前後には、1 つ以上のブランクを指定できます。10 進コンマ・モードが有効な場合、コンマではなく、セミコロンが値のセパレーターになります。

ヌル 次のいずれかになります。

v コンマを 2 つ連続した場合。途中にブランクが入ることもあります。

v コンマ、スラッシュと続けた場合。途中にブランクが入ることもあります。

v レコードの先頭をコンマにした場合。このコンマの前にブランクが入ることもあります。

ヌル値は、対応する入力リスト項目の定義状況に影響を与えません。

リスト指示入力リスト指示の READ ステートメント中の有効入力リスト項目は、 定様式レコード内の対応する値によって定義されます。それぞれの値の構文は、対応する有効入力リスト項目の型と一致する必要があります。

表 31. リスト指示入力

構文 型

c 組み込み型のリテラル定数または区切りのない文字定数。

r * r は、ゼロ以外の符号なし整数のリテラル定数です。r * は、ヌル値が r 個続けて出現することを示します。

第 10 章 入出力の形式設定 301

Page 328: IBM XL Fortran for Linux, V15.1

表 31. リスト指示入力 (続き)

r * c 定数が r 個続けて出現することを示します。

リスト指示入力に関する規則c または r に対しては、kind 型パラメーターを指定してはなりません。

リスト指示形式設定では、ブランクが文字値内にある場合を除き、複数の連続したブランクを単一のブランクとして解釈します。

定数 c は、対応するリスト項目と同じ kind 型パラメーターを持ちます。

-qintlog コンパイラー・オプションを使用すると、整数または論理型のいずれかの入力項目の整数値または論理値を指定できます。

リスト指示形式設定は、構造体コンポーネントのすべてが派生型定義と同じ順序で指定されている場合と同様に、入力リストに指定されている派生型のオブジェクトを解釈します。派生型の最終コンポーネントは、ポインター または割り振り可能な 属性があってはなりません。

スラッシュは入力リストの終わりを示し、リスト指示の形式設定を終了します。スラッシュの後の追加の入力リスト項目は、ヌル値として評価されます。子の READステートメントによってスラッシュが検出された場合、そのスラッシュは、その特定の子の READ ステートメントのみに対する入力リストの終わりを示します。スラッシュの後のレコード内に他の入力があっても、無視されます。このスラッシュは、ユーザー定義の派生型入出力プロシージャー内、または親 READ ステートメント内の他の子 READ ステートメントには作用しません。

文字値の継続以下の条件を満たす文字値は、必要な任意の数のレコードでその値を継続することができます。

v 派生型の次の項目または最終コンポーネントが文字型である。

v その文字定数が、値のセパレーターであるブランク、コンマ、またはスラッシュを含まない。

v その文字定数が、レコードの境界にまたがらない。

v 最初の非ブランク文字が、引用符またはアポストロフィではない。

v 先行文字が、数値ではなく、その後にアスタリスクが続く。

v その文字定数が 1 つ以上の文字を含む。

複数のレコードにまたがって同じ文字値を連続する場合、区切り文字のアポストロフィまたは引用符は必要ありません。区切り文字を省略した場合、文字定数は最初のブランク、コンマ、スラッシュ、またはレコードの終わりで終了になります。

区切り文字のアポストロフィまたは引用符を指定しない場合、文字値内のアポストロフィと二重引用符は重ね書きしません。

レコードの終わりとリスト指示入力リスト指示入力では、レコードの終わりは、ブランクが文字リテラル定数または複素数リテラル定数内にある場合を除いて、ブランク・セパレーターと同じ効果があ

302 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 329: IBM XL Fortran for Linux, V15.1

ります。レコードの終わりでは、ブランクまたはその他の文字を文字値に挿入されません。レコードの終わりは、アポストロフィで区切られた文字シーケンスの二重アポストロフィの間、または引用符で区切られた文字シーケンスの二重引用符の間にあってはなりません。

リスト指示出力リスト指示の PRINT および WRITE ステートメントは、出力リストと同じ順序で値を出力します。値は、各出力リスト項目のデータ型として有効な形式で書き込まれます。

リスト指示出力の型

表 32. リスト指示出力

データ型 出力の形式

配列 桁の大きい順

文字演算子 DELIM= 指定子とファイル・タイプによって異なります。『文字出力』を参照してください。

複素数 実数部と虚数部がコンマで区切られ、括弧で囲まれます。E または F 編集を使用します。

派生型 ユーザー定義の派生型入出力プロシージャー。

整数 I 編集を使用します。

論理演算子 真の値の場合、T。偽の値の場合、F。

実数 E または F 編集を使用します。

リスト指示の文字出力文字定数の出力は、OPEN または READ ステートメントの DELIM= 指定子に応じて変わります。

DELIM= 指定子なしでオープンされたファイル、または DELIM= 指定子に値NONE を指定してオープンされたファイルへの文字定数出力は、以下のようになります。

v 値はアポストロフィまたは引用符で区切られません。

v 値と値の間に値のセパレーターは使用されません。 値のセパレーターは、リスト指示の親ステートメントが設定された形式指示の子入出力ステートメントの出力の前後に生成されます。

v 内部的なアポストロフィまたは二重引用符は、それぞれ 1 つのアポストロフィまたは二重引用符として出力されます。

v プロセッサーは、先行するレコードから文字定数を継続するレコードの先頭に、紙送り制御を行うためのブランク文字を挿入します。

注: 区切りのない文字データは、リスト指示入力を使用しても、正しく読み返すことができない場合があります。使用に際しては、十分注意してください。

第 10 章 入出力の形式設定 303

Page 330: IBM XL Fortran for Linux, V15.1

二重引用符は、DELIM= 指定子に値 QUOTE を指定してオープンされたファイルの文字定数の区切り文字になります。値のセパレーターが、この区切り文字の後に続きます。各内部引用符は、 2 つの連続する二重引用符として出力されます。

アポストロフィは、DELIM= 指定子に値 APOSTROPHE を指定してオープンされたファイルの文字定数の区切り文字になります。値のセパレーターが、この区切り文字の後に続きます。各内部アポストロフィは、2 つの連続するアポストロフィとして出力されます。

リスト指示出力に関する規則各出力レコードは、先頭がブランク文字になります。このブランク文字は、そのレコードが出力されるときに紙送り制御を行います。

レコードの終わりは、文字でも複素数でもない定数内に使用してはなりません。

複素定数では、レコードの終わりは、定数がレコードの長さ以上である場合にのみ、コンマと定数の虚数部との間に使用できます。複素定数内で使用できる埋め込みブランクは、コンマとレコードの終わりの間の 1 ブランク、および次のレコードの始めの 1 ブランクのみです。

ブランクは、文字でも複素数でもない定数内に使用してはなりません。

ヌル値は、出力ではありません。

値のセパレーターとして指定するスラッシュは、出力ではありません。

IBM 拡張

ユーザー定義派生型の入出力プロシージャーが関与しない出力の場合、以下の書き込みフィールドの幅 の表に、さまざまなデータ型および長さに対する書き込みフィールドの幅が示されています。レコードのサイズは、フィールド幅の合計に各非文字フィールドを区切る 1 バイトを加えたものになります。

表 33. 書き込みフィールドの幅

データ型長さ(バイト)

最大フィールド幅(文字数)

小数部(10 進数の桁数)

精度/IEEE(10

進数の桁数)

整数1

2

4

8

4

6

11

20

適用外適用外適用外適用外

適用外適用外適用外適用外

実4

8

16

17

26

43

10

18

35

7

15

31

複素数8

16

32

37

55

89

10

18

35

7

15

31

304 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 331: IBM XL Fortran for Linux, V15.1

表 33. 書き込みフィールドの幅 (続き)

データ型長さ(バイト)

最大フィールド幅(文字数)

小数部(10 進数の桁数)

精度/IEEE(10

進数の桁数)

論理1

2

4

8

1

1

1

1

適用外適用外適用外適用外

適用外適用外適用外適用外

文字 n n 適用外 適用外

IBM 拡張 の終り

名前リストの形式設定名前リストの形式設定では、NAMELIST ステートメントの一部として NAME= 指定子を使用して名前を変数の集合に割り当てることができます。この名前は、入出力の変数の集合全体を表します。また、名前リストの形式設定では、ユーザーがデータを利用しやすくするため、入力と共に名前リスト・コメントを入れることができます。

v Fortran 90 および Fortran 95 では、名前リストの形式設定を使用できるのは、順次アクセスの場合のみです。

v Fortran 2003 標準 では、順次アクセスおよびストリーム・アクセスで名前リストの形式設定を使用できます。

v Fortran 2003 標準 では、内部ファイルと共に名前リストの形式設定を使用できます。

名前リスト入力名前リスト入力の形式は、次のとおりです。

1. オプションのブランクおよび名前リストのコメント。

2. アンパーサンド文字、およびそれに続けて NAMELIST ステートメント内で指定された名前リスト・グループ名。

3. 1 つ以上のブランク。

4. 値のセパレーターで区切られた、ゼロ個以上の 名前値サブシーケンスの並び。

5. 名前リスト入力を終了するためのスラッシュ。

区切られた文字定数を継続する入力レコードの先頭のブランクは、その定数の一部と見なされます。

NAMELIST=OLD 実行時オプションを指定した場合の NAMELIST ステートメントの入力形式は、以下のとおりです。

1. オプションのブランク

2. アンパーサンドまたはドル記号、およびそれに続けて NAMELIST ステートメント内で指定された名前リスト・グループ名。

3. 1 つ以上のブランク。

第 10 章 入出力の形式設定 305

Page 332: IBM XL Fortran for Linux, V15.1

4. 1 つのコンマで区切られた、ゼロ個以上の 名前値サブシーケンスの並び。コンマは、最後の名前値サブシーケンスの後に挿入できます。

5. 名前リスト入力を終了するための &END または $END。

各入力レコードの最初の文字は、ブランクになります。この中には、区切り文字で区切られた文字定数を継続するレコードも含まれます。

名前リスト・コメントFortran 95 以上では、名前リストにコメントを使用できます。

コメントは、ストリーム入力内には指定できません。

NAMELIST=NEW 実行時オプションを指定した場合、次のようになります。

v スラッシュ以外の値のセパレーターの後に感嘆符を指定するか、または名前リスト入力レコードの最初の非ブランク位置に感嘆符を指定すると、コメントが開始されます。文字リテラル定数内では、コメントを開始することはできません。

v コメントはその入力レコードの終わりまで続き、コメントには XL Fortran の文字セット内にあるどの文字でも入力可能です。

v コメントは、処理されずに無視されます。

v 名前リストのコメント内にスラッシュがあっても、そのようなスラッシュには、その名前リスト入力ステートメントの実行を終了する機能はありません。

NAMELIST=OLD 実行時オプションを指定した場合、次のようになります。

v 単一のコンマの後に感嘆符を指定するか、または名前リスト入力レコードの最初の非ブランク位置 (ただし、入力レコードの最初の文字ではない位置) に感嘆符を指定すると、コメントが開始されます。文字リテラル定数内では、名前リストのコメントは開始できません。

v コメントはその入力レコードの終わりまで続き、コメントには XL Fortran の文字セット内にあるどの文字でも入力可能です。

v コメントは、処理されずに無視されます。

v 名前リストのコメント内に &END または $END があっても、その名前リスト入力ステートメントの実行を終了する機能はありません。

名前値サブシーケンス入力レコード内の名前値サブシーケンスの形式は、次のとおりです。

name 変数です。

�� name = constant_list ��

306 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 333: IBM XL Fortran for Linux, V15.1

constant

次の形式をとります。

r literal_constant の出現回数を指定する符号なし、ゼロ以外のスカラー整数リテラル定数です。 r に kind 型パラメーターを指定してはなりません。

literal_constant

組み込み型のスカラー・リテラル定数か、またはヌル値です。定数の場合、kind 型パラメーターを指定してはなりません。定数は、対応するリスト項目と同じ kind 型パラメーターで評価されます。

literal_constant が文字型の場合、区切り文字としてアポストロフィまたは引用符を指定する必要があります。

literal_constant が論理型の場合は、T または F を指定することができます。

名前リスト入力に関する規則name を修飾する添え字、ストライド、およびサブストリングの範囲式は、kind 型パラメーターが指定されていない整数リテラル定数でなければなりません。

name が、配列、派生型オブジェクトのいずれでもない場合、constant_list は、単一の定数でなければなりません。

入力ファイルに指定されている変数名は、NAMELIST ステートメントのvariable_name_list に指定する必要があります。変数は任意の順序で指定できます。

EQUIVALENCE ステートメントに指定した名前が、ストレージを name と共用する場合、variable_name_list にあるその名前を置き換えてはなりません。

name の前後には、1 つ以上のブランクを入れることはできますが、 name 内にブランクを埋め込むことはできません。

各名前値サブシーケンスでは、名前はオプションの修飾子付きの名前リスト・グループ項目の名前でなければなりません。オプションの修飾付きの名前は、以下であってはなりません。

v ゼロ・サイズ配列

v サイズがゼロの配列セクション

v 長さゼロの文字ストリング

オプションの修飾を指定する場合、その修飾にベクトル添え字 を入れてはなりません。

��r *

literal_constant ��

第 10 章 入出力の形式設定 307

Page 334: IBM XL Fortran for Linux, V15.1

name が配列、ベクトル添え字のない配列セクション、または構造体の場合、 name

は、 274ページの『有効リスト項目 (Fortran 2003)』で概説した規則に従った組み込みデータ型のスカラー・リスト項目のシーケンスが適用可能であれば、そのシーケンスに展開されます。

name が、配列または構造体の場合、constant_list 内の定数の数は、 name の拡張で指定した項目数以下になります。定数の数が項目数を下回る場合は、残りの項目は前の値を保持します。

ヌル値は、以下のいずれかの方法で指定できます。

v r* 形式を使用する。この場合、ヌル値が r 個続けて出現します。

v 等号に続けて 2 つの値のセパレーターを指定し、セパレーターの間にブランクを入れる。

v 等号に続けて、ゼロ個以上のブランクを入れ、その後に最初の値セパレーターを指定する。

v 非ブランクの値セパレーターを 2 つ続けて指定する。

ヌル値は、対応する入力リスト項目の定義状況に影響を与えません。名前リスト・グループ・オブジェクトのリスト項目が定義される場合、前の値が保持されます。定義されない場合は、未定義状態のままになります。

10 進コンマ・モードが有効な場合、コンマではなく、セミコロンが値のセパレーターとして機能します。

ヌル値は、複素定数の実数部または虚数部として使用してはなりません。単一のヌル値で、複素定数全体を表すことができます。

1 つの値のセパレーターの後にレコードの終わりがある場合、ブランクが途中に入るか否かにかかわらず、ヌル値は指定されません。

IBM 拡張

LANGLVL=EXTENDED 実行時オプションを設定すると、XL Fortran によって複数の入力値を単一の配列エレメントと共に指定できます。XL Fortran では、配列エレメントの順序で、その配列の連続エレメントに値を代入します。配列エレメントで、サブオブジェクトの指定子を指定してはなりません。

例として、配列 A を次のように宣言します。

INTEGER A(100)NAMELIST /FOO/ AREAD (5, FOO)

装置 5 には、次のような入力が入っているとします。

&FOOA(3) = 2, 10, 15, 16/

READ ステートメントの実行時、XL Fortran では、次のように値の代入を行います。

v 2 を A(3) に

v 10 を A(4) に

308 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 335: IBM XL Fortran for Linux, V15.1

v 15 を A(5) に

v 16 を A(6) に

複数の値を単一の配列エレメントと共に指定する場合、論理定数は、「.T」のように、その前にピリオドを付けて指定する必要があります。

実行時に NAMELIST=OLD オプションを指定した場合、 OPEN または READ ステートメントの BLANK= 指定子によって、XL Fortran が文字以外の定数間の埋め込みブランクと末尾ブランクをどのように解釈するかが決定されます。

-qmixed コンパイラー・オプションを指定した場合、名前リストのグループ名およびリスト項目名は、大文字と小文字が区別されます。

IBM 拡張 の終り

値のセパレーターとしてスラッシュが検出されると、前の値の代入が行われた後にその入力ステートメントが終了されます。名前リストのグループ・オブジェクトに追加項目があった場合、それらはヌル値を受け取ります。

名前リスト入力データの例ファイル NMLEXP には、READ ステートメントの実行の前に、次のデータが入っています。

文字位置:

1 2 31...+....0....+....0....+....0

ファイルの内容:

&NAME1I=5,SMITH%P_AGE=27/

NMLEXP には、4 つのデータ・レコードが入っています。プログラムには、次のコードが記載されています。

TYPE PERSONINTEGER P_AGECHARACTER(20) P_NAME

END TYPE PERSONTYPE(PERSON) SMITHNAMELIST /NAME1/ I,J,K,SMITHI=1J=2K=3SMITH=PERSON(20,'John Smith')OPEN(7,FILE='NMLEXP')READ(7,NML=NAME1)! Only the value of I and P_AGE in SMITH are! altered (I = 5, SMITH%P_AGE = 27).! J, K and P_NAME in SMITH remain the same.END

注: 前の例では、データ項目は別個のデータ・レコードに指定されています。次の例は、同一のデータ項目を持つファイルで、1 つのデータ・レコードになっています。

第 10 章 入出力の形式設定 309

Page 336: IBM XL Fortran for Linux, V15.1

文字位置:

1 2 3 41...+....0....+....0....+....0....+....0

ファイルの内容:

&NAME1 I= 5, SMITH%P_AGE=40 /

NAMELIST=NEW を指定したときの NAMELIST コメントの例。コメントは、値のセパレーターのスペースの後に指定されています。

&TODAY I=12345 ! これは、コメントです。/X(1)=12345, X(3:4)=2*1.5, I=6,P="!ISN'T_BOB'S", Z=(123,0)/

NAMELIST=OLD を指定したときの NAMELIST コメントの例。コメントは、値のセパレーターのスペースの後に指定されています。

&TODAY I=12345, ! これは、コメントです。X(1)=12345, X(3:4)=2*1.5, I=6,P="!ISN'T_BOB'S", Z=(123,0) &END

名前リスト出力WRITE ステートメントは、データ型に従って、NAMELIST ステートメントのvariable_name_list からデータを出力します。このデータは、区切り文字で区切られていない文字データを除き、 名前リスト入力を使用して読み取ることができます。

名前リスト出力には、単一の長い文字変数を指定してはなりません。

各出力レコードは、直前のレコードから区切り文字で区切られている文字定数を継続していない場合、その先頭は、紙送りを制御するブランク文字となります。

出力データ・フィールドは、書き込みフィールドの幅 の表に示されているように、すべての有効数字を入れるのに十分な大きさになります。

完全な配列の値は、桁の大きい順に出力されます。

配列エレメントの長さが、データを保持するのに十分でない場合は、4 つ以上のエレメントを持つ配列を指定する必要があります。

variable_name_list を指定した WRITE ステートメントは、少なくとも以下の 3 件の出力レコードを作成します。

v 名前リスト名を含むレコード (1 レコード)。

v 出力データ項目を含むレコード (1 レコード以上)。

v 出力を終了させるスラッシュを含むレコード (1 レコード)。

名前リスト・データを内部ファイルに出力するには、そのファイルは、少なくとも3 つのエレメントが入っている文字配列でなければなりません。WRITE ステートメントを使用してデータを内部ファイルに転送する場合、文字配列には 4 つ以上のエレメントが必要になる可能性があります。

文字データは、OPEN または READ ステートメントの DELIM= 指定子を使用して区切ることができます。

310 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 337: IBM XL Fortran for Linux, V15.1

名前リストの文字出力文字定数の出力は、OPEN または READ ステートメントの DELIM= 指定子に応じて変わります。

DELIM= 指定子なしでオープンされたファイル、または、DELIM=NONE を指定してオープンされたファイル内の文字定数の場合は、次のようになります。

v 値はアポストロフィまたは引用符で区切られません。

v 値と値の間に値のセパレーターは使用されません。

v 内部的なアポストロフィまたは二重引用符は、それぞれ 1 つのアポストロフィまたは引用符として出力されます。

v XL Fortran では、先行するレコードから文字定数を継続するレコードの先頭に、紙送り制御を行うためのブランク文字を挿入します。

書き込まれたデータで、区切りのない文字データは、文字データとして読み取ることはできません。

二重引用符は、DELIM=QUOTE に各定数の前後に値のセパレーターを指定してオープンされたファイルの文字定数の区切り文字になります。各内部引用符は、2 つの連続する引用符として出力されます。

アポストロフィは、DELIM=APOSTROPHE に各定数の前後に値のセパレーターを指定してオープンされたファイルの文字定数の区切り文字になります。各内部アポストロフィは、2 つの連続するアポストロフィとして出力されます。

名前リスト出力に関する規則文字変数がすべてのデータを保持できる長さであっても、名前リスト・データを内部ファイルに出力する場合に単一の文字変数を指定してはなりません。

NAMELIST 実行時オプションを指定しなかった場合、または NAMELIST=NEWを指定した場合、名前リスト・グループ名および名前リスト項目名は、大文字で出力されます。

IBM 拡張

実行時に NAMELIST=OLD オプションを指定した場合、次のようになります。

v 名前リスト・グループ名と名前リスト項目名は、小文字で出力されます。

v &END によって、出力レコードが終了されます。

実行時に NAMELIST=OLD を指定し、 OPEN または READ ステートメントにDELIM= 指定子を使用しなかった場合は、次のようになります。

v アポストロフィが、文字データの区切り文字になります。

v アポストロフィが、区切り文字で区切られていない文字ストリングの区切り文字になります。各文字ストリング間ではコンマが区切り文字として使用されます。

v 直前のレコードから続いている文字ストリングでレコードが開始されている場合、そのレコードの先頭にブランクは追加されません。

第 10 章 入出力の形式設定 311

Page 338: IBM XL Fortran for Linux, V15.1

-qmixed コンパイラー・オプションを使用した場合、名前リスト・グループ名は、NAMELIST 実行時オプションの値とは無関係に、大文字と小文字が区別されます。

出力レコードを指定の幅に制限するには、OPEN ステートメントで RECL= 指定子を使用するか、または NLWIDTH 実行時オプションを使用します。

デフォルトでは、外部ファイルのすべての出力項目が、1 つの出力レコードに記載されます。レコードを別々の行に出力するようにするには、OPEN ステートメントで RECL= 指定子を使用するか、または NLWIDTH 実行時オプションを使用します。

10 進コンマ・モードが有効な場合、コンマではなく、セミコロンが値のセパレーターとして機能します。

IBM 拡張 の終り

名前リスト出力データの例TYPE PERSON

INTEGER P_AGECHARACTER(20) P_NAME

END TYPE PERSONTYPE(PERSON) SMITHNAMELIST /NL1/ I,J,C,SMITHCHARACTER(5) :: C='BACON'INTEGER I,JI=12046J=12047SMITH=PERSON(20,'John Smith')WRITE(6,NL1)END

WRITE ステートメントに NAMELIST=NEW を指定して実行すると、出力データは次のようになります。

1 2 3 41...+....0....+....0....+....0....+....0&NL1I=12046, J=12047, C=BACON, SMITH=20, John Smith/

WRITE ステートメントに NAMELIST=OLD を指定して実行すると、出力データは次のようになります。

1 2 3 41...+....0....+....0....+....0....+....0&nl1i=12046, j=12047, c='BACON', smith=20, 'John Smith '&end

312 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 339: IBM XL Fortran for Linux, V15.1

第 11 章 ステートメントおよび属性

このセクションには、すべての XL Fortran ステートメントへの参照が、アルファベット順に記載されています。各ステートメントのセクションは、ユーザーが構文や規則に直ちにアクセスできるように編成されており、ステートメントの構造体および使用方法を示しています。

下表に、ステートメントをリストし、どれが実行可能であるか、どれがspecification_part ステートメントであるか、またどれを DO、 F2008 DOCONCURRENT F2008 、または DO WHILE のいずれかの構文の終端ステートメントとして使用できるかを示します。実行可能ステートメント、仕様ステートメント、および終端ステートメントには「'」マークが付いています。

表 34. ステートメントの表

ステートメント名実行可能ステート

メント仕様ステートメ

ント終端ステートメン

ABSTRACT �1� '

ALLOCATABLE �1� '

ALLOCATE ' '

ASSIGN '

ASSOCIATE �1� '

ASYNCHRONOUS �2� '

AUTOMATIC �2� '

BACKSPACE ' '

BIND �1� '

BLOCK �3�

BLOCK DATA

BYTE �2� '

CALL ' '

CASE '

CHARACTER '

CLASS �1� '

CLOSE ' '

COMMON '

COMPLEX '

CONTAINS

CONTIGUOUS �3� '

CONTINUE ' '

CYCLE '

DATA '

DEALLOCATE ' '

派生型

© Copyright IBM Corp. 1996, 2015 313

Page 340: IBM XL Fortran for Linux, V15.1

表 34. ステートメントの表 (続き)

ステートメント名実行可能ステート

メント仕様ステートメ

ント終端ステートメン

DIMENSION '

DO '

DO CONCURRENT�3� '

DO WHILE '

DOUBLE COMPLEX �2� '

DOUBLE PRECISION '

ELSE '

ELSE IF '

ELSEWHERE '

END '

END ASSOCIATE �1� '

END BLOCK DATA

END DO ' '

END ENUM �1� '

END IF '

END FORALL '

END FUNCTION '

END INTERFACE '

END MAP �2� '

END MODULE

END PROGRAM '

END SELECT '

END SUBMODULE �3�

END SUBROUTINE '

END STRUCTURE �2� '

END TYPE '

END UNION �2� '

END WHERE '

ENDFILE ' '

ENTRY '

ENUM �1� '

ENUMERATOR �1� '

EQUIVALENCE '

ERROR STOP �3� '

EXIT '

EXTERNAL '

FLUSH �1� ' '

FORALL ' '

FORMAT '

314 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 341: IBM XL Fortran for Linux, V15.1

表 34. ステートメントの表 (続き)

ステートメント名実行可能ステート

メント仕様ステートメ

ント終端ステートメン

FUNCTION

GO TO (代入) '

GO TO (計算) ' '

GO TO (無条件) '

IF (算術) '

IF (ブロック) '

IF (論理) ' '

IMPLICIT '

IMPORT �1� '

INQUIRE ' '

INTEGER '

INTENT '

INTERFACE '

INTRINSIC '

LOGICAL '

MAP �2� '

MODULE

MODULE PROCEDURE �3�

NAMELIST '

NULLIFY ' '

OPEN ' '

OPTIONAL '

PARAMETER '

PAUSE ' '

POINTER (Fortran 90) '

POINTER (整数) �2� '

PRINT ' '

PRIVATE '

PROCEDURE �1� '

PROGRAM

PROTECTED �1� '

PUBLIC '

READ ' '

REAL '

RECORD �2� '

RETURN '

REWIND ' '

SAVE '

SELECT CASE '

第 11 章 ステートメントおよび属性 315

Page 342: IBM XL Fortran for Linux, V15.1

表 34. ステートメントの表 (続き)

ステートメント名実行可能ステート

メント仕様ステートメ

ント終端ステートメン

SELECT TYPE �1� '

SEQUENCE '

ステートメント関数 '

STATIC �2� '

STOP '

SUBMODULE �3�

SUBROUTINE

STRUCTURE �2� '

TARGET '

TYPE '

型宣言 '

保護型 �1� '

UNION �2� '

USE '

VALUE �1� '

VECTOR �2� '

VIRTUAL �2� '

VOLATILE '

WAIT �1� ' '

WHERE ' '

WRITE ' '

注:�1� Fortran 2003

�2� IBM 拡張�3� Fortran 2008

代入ステートメントとポインター代入ステートメントについては、 113ページの『第 6 章 式および代入』で説明しています。どちらのステートメントも実行可能であり、終端ステートメントとして使用できます。

属性それぞれの属性には、対応する属性仕様ステートメントがあり、その属性のために用意された構文図は、この形式を示しています。エンティティーもまた、型宣言ステートメントから、また場合によっては、デフォルトの設定値によって、この属性を獲得できます。例えば、エンティティー A が PRIVATE 属性を持つには、以下の方法のいずれかで属性を獲得できます。

REAL, PRIVATE :: A ! Type declaration statementPRIVATE :: A ! Attribute specification statement

316 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 343: IBM XL Fortran for Linux, V15.1

MODULE XPRIVATE ! デフォルト設定REAL :: A

END MODULE

ABSTRACT (Fortran 2003)目的

ABSTRACT INTERFACE ステートメントは、抽象インターフェース・ブロックの最初のステートメントです。これによって、これらの特性を使用してプロシージャーを宣言しないでもプロシージャー特性および仮引数名を指定できます。

構文

規則

インターフェース・ステートメントが、ABSTRACT INTERFACE の場合、関数ステートメントの function_name または、サブルーチン・ステートメントのsubroutine-name は、組み込み型を指定するキーワードとは同じになりません。

ABSTRACT INTERFACE には、一般仕様を指定できないので、PROCEDURE ステートメントは、ABSTRACT INTERFACE ブロックでは使用できません。

NAME= 指定子を使用した proc-language-binding-spec は、抽象インターフェース本体の関数またはサブルーチン・ステートメントで指定されません。

ABSTRACT INTERFACE は、据え置き結合に対してインターフェースを宣言するのに使用できます。

ABSTRACT INTERFACEREAL FUNCTION PROC(A, B, C)REAL, INTENT (IN) :: A, B, CEND FUNCTIONEND INTERFACE! P is declared to be a procedure pointer that is! initially null with the same interfaceas procedure PROC.PROCEDURE (PROC),POINTER:: P => NULL()

プロシージャー・ポインター P は、PROC と同じインターフェースを持つ場合、どの外部プロシージャーまたはモジュール・プロシージャーでも指すことができます。

関連情報v 197ページの『抽象インターフェース (Fortran 2003)』

v 448ページの『INTERFACE』

�� ABSTRACT INTERFACE ��

第 11 章 ステートメントおよび属性 317

Page 344: IBM XL Fortran for Linux, V15.1

ALLOCATABLE (Fortran 2003)目的

ALLOCATABLE 属性によって、割り振り可能オブジェクトを宣言できます。ALLOCATE ステートメントを実行することによって、または派生型代入ステートメントによって、これらのオブジェクトのストレージ・スペースを動的に割り振ることができます。オブジェクトが配列である場合、そのオブジェクトは据え置き形状配列または想定ランク配列です。

構文

object_name

割り振り可能オブジェクトの名前です。

deferred_shape_spec

コロンです。各コロンは、次元を表します。

assumed_rank_spec

2 つのピリオド。詳しくは、『Assumed_rank_spec』を参照してください。

規則

オブジェクトは、ポインティング先にしないでください。

オブジェクトが、DIMENSION 属性を使用して有効範囲単位内の他の場所で指定された配列の場合、配列仕様は、deferred_shape_spec または assumed_rank_spec である必要があります。

割り振り可能オブジェクトは、ストレージ・スペースの割り振り後に初期化できます。-qinitalloc を使用してプログラムをコンパイルすると、割り振り済みのすべての未初期化オブジェクトが初期化されます。

表 35. ALLOCATABLE 属性と互換性のある属性

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PRIVATE STATIC �2�

DIMENSION PROTECTED �1� TARGET

INTENT PUBLIC VOLATILE

�� ALLOCATABLE::

� �

,

object_name( deferred_shape_spec_list )assumed_rank_spec

��

318 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 345: IBM XL Fortran for Linux, V15.1

表 35. ALLOCATABLE 属性と互換性のある属性 (続き)

注:�1� Fortran 2003

�2� IBM 拡張

例! Two-dimensional array a declared but no space yet allocatedREAL, ALLOCATABLE :: a(:, :)READ (5, *) i, jALLOCATE(a(i, j))

関連情報v 92ページの『割り振り可能配列』

v 637ページの『ALLOCATED(X)』

v 『ALLOCATE』

v 367ページの『DEALLOCATE』

v 30ページの『割り振り状況』

v 91ページの『据え置き形状配列』

v 228ページの『仮引数が割り振り可能オブジェクトの場合 (Fortran 2003)』

v 940ページの『プロシージャーの相互運用性』

v -qinitallocオプション

ALLOCATE目的

ALLOCATE ステートメントは、ポインター・ターゲットおよび割り振り可能オブジェクトにストレージを動的に供給します。

構文

�� ALLOCATE ( allocation_list(1) , STAT = stat_variable

i_d_type_spec ::

� )(2) (3)

, ERRMSG = errmsg_variable , SOURCE = source_expr(4)

MOLD

��

注:

1 Fortran 2003

2 Fortran 2003

3 Fortran 2003

4 Fortran 2008

第 11 章 ステートメントおよび属性 319

Page 346: IBM XL Fortran for Linux, V15.1

stat_variable

スカラー整変数です。

errmsg_variable (Fortran 2003)スカラー文字変数です。

source_expr (Fortran 2003)スカラーであるか、allocate_object と同じランクを持つ式です。

i_d_type_spec (Fortran 2003)intrinsic_type_spec または derived_type_spec です。可能な型指定のリストについては、 526ページの『型宣言』を参照してください。

allocation_list

allocate_object

データ・ポインターまたは割り振り可能オブジェクトになっている必要がある変数名または構造体コンポーネントです。

lower_bound

スカラー整数式です。

upper_bound

スカラー整数式です。

制約

i_d_type_spec と source_expr を同時に指定することはできません。

いずれかの allocate_object に据え置き型パラメーターがある場合、無制限ポリモアフィックである場合 F2008 、または抽象型である場合 F2008 は、i_d_type_spec

または source_expr が指定されていなければなりません。

i_d_type_spec は、各 allocate_object が互換性を持つ型を指定する必要があります。

i_d_type_spec 内の型パラメーター値は、各 allocate_object が、対応する型パラメーターが想定されている仮引数である場合、かつその場合に限り、アスタリスクでなければなりません。

各 allocate_object の kind 型パラメーター値は、i_d_type_spec の対応する型パラメーター値と同一でなければなりません。

�� �

,

allocate_object,

( upper_bound )lower_bound :

��

320 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 347: IBM XL Fortran for Linux, V15.1

allocate_object が配列である場合は、allocate_object と同ランクの配列境界またはsource_expr を指定する必要があります。 allocate_object がスカラーである場合、配列境界は指定できません。

F2008 source_expr がある場合、各 allocate_object は source_expr と型互換性でなければなりません。 F2008

allocate_object および source_expr の対応する kind 型パラメーターは、同じ値を持っていなければなりません。

規則

ポインターの ALLOCATE ステートメントの実行によって、ポインターは割り振られたターゲットに関連付けられます。割り振り可能オブジェクトの ALLOCATE ステートメントの実行により、オブジェクトは定義可能になります。

配列の境界を指定する場合、指定する次元数 (つまり、allocation_list 内の上限数)

は allocate_object のランクに等しくなければなりません。 F2008 そうでない場合は、SOURCE= または MOLD= を指定する必要があり、source_expr の境界によって配列の境界が決定されます。境界の決定後、source_expr の境界に対するそれ以降の変更は、配列境界には影響しません。 F2008

i_d_type_spec が指定された場合、各 allocate_object は、指定された動的型および型パラメーター値を使用して割り振られます。 source_expr が指定された場合、各 allocate_object は、source_expr の動的型および型パラメーター値を使用して割り振られます。それ以外の場合、各 allocate_object は、その宣言型と同じ動的型を使用して割り振られます。

配列に対して、ALLOCATE ステートメントが実行されるその時に、限界値が決定されます。範囲式においてエンティティーの後続の再定義または未定義は、配列仕様に影響しません。省略された場合、下限には、デフォルト値 1 が割り当てられます。下限値が、対応する上限値を超えた場合、次元のエクステントは 0 になり、allocate_object のサイズも 0 になります。

任意の allocate_object、または allocate_object の指定された境界は、stat_variable または errmsg_variable の値に依存していてはなりません。あるいは、同じALLOCATE ステートメント内のいずれかの allocate_object の値、境界、長さ型パラメーター、割り振り状況、または関連状況に依存していてはなりません。

stat_variable、source_expr、および errmsg_variable は、それらが現れるALLOCATE ステートメント内に割り振らないでください。また、それらが、同じALLOCATE ステートメント内の任意の allocate_object の値、範囲、長さ型パラメーター、割り振り状況、または関連付け状況に左右されないようにしてください。

F2008 MOLD= を指定し、source_expr が変数である場合、その値を定義する必要はありません。また、MOLD= は、source_expr の値を、割り振る変数にコピーしません。 F2008

第 11 章 ステートメントおよび属性 321

Page 348: IBM XL Fortran for Linux, V15.1

STAT= 指定子が表示されず、ステートメントの実行中にエラー条件が発生した場合、プログラムは終了します。STAT= 指定子が表示された場合、stat_variable には、以下の値の 1 つが割り当てられます。

STAT 値 エラー条件

0 エラーなし

1 割り振りを試みた時のシステム・ルーチンでのエラー

2 無効なデータ・オブジェクトが割り振りに指定がされた

3 1 と 2 の両方のエラー条件が発生した

ALLOCATE ステートメントの実行中にエラー状態が発生し、ERRMSG=specifier がある場合は、エラーを説明するメッセージが errmsg_variable

に割り当てられます。このような条件が発生しなければ、errmsg_variable の値は変更されません。

既に割り振り済みの割り振り可能オブジェクトを割り振ると、ALLOCATE ステートメントにエラー状態をもたらします。

ポインター割り振りによって TARGET 属性を持つオブジェクトを作成します。ポインター代入を介して、追加ポインターを、このターゲット (または、ターゲットのサブオブジェクト) に関連付けることができます。既にターゲットに関連付けられているポインターを再割り振りすると、以下のようになります。

v 新規ターゲットが作成され、ポインターがこのターゲットに関連付けられる。

v 以前のポインターへの関連付けが壊れる。

v 割り振りによって作成されて、他のポインターと関連付けされていない前のターゲットにアクセス不能になる。

派生型のオブジェクトが ALLOCATE ステートメントによって作成された場合、割り振り可能な最終コンポーネントの割り振り状況は、割り振られていない状態になります。

ALLOCATED 組み込み関数を使用して、割り振り可能オブジェクトが割り振られているかどうかを判別します。ASSOCIATED 組み込み関数を使用して、ポインターの関連付け状況、または指定されたターゲットにポインターが関連付けられているかどうかを判別します。

例CHARACTER, POINTER :: P(:,:)CHARACTER, TARGET :: C(4,4)INTEGER, ALLOCATABLE, DIMENSION(:) :: AP => CN = 2; M = N

322 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 349: IBM XL Fortran for Linux, V15.1

ALLOCATE (P(N,M),STAT=I) ! P is no longer associated with CN = 3 ! Target array for P maintains 2X2 shapeIF (.NOT.ALLOCATED(A)) ALLOCATE (A(N**2))END

以下の例では、MOLD= 指定子を ALLOCATE ステートメント内で使用しています。この場合、境界は他のオブジェクトへの参照によって決定されます。

INTEGER, ALLOCATABLE :: NEW(:)INTEGER, POINTER :: OLD(:)ALLOCATE(OLD(4))ALLOCATE (NEW, MOLD=OLD) ! Allocate NEW with the bounds of OLDEND

関連情報v 318ページの『ALLOCATABLE (Fortran 2003)』

v 367ページの『DEALLOCATE』

v 30ページの『割り振り状況』

v 178ページの『ポインター関連付け』

v 91ページの『据え置き形状配列』

v 637ページの『ALLOCATED(X)』

v 642ページの『ASSOCIATED(POINTER, TARGET)』

v 228ページの『仮引数が割り振り可能オブジェクトの場合 (Fortran 2003)』

ASSIGN目的

ASSIGN ステートメントによって、ステートメント・ラベルを整変数に代入します。

構文

stmt_label

ASSIGN ステートメントを含む、有効範囲単位で、実行可能ステートメントか FORMAT ステートメントのステートメント・ラベルを指定します。

variable_name

スカラー INTEGER(4) または INTEGER(8) 変数の名前です

規則

指定したステートメント・ラベルを含むステートメントが、ASSIGN ステートメントと同じ有効範囲単位に現れるようにする必要があります。

v ステートメント・ラベルを含むステートメントが実行可能ステートメントの場合、ラベル名を、同じ有効範囲単位にある代入型 GO TO ステートメント に使用できます。

�� ASSIGN stmt_label TO variable_name ��

第 11 章 ステートメントおよび属性 323

Page 350: IBM XL Fortran for Linux, V15.1

v ステートメント・ラベルを含むステートメントが、FORMAT ステートメントの場合、ラベル名を 形式指定子 として、同じ有効範囲単位にある READ、WRITE、または PRINT ステートメントで使用できます。

ステートメント・ラベル値で定義された整変数を、同じステートメント・ラベル値、異なるステートメント・ラベル値、または整数値で再定義できます。ただし、関連した GO TO ステートメント内で、または入出力ステートメント内の形式識別子として、参照する前に、変数をステートメント・ラベル値で定義する必要があります。

variable_name の値は、ラベル自体を表す整数定数でないので、その値をラベルとしては使用できません。

ASSIGN ステートメントは、Fortran 95 およびそれ以降から削除されました。

例ASSIGN 30 TO LABELNUM = 40GO TO LABELNUM = 50 ! This statement is not executed

30 ASSIGN 1000 TO IFMTPRINT IFMT, NUM ! IFMT is the format specifier

1000 FORMAT(1X,I4)END

関連情報v 9ページの『ステートメント・ラベル』

v 424ページの『GO TO (代入)』

v 1117ページの『削除されたフィーチャー』

ASSOCIATE (Fortran 2003)目的

ASSOCIATE ステートメントは、ASSOCIATE 構文内の最初のステートメントです。各識別子と変数または式の値との関連を設定します。

構文

associate_construct_name

ASSOCIATE 構文 を識別する名前です。

associate_name

セレクターに一度関連付けられた識別子です。関連エンティティーになります。

�� �

,

ASSOCIATE ( associate_name => selector )associate_construct_name :

��

324 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 351: IBM XL Fortran for Linux, V15.1

セレクター (selector)

一度関連付けられた変数や式です。関連エンティティーになります。

規則

selector が、ベクトル添え字を持つ式または変数の場合、associate_name は、式または変数の値に関連付けられます。その関連エンティティーは再定義したり、未定義にすることはできません。

selector がベクトル添え字なしの変数の場合、associate_name は、selector によって指定されたデータ・オブジェクトに関連付けられます。associate_name (または、associate_name によって識別された関連エンティティー) の値が変更される場合はいつでも、変数の値もそれと一緒に変更されます。

selector に、ALLOCATABLE 属性がある場合、関連エンティティーには、ALLOCATABLE 属性がありません。selector に POINTER 属性がある場合、関連エンティティーには、TARGET 属性があります。selector に、TARGET、VOLATILE。または、 ASYNCHRONOUS 属性がある場合、変数である関連エンティティーには、これらの属性があります。

selector に、OPTIONAL 属性がある場合、これは示す必要があります。

関連エンティティーには、selector と同じ型、型パラメーターおよびランクがあります。selector がポリモアフィックである場合、関連エンティティーはポリモアフィックになります。selector が配列の場合、関連エンティティーは、それぞれの次元の下限が組み込み LBOUND(selector) の値に等しい配列になります。それぞれの次元の上限は、下限にエクステントを足して 1 を引いたものに等しくなります。

associate_name は、ASSOCIATE 構文内でユニークにする必要があります。

associate_construct_name を、ASSOCIATE 構文ステートメントに指定する場合、対応する END ASSOCIATE ステートメントにも指定する必要があります。

ASSOCIATE 構文ステートメントは、の動的エクステントまたは字句エクステント内には指定しないでください。

例test_equiv: ASSOCIATE (a1 => 2, a2 => 40, a3 => 80)

IF ((a1 * a2) .eq. a3) THENPRINT *, "a3 = (a1 * a2)"

END IFEND ASSOCIATE test_equiv

END

ASYNCHRONOUS目的

ASYNCHRONOUS ステートメントによって、有効範囲単位の処置中に保留 I/O ストレージ・シーケンスに関連付ける変数を指定します。

第 11 章 ステートメントおよび属性 325

Page 352: IBM XL Fortran for Linux, V15.1

TS 29113 非同期通信に使用される変数に、ASYNCHRONOUS 属性を指定する必要があります。詳しくは、『非同期通信の相互運用可能変数』を参照してください。TS 29113

変数に対して ASYNCHRONOUS 属性を指定すると、それは特定のコード動作の最適化から除外されます。

構文

ioitem 変数名です。

規則

ASYNCHRONOUS 属性は、ASYNCHRONOUS I/O ステートメント内の変数を使用して無条件に代入することができます。

オブジェクトでは、ASYNCHRONOUS 属性を、他の有効範囲単位に入れずに、特定の有効範囲単位内に入れることができます。

1 つのオブジェクトに、ASYNCHRONOUS 属性がある場合、そのサブオブジェクトのすべてに ASYNCHRONOUS 属性があります。

エンティティーは、関連モジュールに ASYNCHRONOUS または VOLATILE 属性がなくても、それらの属性をローカルの有効範囲単位内に入れることができます。

アクセスされたエンティティーは、ホスト・エンティティーに ASYNCHRONOUSまたは VOLATILE 属性がなくても、それらの属性を入れることができます。

関連エンティティーは、セレクターが変数であり、ASYNCHRONOUS 属性がある場合にのみ、ASYNCHRONOUS 属性を入れます。

以下に示すのは、処理中の I/O シーケンスと関連付けることができる変数の例です。

MODULE MODINTEGER :: IOITEMEND MODULE

PROGRAM MAIN

CALL SUB1()CALL SUB2()END PROGRAM

SUBROUTINE SUB1() ! OPTIMIZATION MAY NOT BE PERFORMEDUSE MODASYNCHRONOUS :: IOITEM....END SUBROUTINE

�� ASYNCHRONOUS :: ioitem_list ��

326 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 353: IBM XL Fortran for Linux, V15.1

SUBROUTINE SUB2() ! OPTIMIZATION MAY BE PERFORMEDUSE MOD.....END SUBROUTINE

! OPTIMIZATION IS NOT POSSIBLE IN SUB2()IF MODULE MOD IS REWRITTEN AS FOLLOWS:

MODULE MODINTEGER, ASYNCHRONOUS :: IOITEMEND MODULE

TS 29113

以下に示すのは、非同期通信の実行時に ASYNCHRONOUS 属性を使用する方法の例です。

INTEGER :: ARRAY(1000)

... ! Code that writes to ARRAY

BLOCKASYNCHRONOUS :: ARRAY

CALL MPI_ISEND(ARRAY,...REQ,...)... ! Code that does not write to ARRAYCALL MPI_WAIT(REQ,...)

END BLOCK

... ! Code that writes to ARRAY

TS 29113

関連情報v 248ページの『非同期入出力』

v 460ページの『OPEN』

v 347ページの『CLOSE』

v 433ページの『INQUIRE』

v 938ページの『非同期通信の相互運用可能変数 (TS 29113)』

v 488ページの『READ』

v 542ページの『WAIT (Fortran 2003)』

v 547ページの『WRITE』

AUTOMATIC (IBM 拡張)目的

AUTOMATIC 属性によって、変数に自動のストレージ・クラスを持たせるように指定します。すなわち、一度プロシージャーが終了すると変数は定義されていない状態になります。

構文

第 11 章 ステートメントおよび属性 327

Page 354: IBM XL Fortran for Linux, V15.1

automatic

明示的形状仕様リストまたは据え置き形状仕様リストによる変数名または配列宣言子です。

規則

automatic が関数結果である場合、文字型または派生型にしないでください。

ポインターまたは配列である関数結果、仮引数、ステートメント関数、自動オブジェクト、またはポインティング先には、AUTOMATIC 属性を指定しないでください。AUTOMATIC 属性を持つ変数は、モジュール F2008 またはサブモジュール

F2008 の有効範囲単位で定義できません。 AUTOMATIC 属性を使用して明示的に宣言された変数は、共通ブロック項目にすることはできません。

同じ有効範囲内で、1 つの変数に、複数の AUTOMATIC 属性を指定しないでください。

スレッド作業の有効範囲内で AUTOMATIC として宣言された変数は、そのスレッドに対してローカルになります。

AUTOMATIC 属性を持つ変数は、DATA ステートメントまたは型宣言ステートメントによって初期化できません。

automatic がポインターである場合、AUTOMATIC 属性は、ポインターそれ自体に適用され、ポインターに関連付けられた (あるいは関連付けられる) ターゲットには適用されません。

注: AUTOMATIC 属性を持つオブジェクトと、自動オブジェクトを混同しないでください。 21ページの『自動オブジェクト』を参照してください。

表 36. AUTOMATIC 属性と互換性のある属性

ALLOCATABLE �1� CONTIGUOUS �2� VOLATILE

ASYNCHRONOUS POINTER

DIMENSION TARGET

注:�1� Fortran 2003

�2� Fortran 2008

例CALL SUBCONTAINS

SUBROUTINE SUBINTEGER, AUTOMATIC :: VARVAR = 12

END SUBROUTINE ! VAR becomes undefinedEND

�� AUTOMATIC automatic_list::

��

328 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 355: IBM XL Fortran for Linux, V15.1

関連情報v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 「XL Fortran コンパイラー・リファレンス」 の『-qinitauto オプション』

BACKSPACE目的

BACKSPACE ステートメントによって、順次アクセス または定様式ストリーム・アクセス に関連付けられた外部ファイルの位置を決めます。

BACKSPACE ステートメントの実行により、指定した装置の保留非同期データ転送処理のために待機命令を実行します。

構文

u 外部装置識別子です。u の値を、アスタリスクまたはホレリス定数にしないでください。

position_list

必ず 1 つの装置指定子 ([UNIT=]u) を含み、他の有効な指示子のそれぞれのうちの 1 つを含めることのできるリストです。

[UNIT=] u

装置指定子です。u は、値がアスタリスクではない外部装置識別子にする必要があります。外部装置識別子とは、整数式によって表される外部ファイルのことです。整数式の値は、以下のいずれかです。

v 1 から 2147483647 の範囲内の値

v F2008 A NEWUNIT 値 F2008

オプション文字 UNIT= を省略する場合、u を、position_list の最初の項目にする必要があります。

ERR= stmt_label

エラー指定子です。これは、エラーが発生した場合に、制御の転送先と同じ有効範囲単位内にある実行可能ステートメントのステートメント・ラベルを指定します。ERR= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

IOMSG= iomsg_variable (Fortran 2003)入出力状況指定子です。これは、入出力操作によって戻されるメッセージを指定します。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

�� BACKSPACE u( position_list )

��

第 11 章 ステートメントおよび属性 329

Page 356: IBM XL Fortran for Linux, V15.1

v エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

v このような条件が発生しない場合は、変数の値は変更されません。

IOSTAT= ios

入出力状況指定子です。これは、入出力操作の状況を指定します。ios は変数です。BACKSPACE ステートメントが実行を終了すると、ios は、以下の値で定義されます。

v エラー条件が発生しない場合はゼロ値

v エラーが発生した場合は正の値

規則

BACKSPACE ステートメントの実行後、ファイル位置は、現行レコードが存在していれば、現行レコードの前になります。現行レコードが存在しない場合は、ファイル位置は先行レコードの前になります。ファイルが初期点にある場合は、ファイル位置はそのままで変わりません。

リスト指示形式設定または 名前リスト形式設定を使用して書き込まれたレコードにバックスペースで戻ることはできません。

順次アクセスの場合、先行レコードが、ファイル終了レコードであれば、ファイルの位置はファイル終了レコードの前になります。

ERR= および IOSTAT= 指定子が設定され、エラーが検出された場合、ERR= 指定子によって指定されたステートメントに転送され、正整数値が ios に割り当てられます。

IBM 拡張

IOSTAT= および ERR= が指定されない場合、以下のようになります。

v 重大エラーが検出された場合、プログラムは停止します。

v リカバリー可能エラーが検出され、ERR_RECOVERY 実行時オプションが YESに設定されている場合は、プログラムは継続されて次のステートメントに進みます。オプションが NO に設定されている場合は、プログラムは停止します。

IBM 拡張 の終り

例BACKSPACE 15BACKSPACE (UNIT=15,ERR=99)

...99 PRINT *, "Unable to backspace file."

END

関連情報v 254ページの『条件および IOSTAT 値』

v 241ページの『第 9 章 XL Fortran の入出力』

330 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 357: IBM XL Fortran for Linux, V15.1

v 「XL Fortran コンパイラー・リファレンス」に記載される『実行時オプションの設定』

BIND (Fortran 2003)目的

BIND 属性によって、Fortran 変数または共通ブロックが、C プログラミング言語と相互に使用できるように宣言します。

構文

binding_label

スカラー文字定数式です。

規則

この属性によって、Fortran 変数または共通ブロックが、外部リンケージを持つ C

エンティティーと相互に使用できるように指定します。詳しくは、 938ページの『変数の相互運用性』 および 940ページの『共通ブロックの相互運用性』 を参照してください。

NAME= 指定子を BIND ステートメントに指定する場合、指定できるにはvariable_name または common_block_name のいずれか 1 つのみです。

BIND ステートメントが共通ブロックを指定する場合、その共通ブロックの各変数を、相互使用可能な型と型パラメーターにする必要がありますが、POINTER または ALLOCATABLE 属性を持たせないでください。

表 37. BIND 属性と互換性のある属性

ASYNCHRONOUS SAVE

DIMENSION STATIC �2�

PRIVATE TARGET

PROTECTED �1� VOLATILE

PUBLIC

注:�1� Fortran 2003

�2� IBM 拡張

関連情報v 937ページの『第 18 章 言語の相互運用性機能』v 938ページの『変数の相互運用性』v 940ページの『共通ブロックの相互運用性』

�� �

,

BIND ( C ) variable_name, NAME = binding_label :: common_block_name

��

第 11 章 ステートメントおよび属性 331

Page 358: IBM XL Fortran for Linux, V15.1

v 397ページの『ENTRY』v 419ページの『FUNCTION』v 481ページの『PROCEDURE 宣言 (Fortran 2003)』v 517ページの『SUBROUTINE』v 369ページの『派生型』v –qbindcextname

BLOCK (Fortran 2008)目的

BLOCK ステートメントは、名前付きまたは名前なしの BLOCK 構文を宣言します。これは BLOCK 構文の最初のステートメントです。

構文

BLOCK_construct_name

BLOCK 構文を識別する名前です。

規則

BLOCK_construct_name を BLOCK ステートメント内に指定する場合は、対応するEND BLOCK ステートメントに同じ名前を指定する必要があります。

以下の例では、BLOCK ステートメントで名前なしの BLOCK 構文を宣言します。

SUBROUTINE swap(i, j)INTEGER :: i, j

IF (i < j) THEN! The BLOCK statement has no BLOCK_construct_name. The corrsponding END BLOCK! statement cannot have a BLOCK_construct_name either.BLOCK

INTEGER :: temp

temp = ii = jj = temp

END BLOCKEND IF

END SUBROUTINE swap

関連情報v 151ページの『BLOCK 構文 (Fortran 2008)』

v 389ページの『END (構文)』

��BLOCK_construct_name :

BLOCK ��

332 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 359: IBM XL Fortran for Linux, V15.1

BLOCK DATA目的

BLOCK DATA ステートメントは、ブロック・データ・プログラム単位内の最初のステートメントです。これは名前付き共通域ブロック内で変数の初期値を指定します。

構文

block_data_name

ブロック・データ・プログラム単位の名前です。

規則

1 つの実行可能プログラム内に複数のブロック・データ・プログラム単位を入れることができますが、無名にできるのは 1 つのみです。

指定する場合、ブロック・データ・プログラム単位の名前は、外部のサブプログラム、入口、メインプログラム、モジュール、 F2008 サブモジュール F2008 、または実行可能プログラム内の共通ブロックと同じにしないでください。また、このプログラム単位内のローカル・エンティティーとも同じにはしないでください。

例BLOCK DATA ABC

PARAMETER (I=10)DIMENSION Y(5)COMMON /L4/ YDATA Y /5*I/

END BLOCK DATA ABC

関連情報v 214ページの『ブロック・データ・プログラム単位』

v END BLOCK DATA ステートメントに関しての詳細は 387ページの『END』

BYTE (IBM 拡張)目的

BYTE 型宣言ステートメントによって、バイト型のオブジェクトと関数の属性を指定します。各スカラー・オブジェクトの長さは 1 です。初期値はオブジェクトに代入することができます。

構文

�� BLOCK DATAblock_data_name

��

第 11 章 ステートメントおよび属性 333

Page 360: IBM XL Fortran for Linux, V15.1

ここで、

attr_spec

以下のいずれかです。

ALLOCATABLE �1� INTRINSIC PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PARAMETER STATIC �2�

BIND �1� POINTER TARGET

DIMENSION (array_spec) PRIVATE VALUE �1�

EXTERNAL PROTECTED �1� VOLATILE

INTENT (intent_spec)

注:�1� Fortran 2003

�2� IBM 拡張

attr_spec

個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

intent_spec

IN、OUT、または INOUT のいずれかになります。

:: 二重コロン区切り文字です。属性、=constant_expr、または => NULL() を指定する場合は、二重コロン区切り文字を使用します。

array_spec

次元範囲のリストです。

entity_decl

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数には指定できません。

initial_value

すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。

�� BYTE entity_decl_list::, attr_spec_list ::

��

�� a( array_spec ) / initial_value_list /

= constant_expr=> NULL()

��

334 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 361: IBM XL Fortran for Linux, V15.1

constant_expr

直前の名前によって指定されるエンティティーの定数式を指定します。

=> NULL()ポインター・オブジェクトの初期値を指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

v コンパイラーは、型定義の有効範囲単位内の constant_expr を評価します。

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

変数に constant_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。組み込み関数の型を確認する型宣言ステートメントを使用できます。一般または特定の組み込み関数の名前が型宣言ステートメント内に現れても、名前がその組み込みプロパティーを失うことはありません。

オブジェクトが、仮引数、割り振り可能オブジェクト、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内では初期化できません。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通ブロックに現れる場合、またはモジュール内 F2008 あるいはサブモジュール内 F2008 の名前付き共通ブロックに現れる場合は、オブジェクトを初期化できます。

Fortran 95 では、ポインターを初期化できます。ポインターは、=> NULL() の使用によってのみ初期化できます。

array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

第 11 章 ステートメントおよび属性 335

Page 362: IBM XL Fortran for Linux, V15.1

ステートメントに PARAMETER 属性が含まれている場合は、constant_expr を指定する必要があります。 constant_expr または NULL() が指定されている場合、宣言するエンティティーの条件に応じて、以下の規則が適用されます。

v エンティティーが変数の場合、変数が最初に定義されます。

v 派生型コンポーネントの場合、派生型はデフォルトの初期化値を持ちます。

a は、組み込み代入の規則に応じて、constant_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。

変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、constant_expr または NULL() の存在は、a が、名前付き共通域ブロック内のオブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。

ALLOCATABLE または POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

例BYTE, DIMENSION(4) :: X=(/1,2,3,4/)

関連情報v 51ページの『バイト (IBM 拡張)』

v 114ページの『定数式』

v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』

v 21ページの『自動オブジェクト』

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 初期値に関しての詳細は、 363ページの『DATA』

CALL目的

CALL ステートメントは実行するサブルーチンを呼び出します。

構文

336 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 363: IBM XL Fortran for Linux, V15.1

name 内部、外部またはモジュール・サブルーチン、外部またはモジュール・サブルーチン内の入口、組み込みサブルーチン、総称、またはプロシージャー・ポインターの名前です。

procedure_component_ref

宣言した型 data_ref のプロシージャー・ポインター・コンポーネントの名前です。詳しくは、 60ページの『プロシージャー・ポインター・コンポーネント』 を参照してください。

data_ref

派生型のオブジェクトの名前です。

separator

「%」または 「.」 で示される区切り文字です。

binding_name

宣言した型 data_ref のプロシージャー結合の名前です。

規則

CALL ステートメントを実行すると、イベントが以下の順序で発生します。

1. 式である実引数が評価されます。

2. 実引数が対応する仮引数に関連付けられます。

3. 指定したサブルーチンに制御が転送されます。

4. サブルーチンが実行されます。

5. サブルーチンから制御が戻ります。

Fortran 2003

プロシージャー・ポインターとは、プロシージャーに関連付けられたポインターのことです。プロシージャー・ポインターは、明示的または暗黙的いずれかのインターフェースを持ち、そのインターフェースが一般あるいは基本的でない可能性があります。

プロシージャー指定子の binding_name が、特定の プロシージャーの結合名である場合、参照されたプロシージャーは、data_ref の動的型内にある名前と結合される

�� CALL name(1)

procedure_component_ref(2)

data_ref separator binding_name

�( )

actual_argument_spec_list

��

注:

1 Fortran 2003

2 Fortran 2003

第 11 章 ステートメントおよび属性 337

Page 364: IBM XL Fortran for Linux, V15.1

ことによって識別される結合名になります。プロシージャー指定子の binding_name

が、一般 プロシージャーの結合名である場合、data_ref の宣言された型内の名前との一般結合は、以下の規則に従って特定結合を選択するのに使用されます。

1. 参照がその一般結合の特定結合の中の 1 つと整合した場合、特定結合が選択されます。

2. さもなければ、参照がその一般結合の特定結合の中の 1 つへのエレメント型参照と整合した場合、特定結合が選択されます。

選択した特定結合と同じ名前を持つ結合によって識別されるプロシージャーが、data_ref の動的型で参照されます。

Fortran 2003 の終り

サブルーチン・ステートメントで、RECURSIVE キーワードを指定している場合、サブプログラムは、再帰的に、直接的に、または間接的に、サブプログラム自身を呼び出せます。

CALL ステートメントに、引数間の代替戻り指定子が 1 つ以上含まれている場合、RETURN ステートメント内のサブルーチンによって指定されたアクションによっては、制御が、指示されたステートメント・ラベルの 1 つに転送されることもあります。

IBM 拡張

外部サブプログラムも、-qrecur コンパイラー・オプションが指定されていれば、外部サブプログラムそれ自身を直接にまたは間接的に参照できます。

引数リスト組み込み関数 %VAL および %REF は、引数が値または参照によってそれぞれ渡されるようにすることで、言語間呼び出しを補助するのに提供されます。これらは、Fortran 以外のプロシージャーにのみ参照されます。

IBM 拡張 の終り

VALUE 属性によっても、値によって引数を渡すことができます。

例INTERFACE

SUBROUTINE SUB3(D1,D2)REAL D1,D2

END SUBROUTINEEND INTERFACEARG1=7 ; ARG2=8CALL SUB3(D2=ARG2,D1=ARG1) ! subroutine call with argument keywordsEND

SUBROUTINE SUB3(F1,F2)REAL F1,F2,F3,F4F3 = F1/F2F4 = F1-F2PRINT *, F3, F4

END SUBROUTINE

338 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 365: IBM XL Fortran for Linux, V15.1

関連情報v 233ページの『再帰』v 221ページの『%VAL および %REF (IBM 拡張)』v 538ページの『VALUE (Fortran 2003)』v 217ページの『実引数の指定』v 231ページの『仮引数がアスタリスクの場合』v 68ページの『型制約プロシージャー (Fortran 2003)』

CASE目的

CASE ステートメントによって、CASE 構文内の CASE ステートメント・ブロックを開始します。これには、実行のための多くのステートメント・ブロックの中から多くて 1 つを選択するための簡潔な構文が含まれています。

構文

case_selector

case_construct_name

CASE 構文を識別する名前です。

case_value

整数、文字、または論理型のスカラー定数式です。

low_case_value, high_case_value

整数、文字、または論理型のそれぞれのスカラー定数式です。

規則

SELECT CASE ステートメントで判別されるケース・インデックスは、CASE ステートメント内のそれぞれの case_selector と比較されます。一致すると、CASE ステートメントに関連付けられた stmt_block が実行されます。一致しない場合は、stmt_block は実行されません。2 つのケース値範囲はオーバーラップできません。

�� CASE case_selectorcase_construct_name

��

��

DEFAULT,

( case_value )low_case_value : high_case_valuelow_case_value :: high_case_value

��

第 11 章 ステートメントおよび属性 339

Page 366: IBM XL Fortran for Linux, V15.1

一致は、以下のように判別されます。

case_value

DATA TYPE: 整数、文字、または論理整数と文字用の MATCH: case index = case_value

論理用の MATCH: case index .EQV. case_value がtrue

low_case_value : high_case_value

DATA TYPE: 整数または文字MATCH: low_case_value ≤ case index ≤

high_case_value

low_case_value :

DATA TYPE: 整数または文字MATCH: low_case_value ≤ case index

: high_case_value

DATA TYPE: 整数または文字MATCH: case index ≤ high_case_value

DEFAULT

DATA TYPE: 適用されないMATCH: 他に一致しない場合。

1 つのみ一致するはずです。一致がある場合、一致した case_selector に関連付けられたステートメント・ブロックが実行され、ケース構文の実行が完了されます。一致がない場合、ケース構文の実行は完了します。

case_construct_name を指定する場合、SELECT CASE および END SELECT ステートメントで指定された名前に一致させる必要があります。

DEFAULT は、デフォルトの case_selector です。CASE ステートメントの内で、DEFAULT を case_selector として持つことができるのは 1 つのみです。

それぞれのケース値は、SELECT CASE ステートメントで定義したように、case_expr と同じデータ型にする必要があります。型なし定数または BYTE 名前付き定数が、case_selectors で検出された場合、その定数は case_expr のデータ型に変換されます。

case_expr およびケース値が文字型の場合、それらの長さは別々にできます。-qctyplss コンパイラー・オプションを指定する場合、case_expr として使用される文字定数式は文字型として残ります。文字定数式は、型なし定数として処理されません。

例ZERO: SELECT CASE(N)

CASE DEFAULT ZERO ! Default CASE statement for! CASE construct ZERO

340 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 367: IBM XL Fortran for Linux, V15.1

OTHER: SELECT CASE(N)CASE(:-1) ! CASE statement for CASE

! construct OTHERSIGNUM = -1

CASE(1:) OTHERSIGNUM = 1

END SELECT OTHERCASE (0)

SIGNUM = 0

END SELECT ZERO

関連情報v 160ページの『CASE 構文』

v 507ページの『SELECT CASE』

v END SELECT ステートメントに関しての詳細は、 389ページの『END (構文)』

CHARACTER目的

CHARACTER 型宣言ステートメントによって、文字型のオブジェクトと関数の種類、長さ、属性を指定します。初期値はオブジェクトに代入することができます。

構文

ここで、

attr_spec

以下のいずれかです。

ALLOCATABLE �1� INTRINSIC PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PARAMETER STATIC �2�

BIND �1� POINTER TARGET

DIMENSION (array_spec) PRIVATE VALUE �1�

EXTERNAL PROTECTED �1� VOLATILE

INTENT (intent_spec)

注:�1� Fortran 2003

�2� IBM 拡張

char_selector

�� CHARACTERchar_selector ::

, attr_spec_list ::

� entity_decl_list ��

第 11 章 ステートメントおよび属性 341

Page 368: IBM XL Fortran for Linux, V15.1

文字長を指定します。

type_param_value

宣言式、アスタリスク (*) またはコロンになります。

int_constant_expr

1 に評価される必要があるスカラー整数定数式です。

char_length

スカラー整数リテラル定数 (これは、kind 型パラメーターを指定できません) または括弧で囲まれた type_param_value のいずれかになります。

attr_spec

個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

intent_spec

IN、OUT、または INOUT のいずれかになります。

:: 二重コロン区切り文字です。属性、=constant_expr、または => NULL() を指定する場合は、二重コロン区切り文字を使用します。

array_spec

次元範囲のリストです。

entity_decl

�� ( LEN = type_param_value , KIND = int_constant_expr )type_param_value , int_constant_expr

KIND =KIND = int_constant_expr

, LEN = type_param_valuetype_param_value

LEN =* char_length

,

��

�� a* char_length ( array_spec )

( array_spec ) * char_length

�(1)

/ initial_value_list /= constant_expr=> NULL()

��

注:

1 IBM 拡張

342 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 369: IBM XL Fortran for Linux, V15.1

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数には指定できません。

initial_value

すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。

constant_expr

直前の名前によって指定されるエンティティーの定数式を指定します。

=> NULL()ポインター・オブジェクトの初期値を指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

v コンパイラーは、型定義の有効範囲単位内の constant_expr を評価します。

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

変数に constant_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。詳しくは、 526ページの『型宣言』 を参照してください。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。組み込み関数の型を確認する型宣言ステートメントを使用できます。一般または特定の組み込み関数の名前が型宣言ステートメント内に現れても、名前がその組み込みプロパティーを失うことはありません。

オブジェクトが、仮引数、割り振り可能オブジェクト、ポインター、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内で最初に定義しないでください。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。以下の場合、オブジェクトは初期化できます。

v オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通域ブロックに現れた場合。

v オブジェクトが、モジュール F2008 またはサブモジュール F2008 の名前付き共通ブロックに現れた場合。

Fortran 95 では、ポインターを初期化できます。ポインターは、=> NULL() の使用によってのみ初期化できます。

第 11 章 ステートメントおよび属性 343

Page 370: IBM XL Fortran for Linux, V15.1

type_param_value または array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

ステートメントに PARAMETER 属性が含まれている場合は、constant_expr を指定する必要があります。 constant_expr または NULL() が指定されている場合、宣言するエンティティーの条件に応じて、以下の規則が適用されます。

v エンティティーが変数の場合、変数が最初に定義されます。

v 派生型コンポーネントの場合、派生型はデフォルトの初期化値を持ちます。

a は、組み込み代入の規則に応じて、constant_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。

変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、constant_expr または NULL() の存在は、a が、名前付き共通域ブロック内のオブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。entity_decl に指定された char_length は、char_selector に指定された長さより優先されます。

POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

ステートメント内に二重コロン区切り文字 (::) がない場合にのみ、CHARACTER型宣言ステートメント内の char_length の後に、オプションのコンマを入れることができます。

Fortran 2003

CHARACTER 型宣言ステートメントが、コロンの長さを指定する場合、長さの型パラメーターは、据え置き型パラメーター です。据え置き型パラメーターを持つエンティティーまたはコンポーネントには、ALLOCATABLE または POINTER 属性を指定する必要があります。据え置き型パラメーターは、プログラムの実行中に値を変更できる長さ (length) 型パラメーターです。

Fortran 2003 の終り

344 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 371: IBM XL Fortran for Linux, V15.1

CHARACTER 型宣言ステートメントが、モジュール、 F2008 サブモジュールF2008 、ブロック・データ・プログラム単位、またはメインプログラムの有効範囲単位内にあって、エンティティーの長さを継承された長さで指定する場合、エンティティーは、名前付き文字定数の名前にする必要があります。文字定数には、それに対応する PARAMETER 属性で定義された式の長さが取られます。

CHARACTER 型宣言ステートメントが、プロシージャーの有効範囲にあり、エンティティーの長さが継承されている場合、エンティティー名は、仮引数か名前付き文字定数の名前にする必要があります。ステートメントが、外部関数の有効範囲にある場合、そのステートメントを、同じプログラム単位内の FUNCTION またはENTRY ステートメント内の関数または入口名にすることもできます。エンティティー名が、仮引数の名前の場合、仮引数には、プロシージャーの個々の参照のために、関連する実引数の長さが取られます。エンティティー名が文字定数の名前の場合は、文字定数には、PARAMETER 属性によって定義された対応する式の長さが取られます。エンティティー名が関数または入口名の場合、エンティティーには、呼び出し側の有効範囲単位に指定された長さが取られます。

文字関数の長さは、宣言式にできます (これは、関数型がインターフェース・ブロックで宣言されていない場合、定数式にする必要があります。) あるいは、ダミー・プロシージャー名の長さを示すコロンかアスタリスクになります。関数が内部関数またはモジュール関数の場合、再帰的な場合、または配列かポインター値を返す場合は、長さにアスタリスクを使用することはできません。

例CHARACTER(KIND=1,LEN=6) APPLES /'APPLES'/CHARACTER(7), TARGET :: ORANGES = 'ORANGES'I=7CALL TEST(APPLES,I)CONTAINS

SUBROUTINE TEST(VARBL,I)CHARACTER*(*), OPTIONAL :: VARBL ! VARBL inherits a length of 6CHARACTER(I) :: RUNTIME ! Automatic object with length of 7

END SUBROUTINEEND

関連情報v 48ページの『文字演算子』

v 114ページの『定数式』

v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』

v 86ページの『配列宣言子』

v 21ページの『自動オブジェクト』

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 初期値に関しての詳細は、 363ページの『DATA』

第 11 章 ステートメントおよび属性 345

Page 372: IBM XL Fortran for Linux, V15.1

CLASS (Fortran 2003)目的

CLASS 型宣言ステートメントは、宣言された型、型パラメーター、および派生型のオブジェクトの属性を指定します。初期値はオブジェクトに代入することができます。

構文

derived_type_spec

拡張可能な派生型の名前です。詳しくは、 526ページの『型宣言』を参照してください。

attr_spec

詳しくは、 521ページの『TYPE』を参照してください。

entity_decl

詳しくは、 521ページの『TYPE』を参照してください。

規則

TYPE 型宣言と CLASS 型宣言の規則は似ています。詳しくは、 521ページの『TYPE』を参照してください。

以下の規則は、CLASS 型宣言に固有な規則です。

v CLASS 型指定子は、ポリモアフィック・オブジェクトを宣言するのに使用されます。 type_name は、ポリモアフィック・オブジェクトの宣言された型です。

v 制約のないポリモアフィック・オブジェクトを宣言するには、CLASS(*) 指定子を使用します。制約のないポリモアフィック・エンティティーは、型を持つように宣言されません。また、制約のない別のポリモアフィック・エンティティーを含む、他のエンティティーと同じ宣言済み型を持つと考えられません。

v CLASS キーワードを使用して宣言したエンティティーは、仮引数にするか、ALLOCATABLE または POINTER 属性を含める必要があります。また、CLASS キーワードで宣言した仮引数には、値属性を使用しないでください。

例program sClass

type baseinteger::iend type

type,extends(base)::childinteger::jend type

�� CLASS ( derived_type_spec )* ::

, attr_spec_list ::

� entity_decl_list ��

346 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 373: IBM XL Fortran for Linux, V15.1

type(child),target::child1=child(4,6)type(base), target::base1=base(7)! declare an item that could contain any extensible derived type! or intrinsic typeclass(*),allocatable::anyThing

! declare basePtr as a polymorphic item with declared type base,! could have run time type of base or childclass(base),pointer::basePtr

! set basePtr to point to an item of type childbasePtr=>child1call printAny(basePtr)

! set basePtr to point to an item of type basebasePtr=>base1call printAny(basePtr)

! allocate an integer itemallocate(anyThing, source=base1%i)call printAny(anyThing)

contains

subroutine printAny(printItem)! declare a dummy arg of unlimited polymorphic, can point! to any extensible derived type or intrinsic typeclass(*)::printItem

select type(item=>printItem)type is (base)print*,' base item is ',item

type is (child)print*,' child item is ', item

type is (integer)print*,' integer item is ',itemend selectend subroutineend program

このプログラムの出力は、次のようになります。

child item is 4 6

base item is 7

integer item is 7

関連情報v 22ページの『ポリモアフィック・エンティティー (Fortran 2003)』

CLOSE目的

CLOSE ステートメントによって、外部ファイルを装置から切り離します。

CLOSE ステートメントの実行により、指定した装置の保留非同期データ転送処理のために待機命令を実行します。

第 11 章 ステートメントおよび属性 347

Page 374: IBM XL Fortran for Linux, V15.1

構文

close_list

必ず 1 つの装置指定子 (UNIT=u) を含み、他の有効な指示子のそれぞれのうちの 1 つを含めることのできるリストです。有効な指定子は、次のとおりです。

[UNIT=] u

装置指定子です。u は、値がアスタリスクではない外部装置識別子にする必要があります。外部装置識別子とは、整数式によって表される外部ファイルのことです。整数式の値は、以下のいずれかです。

v 1 から 2147483647 の範囲内の値

v F2008 A NEWUNIT 値 F2008

オプション文字 UNIT= を省略する場合、u を、close_list の最初の項目にする必要があります。

ERR= stmt_label

エラー指定子です。これは、エラーが発生した場合に、制御の転送先と同じ有効範囲単位内にある実行可能ステートメントのステートメント・ラベルを指定します。ERR= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

Fortran 2003

IOMSG= iomsg_variable

入出力状況指定子です。これは、入出力操作によって戻されるメッセージを指定します。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

v エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

v このような条件が発生しない場合は、変数の値は変更されません。

Fortran 2003 の終り

IOSTAT= ios

入出力状況指定子です。これは、入出力操作の状況を指定します。ios は、整変数です。この指定子を含む入出力ステートメントが実行を終了する時、ios は、以下の値で定義されます。

v エラー条件が発生しない場合はゼロ値

v エラーが発生した場合は正の値

�� CLOSE ( close_list ) ��

348 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 375: IBM XL Fortran for Linux, V15.1

STATUS= char_expr

ファイルが閉じられた後のファイルの状況を指定します。char_expr は、末尾ブランクが除去された時に、値が KEEP か DELETE のいずれかであるスカラー文字式です。

v 存在するファイルに対して KEEP を指定する場合、ファイルは、CLOSEステートメントの後も存在し続けます。存在しないファイルに対してKEEP を指定した場合、CLOSE ステートメントの後も存在しません。KEEP は、CLOSE ステートメントを実行する前の状況が SCRATCH であるファイルには指定しないでください。

v DELETE を指定した場合、ファイルは CLOSE ステートメントの後に存在しなくなります。

ファイル状況が SCRATCH の場合、デフォルトは DELETE です。それ以外では、デフォルトは KEEP です。

規則

装置を参照する CLOSE ステートメントは、実行可能プログラムのすべてのプログラム単位内で指定が可能で、その装置を参照する OPEN ステートメントと同じ有効範囲単位で指定する必要はありません。存在しない装置または関連付けされたファイルがない装置を指定できますが、この場合、CLOSE ステートメントは、何の効果もありません。

装置 0 は閉じることができません。

エラー条件以外の理由で実行可能プログラムが停止した場合、関連付けられているすべての装置は閉じられます。各装置は、完了前のファイル状況が SCRATCH でないかぎり、状況 KEEP で閉じられます。SCRATCH だった場合は、装置は、状況 DELETE で閉じられます。結果は、それぞれ関連付けられている装置に対して、STATUS= 指定子を持たない CLOSE ステートメントが実行されたようになります。

事前に関連付けされた装置が、CLOSE ステートメントによって切断された場合、装置が WRITE ステートメント (明示的に開かれなかった) で後で指定されるのであれば、暗黙のオープン規則が適用されます。

例CLOSE(15)CLOSE(UNIT=16,STATUS='DELETE')

関連情報v 245ページの『装置』

v 254ページの『条件および IOSTAT 値』

v 460ページの『OPEN』

第 11 章 ステートメントおよび属性 349

Page 376: IBM XL Fortran for Linux, V15.1

COMMON目的

COMMON ステートメントによって、共通ブロックおよびその内容を指定します。共通ブロックは、2 つ以上の有効範囲単位が共用できるストレージ域です。これにより、同じデータの定義と参照、および記憶単位の共用が可能になります。

構文

object

規則

object は、仮引数、自動オブジェクト、割り振り可能オブジェクト、または派生型のオブジェクト (割り振り可能な最終コンポーネント、ポインティング先、関数、関数結果、プロシージャーへの入力を持つ)、または BIND 属性を持つ変数を参照できません。object には、STATIC または AUTOMATIC 属性を指定できません。

explicit_shape_spec_list が示された場合、variable_name には POINTER 属性を指定しないでください。各次元範囲は、定数の宣言式にする必要があります。この形式は、variable_name に DIMENSION 属性を持たせるように指定します。

任意の variable_name またはプロシージャー・ポインター名は、有効範囲単位内のすべての共通ブロック・オブジェクト・リスト内で一回のみ使用できます。それらの名前は使用関連付けによってアクセス可能にできません。

object が派生型から成っている場合、順序派生型にする必要があります。すべての最終コンポーネントが非ポインターで、すべての文字型またはすべての型のデフォ

�� COMMON object_list/ /

common_block_name

� / / object_list, common_block_name

��

�� variable_name( explicit_shape_spec_list )

(1)procedure_pointer_name

��

注:

1 Fortran 2003

350 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 377: IBM XL Fortran for Linux, V15.1

ルト整数、デフォルトの実数、デフォルトの複素数、デフォルトの論理または倍精度実数であるシーケンス構造が指定されると、構造は、コンポーネントが共通ブロックで直接に列挙されているように処理されます。

ストレージを関連付けるデータ・ポインターは、同じ型パラメーターを据え置きにする必要があります。また、共通ブロック内のデータ・ポインター・オブジェクトは、同じ型、型パラメーター、およびランクのパラメーターと関連付けられたストレージにのみできます。

TARGET 属性を持つ共通ブロック内のオブジェクトは、他のオブジェクトに関連付けられたストレージにできます。オブジェクトは、TARGET 属性を持ち、同じ型および型パラメーターを持つ必要があります。

BYTE 型ポインターは、INTEGER(1) および LOGICAL(1) 型のポインターに関連付けられたストレージになります。同じ長さの整数ポインターと論理ポインターは、-qintlog コンパイラー・オプションを指定した場合、関連付けられたストレージとなります。

プロシージャー・ポインターは、他のプロシージャー・ポインターにのみ関連付けられているストレージである可能性もあります。両方のインターフェースが、明示的または暗黙的のいずれかでなければなりません。両方のインターフェースが明示的である場合、その特性は同じになります。両方のインターフェースが暗黙的である場合、両方ともサブルーチンになるか、同じ型および型パラメーターを持つ関数になります。

common_block_name を指定する場合、続く object_list に指定したすべての変数は、その名前付き共通域ブロックに入るよう宣言されます。 common_block_name を省略した場合、続く object_list に指定したすべての変数は、無名共通ブロックに入ります。

有効範囲単位内では、共通ブロック名は、同じ、または異なる COMMON ステートメントで複数回現指定できます。同じ共通ブロック名が連続して出現するたびに、その名前で指定された共通ブロックが継続されます。共通ブロック名は、グローバル・エンティティーです。

共通ブロック内の変数には、異なるデータ型を入れることができます。文字データ型と非文字データ型を、同じ共通ブロック内で混合できます。共通ブロック内の変数名は、有効範囲単位内の 1 つの COMMON ステートメントにのみ指定できます。同じ COMMON ステートメント内で、変数名を重複させることはできません。

BIND 情報については、 940ページの『共通ブロックの相互運用性』を参照してください。

IBM 拡張

デフォルトでは、共通ブロックはスレッドをまたがって共用されます。そのため、共通ブロック内の記憶単位を複数のスレッドで更新する必要がある場合、または 1

つのスレッドで更新されて、他のスレッドによって参照される場合、COMMON ステートメントの使用はスレッド・アンセーフと言えます。アプリケーションが、COMMON をスレッド・セーフな方法で使用するためには、ロックを使用してデー

第 11 章 ステートメントおよび属性 351

Page 378: IBM XL Fortran for Linux, V15.1

タへのアクセスをシリアライズするか、共通ブロックがそれぞれのスレッドのローカルにあることを確認します。Pthreads ライブラリー・モジュールには、ロックを使用してデータへのアクセスをシリアライズできるようにする mutex が提供されています。詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」に記載される『Pthreads ライブラリー・モジュール』を参照してください。CRITICAL ディレクティブの lock_name 属性にも、データへのアクセスをシリアライズする機能があります。詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」に記載される『CRITICAL /END CRITICAL』を参照してください。THREADLOCAL とTHREADPRIVATE ディレクティブは、共通ブロックがそれぞれのスレッドに対してローカルであることを確実にします。詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」に記載される『THREADLOCAL』および『THREADPRIVATE』を参照してください。

IBM 拡張 の終り

関連情報:

Pthreads ライブラリー・モジュール

共通関連実行可能プログラム内では、同じ名前を持つ、サイズがゼロ以外の名前付き共通域ブロックのすべてに、同じ最初の記憶単位があります。無名共通ブロックが 1 つあり、サイズがゼロ以外の無名共通ブロックを参照するすべての有効範囲単位が、同じ最初の記憶単位を参照します。

同じ名前を持つサイズがゼロの共通ブロックすべては、互いに関連付けられたストレージです。サイズがゼロの無名共通ブロックは、お互いに関連付けられており、サイズがゼロ以外の無名共通ブロックの最初の記憶単位とも関連付けられています。使用関連付けまたはホスト関連付けにより、これらの関連付けられたオブジェクトを、同じ有効範囲単位内でアクセス可能にできます。

関連付けは、記憶単位ごとなので、共通ブロック内の変数は、別の有効範囲単位に別の名前と型を持つことができます。

共通ブロックのストレージ・シーケンス1 つの有効範囲単位の共通ブロック内の変数に対する記憶単位は、名前がCOMMON ステートメント内に現れる順序で割り当てられます。

最初の項目の前に追加するのではなく、最後の項目に追加することでのみ、EQUIVALENCE ステートメントを使用して共通ブロックを拡張できます。例えば、以下のステートメントは X を指定します。

COMMON /X/ A,B ! common block named XREAL C(2)EQUIVALENCE (B,C)

共通ブロック X の内容は、以下のとおりです。

| | | | | | | | | | | | |Variable A: | A |Variable B: | B |Array C: | C(1) | C(2) |

352 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 379: IBM XL Fortran for Linux, V15.1

有効範囲単位内に現れる COMMON および EQUIVALENCE ステートメントのみが、その単位内で形成された共通ブロックストレージ・シーケンスに影響を与えます。参照結合または親子結合によりアクセス可能にされた共通ブロック内の変数は含まれません。

EQUIVALENCE ステートメントは、2 つの異なる共通ブロックのストレージ・シーケンスを関連付けることはできません。共通ブロックは、モジュール F2008 またはサブモジュール F2008 の有効範囲単位内で宣言できますが、参照結合を通して、モジュール F2008 またはサブモジュール F2008 からエンティティーにアクセスする他の有効範囲単位内では宣言されないようにする必要があります。

COMMON の使用により、データを間違えて並べてしまうことがあります。間違えて並べられたデータを使用すると、プログラムのパフォーマンスに不都合な影響を与える可能性があります。

共通ブロックのサイズ共通ブロックのサイズは、共通ブロック内のすべての変数を保持するのに必要なストレージのバイト数です。これは、等価関連の結果のエクステンションを含みます。

名前付き共通ブロックと無名共通ブロックの相違点v 実行可能プログラム内には、名前付き共通域ブロックが複数ありますが、無名共通ブロックは 1 つのみです。

v 実行可能プログラムのすべての有効範囲単位では、同じ名前の名前付き共通域ブロックは同サイズにする必要がありますが、無名共通ブロックは異なるサイズにすることができます。(別の有効範囲単位に異なるサイズの無名共通ブロックを指定した場合、ブロックの最大長は、実行可能プログラム内の無名共通ブロックの長さになります。)

v DATA ステートメントまたは型宣言ステートメントを含む、BLOCK DATA プログラム単位を使用して、名前付き共通域ブロックでオブジェクトを最初に定義できます。無名共通ブロックのエレメントは最初に定義できません。

名前付き共通ブロック、またはその一部が複数の有効範囲単位で初期化される場合、初期値は未定義となります。この問題を回避するには、ブロック・データ・プログラム単位またはモジュールを使用して名前付き共通域ブロックを初期化します。それぞれの名前付き共通域ブロックは、1 つのみのブロック・データ・プログラム単位またはモジュールで初期化される必要があります。

例INTEGER MONTH,DAY,YEARCOMMON /DATE/ MONTH,DAY,YEARREAL R4REAL R8CHARACTER(1) C1COMMON /NOALIGN/ R8,C1,R4 ! R4 will not be aligned on a

! full-word boundary

第 11 章 ステートメントおよび属性 353

Page 380: IBM XL Fortran for Linux, V15.1

関連情報v 「XL Fortran 最適化およびプログラミング・ガイド」に記載される『Pthreads ライブラリー・モジュール』

v 331ページの『BIND (Fortran 2003)』

v 940ページの『共通ブロックの相互運用性』

v 「XL Fortran 最適化およびプログラミング・ガイド」に記載される『THREADLOCAL』

v 214ページの『ブロック・データ・プログラム単位』

v 87ページの『明示的形状配列』

v 170ページの『有効範囲を持つエンティティー』

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

COMPLEX目的

COMPLEX 型宣言ステートメントによって、複素数型のオブジェクトと関数の長さと属性を指定します。初期値はオブジェクトに代入することができます。

構文

ここで、

attr_spec

以下のいずれかです。

ALLOCATABLE �1� INTRINSIC PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PARAMETER STATIC �2�

BIND �1� POINTER TARGET

DIMENSION (array_spec) PRIVATE VALUE �1�

EXTERNAL PROTECTED �1� VOLATILE

INTENT (intent_spec)

注:�1� Fortran 2003

�2� IBM 拡張

kind_selector

�� COMPLEXkind_selector ::

, attr_spec_list ::

entity_decl_list ��

354 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 381: IBM XL Fortran for Linux, V15.1

複素数エンティティーの長さを指定します。v int_constant_expr が指定された場合、有効な値は、4、8 および 16 になります。これらの値は、複素数エンティティーのそれぞれの部分の精度と範囲を表します。

v *int_literal_constant 形式が指定された場合、有効な値は、8、16 および32 になります。これらの値は、複素数エンティティー全体の長さを表し、代替形式に許可された値に相当します。int_literal_constant は kind

型パラメーターを指定できません。

attr_spec

個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

intent_spec

IN、OUT、または INOUT のいずれかになります。

:: 二重コロン区切り文字です。属性、=constant_expr、または => NULL() を指定する場合は、二重コロン区切り文字を使用します。

array_spec

次元範囲のリストです。

entity_decl

�� ( int_constant_expr )KIND =

(1)* int_literal_constant

��

注:

1 IBM 拡張.

�� a(1) ( array_spec )

* len(2)

( array_spec ) * len

�(3)

/ initial_value_list /= constant_expr=> NULL()

��

注:

1 IBM 拡張.

2 IBM 拡張.

3 IBM 拡張.

第 11 章 ステートメントおよび属性 355

Page 382: IBM XL Fortran for Linux, V15.1

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数には指定できません。

len

kind_selector に指定されたように長さをオーバーライドします。kind 型パラメーターは指定できません。エンティティーの長さは、許される長さ指定の 1 つを表す、整数のリテラル定数にする必要があります。

initial_value

すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。

constant_expr

直前の名前によって指定されるエンティティーの定数式を指定します。

=> NULL()ポインター・オブジェクトの初期値を 1 つ指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

v コンパイラーは、型定義の有効範囲単位内の constant_expr を評価します。

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

変数に constant_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。組み込み関数の型を確認する型宣言ステートメントを使用できます。一般または特定の組み込み関数の名前が型宣言ステートメント内に現れても、名前がその組み込みプロパティーを失うことはありません。

オブジェクトが、仮引数、割り振り可能オブジェクト、ポインター、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内では初期化できません。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。以下の場合、オブジェクトは初期化できます。

v オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通域ブロックに現れた場合。

356 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 383: IBM XL Fortran for Linux, V15.1

v オブジェクトが、モジュール内またはサブモジュール内の名前付き共通ブロックに現れた場合。

Fortran 95 では、ポインターを初期化できます。ポインターは、=> NULL() の使用によってのみ初期化できます。

array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

ステートメントに PARAMETER 属性が含まれている場合は、constant_expr を指定する必要があります。 constant_expr または NULL() が指定されている場合、宣言するエンティティーの条件に応じて、以下の規則が適用されます。

v エンティティーが変数の場合、変数が最初に定義されます。

v 派生型コンポーネントの場合、派生型はデフォルトの初期化値を持ちます。

a は、組み込み代入の規則に応じて、constant_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。

変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、constant_expr または NULL() の存在は、a が、名前付き共通域ブロック内のオブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。

ALLOCATABLE または POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

例COMPLEX, DIMENSION (2,3) :: ABC(3) ! ABC has 3 (not 6) array elements

関連情報v 45ページの『複素数』

v 114ページの『定数式』

第 11 章 ステートメントおよび属性 357

Page 384: IBM XL Fortran for Linux, V15.1

v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』

v 86ページの『配列宣言子』

v 21ページの『自動オブジェクト』

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 初期値に関しての詳細は、 363ページの『DATA』

CONTAINS目的

CONTAINS ステートメントによって、メインプログラム、外部サブプログラム、またはモジュール・サブプログラムの本体を、それらが含む内部サブプログラムから分離します。同様に、これはモジュール F2008 またはサブモジュール F2008 の宣言部分を、モジュールのサブプログラムから分離します。

また、CONTAINS ステートメントは、派生型定義のプロシージャー部分を導入します。

構文

規則

サブプログラムに関連付けられた CONTAINS ステートメントの場合、以下の規則が適用されます。

v CONTAINS ステートメントは、ブロック・データ・プログラム単位または内部サブプログラムには現れません。

v CONTAINS ステートメントのラベルはすべて、CONTAINS ステートメントが含まれているメインプログラム、サブプログラム、モジュール、 F2008 またはサブモジュール F2008 の一部と見なされます。

CONTAINS ステートメントの例

MODULE A...

CONTAINS ! Module subprogram must followSUBROUTINE B(X)

...CONTAINS ! Internal subprogram must followFUNCTION C(Y)

...END FUNCTION

END SUBROUTINEEND MODULE

派生型定義内の CONTAINS ステートメントの例

�� CONTAINS ��

358 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 385: IBM XL Fortran for Linux, V15.1

TYPE CUSTINTEGER :: CUST_NUMBERCONTAINSPROCEDURE, PASS :: GET_CUST => GET_CUST_NUMBER

END TYPE CUST

関連情報v 181ページの『プログラム単位、プロシージャー、およびサブプログラム』

CONTIGUOUS (Fortran 2008)目的

CONTIGUOUS 属性は、配列ポインター、想定形状配列 TS 29113 、または想定ラン

ク・オブジェクト TS 29113 の配列エレメントが他のデータ・オブジェクトによって分離されないことを指定します。

CONTIGUOUS 属性を持つ配列ポインターは、連続するターゲットに関連付けられ

たポインターのみになります。 CONTIGUOUS 属性を持つ想定形状配列 TS 29113 ま

たは想定ランク・オブジェクト TS 29113 は常に連続していますが、対応する実引数は連続している場合としていない場合があります。詳しくは、『規則』セクションを参照してください。

構文

contiguous_array

連続する配列

規則

CONTIGUOUS 属性で指定されるエンティティーは、配列ポインター、想定形状配

列 TS 29113 、または想定ランク・オブジェクト TS 29113 のいずれかでなければなりません。

ポインターの割り当てにおいて、ポインターが CONTIGUOUS 属性を持つ場合、関連付けられるターゲットは連続していなければなりません。CONTIGUOUS 属性を持つポインター仮引数に対応する実引数は、単純連続でなければなりません。

CONTIGUOUS 属性を持つ想定形状配列仮引数 TS 29113 または想定ランク仮引数TS 29113 に対応する実引数が連続しておらず、Fortran から呼び出しが行われるか、呼び出し先が Fortran プロシージャーである場合、コンパイラーは以下のアクションを実行することによってこの実引数を連続にします。

1. 仮引数に関連付ける一時的連続引数を作成します。

�� CONTIGUOUS contiguous_array_list::

��

第 11 章 ステートメントおよび属性 359

Page 386: IBM XL Fortran for Linux, V15.1

2. その一時的連続引数を実引数の値で初期化します。

3. プロシージャーから制御が戻ったら、一時的連続引数の値を実引数に対して逆にコピーします。

注: 実引数が INTENT(IN) として指定されている場合は、値はコピーされません。

実引数が、ASYNCHRONOUS 属性または VOLATILE 属性が設定された非ポインター配列であるが、単純連続ではなく、対応する仮引数に VOLATILE 属性またはASYNCHRONOUS 属性が設定されている場合、その仮引数は、CONTIGUOUS 属性を持たない想定形状配列でなければなりません。

実引数が、ASYNCHRONOUS 属性または VOLATILE 属性が設定された配列ポインターであるが、CONTIGUOUS 属性は設定されておらず、対応する仮引数にVOLATILE 属性または ASYNCHRONOUS 属性が設定されている場合、その仮引数は、CONTIGUOUS 属性を持たない配列ポインターまたは想定形状配列でなければなりません。

互換属性

以下の表に、CONTIGUOUS 属性と互換性のある属性のリストを示します。

表 38. CONTIGUOUS 属性と互換性のある属性

AUTOMATIC �1� OPTIONAL SAVE

ASYNCHRONOUS POINTER STATIC �1�

DIMENSION PRIVATE TARGET

EXTERNAL PROTECTED �2� VOLATILE

INTENT PUBLIC

注:�1� IBM 拡張�2� Fortran 2003

例 1: 配列ポインターに指定された CONTIGUOUS 属性

INTEGER, CONTIGUOUS, POINTER :: ap(:)INTEGER, TARGET :: targ(10)INTEGER, POINTER :: ip(:)LOGICAL :: contig

! Invalid because ap is contiguous. A severe error is issued at compile time.ap => targ(1:10:2)ip => targ(1:10:2)! contig has a value of .FALSE.contig = IS_CONTIGUOUS(ip)

! contig has a value of .TRUE.ALLOCATE(ip(10))contig = IS_CONTIGUOUS(ip)

例 2: 想定形状配列に指定された CONTIGUOUS 属性

360 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 387: IBM XL Fortran for Linux, V15.1

LOGICAL :: contig

! Define a derived type named baseTYPE base(k, j, l)

INTEGER, KIND :: k, jINTEGER, LEN :: lINTEGER(k) :: xINTEGER(j) :: y(l)

END TYPE

! Declare an allocatable, assumed-shape array b of base typeTYPE(base(4, 8, 0)), ALLOCATABLE :: b(:)! Allocate two elements to bALLOCATE(b(2))! contig has a value of .FALSE.contig = IS_CONTIGUOUS(b%x)

例 3: 想定形状配列に指定された CONTIGUOUS 属性

INTEGER, POINTER :: p(:)INTEGER, TARGET :: t(10) = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

p => t(1:10:2)

! The actual argument p, which corresponds to the contiguous dummy argument,! is not contiguous. The compiler makes it contiguous by creating a temporary! contiguous argument.CALL fun(p)

CONTAINSSUBROUTINE fun(arg)

! Contiguous dummy argument argINTEGER, CONTIGUOUS :: arg(:)PRINT *, arg(1)

END SUBROUTINE

関連情報v IS_CONTIGUOUS

v 110ページの『連続性 (Fortran 2008)』

v 219ページの『引数関連付け』

CONTINUE目的

CONTINUE ステートメントは、処置を取らない、実行可能制御ステートメントです。何の影響もありません。このステートメントは、ループの終端ステートメントとして、しばしば使用されます。

構文

�� CONTINUE ��

第 11 章 ステートメントおよび属性 361

Page 388: IBM XL Fortran for Linux, V15.1

例DO 100 I = 1,N

X = X + N100 CONTINUE

関連情報v 149ページの『第 7 章 実行制御』

CYCLE目的

CYCLE ステートメントは、属している DO 構文または DO WHILE 構文の現行実行サイクルを終了させます。

F2008 CYCLE ステートメントは、属している DO CONCURRENT 構文の現行反復の実行を完了させます。 F2008

構文

DO_construct_name

DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれかの構文の名前です。

規則

CYCLE ステートメントは、DO、 F2008 DO CONCURRENT F2008 、またはDO WHILE のいずれかの構文内に配置され、DO_construct_name で指定される特定の DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれかの構文に属します。 DO_construct_name が指定されていない場合、CYCLE ステートメントは、そのすぐ外側の DO、 F2008 DO CONCURRENT F2008 、またはDO WHILE のいずれかの構文に属します。

F2008 CYCLE ステートメントは、外側の構文に属している場合、DOCONCURRENT 構文内に配置してはなりません。 F2008

DO 構文または DO WHILE 構文に属している CYCLE ステートメントの実行は、DO 構文または DO WHILE 構文の現行実行サイクルのみを終了させます。CYCLE ステートメントの後、終了ラベルの付いたアクション・ステートメントを含む実行可能ステートメントは実行されません。DO 構文の場合、もしあれば、プログラム実行は増加処理で続行されます。DO WHILE 構文の場合、プログラム実行は、ループ制御処理で続行されます。

F2008 DO CONCURRENT 構文に属している CYCLE ステートメントの実行は、構文の現行反復の実行を完了させます。 F2008

�� CYCLEDO_construct_name

��

362 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 389: IBM XL Fortran for Linux, V15.1

CYCLE ステートメントには、ステートメント・ラベルを指定できます。ただし、DO 構文を終了する、ラベル付きアクション・ステートメントとしては使用できません。

例LOOP1: DO I = 1, 20

N = N + 1IF (N > NMAX) CYCLE LOOP1 ! cycle to LOOP1

LOOP2: DO WHILE (K==1)IF (K > KMAX) CYCLE ! cycle to LOOP2K = K + 1

END DO LOOP2

LOOP3: DO J = 1, 10N = N + 1IF (N > NMAX) CYCLE LOOP1 ! cycle to LOOP1CYCLE LOOP3 ! cycle to LOOP3

END DO LOOP3

END DO LOOP1END

関連情報v 153ページの『DO 構文』

v 157ページの『DO WHILE 構文』

v 157ページの『DO CONCURRENT 構文 (Fortran 2008)』

DATA目的

DATA ステートメントによって、変数の初期値を指定します。

構文

data_object

変数または暗黙 DO リストです。添え字またはサブストリング式は定数式にする必要があります。

implied-DO list

�� �

,

DATA data_object_list / initial_value_list / ��

第 11 章 ステートメントおよび属性 363

Page 390: IBM XL Fortran for Linux, V15.1

do_object

配列エレメント、スカラー構造体コンポーネント、サブストリング、または暗黙 DO リストです。

do_variable

暗黙 DO 変数と呼ばれる名前付きスカラー整変数です。この変数は、ステートメント・エンティティーです。

integer_expr1、integer_expr2、および integer_expr3

それぞれのスカラー整数式です。この式の 1 次項には、この暗黙DO リストを範囲内に持つ他の暗黙 DO リストの、定数または暗黙DO 変数のみを含めることができます。各処理は組み込みにする必要があります。

initial_value

r 負でないスカラー整数定数です。r は名前付き定数です。これは有効範囲単位で前に宣言されているか、使用関連付けまたはホスト関連付けによってアクセス可能になっている必要があります。

r は、定数の負でないスカラー整数サブオブジェクトにすることもできます。上記段落と同様に、これが名前付き定数のサブオブジェクトである場合、有効範囲単位で前に宣言されているか、使用関連付けまたはホスト関連付けによってアクセス可能になっている必要があります。

r が定数のサブオブジェクトの場合、その中の添え字は定数式になります。r が省略された場合、デフォルト値は 1 です。形式r*data_value は、データ値が r 回連続して現れるのに相当します。

data_value

スカラー定数、符号付き整数リテラル定数、符号付き実数リテラル定数、構造体コンストラクター、定数の スカラー・サブオブジェクト、または NULL() です。

規則

型定義内で非ポインター・オブジェクトのデフォルトの初期化が指定されている場合、そのオブジェクトを DATA ステートメントによって初期化することはできま

�� ( do_object_list , do_variable = integer_expr1 , integer_expr2 �

�, integer_expr3

) ��

��r *

data_value ��

364 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 391: IBM XL Fortran for Linux, V15.1

せん。非ポインター配列オブジェクトを data_object として指定することは、保存された順序で配列オブジェクト内のすべてのエレメントのリストを指定するのと同じです。

ポインター属性を持つ配列は、NULL() である、対応する初期値を 1 つだけ持つことができます。

各 data_object_list は、対応する initial_value_list と同じ項目数を指定する必要があります。これら 2 つのリスト内の項目間で 1 対 1 の対応があります。この対応によって、それぞれの data_object の初期値を設定します。

ポインター初期化の場合、data_value が NULL() であれば、対応する data_object

はポインター属性を持つ必要があります。data_object にポインター属性があれば、対応する data_value を NULL() にする必要があります。

対応する initial_value による各 data_object の定義は、 36ページの『型なし定数の使用方法』に記載されているもの以外、組み込み代入の規則に従う必要があります。

initial_value が構造体コンストラクターである場合、各コンポーネントをa 定数式にする必要があります。data_object が変数である場合、サブストリング、添え字、またはストライドの式を定数式にする必要があります。

data_value が名前付き定数または名前付き定数のサブオブジェクトである場合、名前付き定数は、有効範囲単位で前に宣言されているか、ホスト関連付けまたは使用関連付けによってアクセス可能になっている必要があります。data_value が構造体コンストラクターである場合、派生型は有効範囲単位で前に宣言されているか、ホスト関連付けまたは使用関連付けによってアクセス可能になっている必要があります。

長さがゼロのスカラー文字変数は、そのリストに 1 つの変数を提供しますが、サイズがゼロの配列、反復数がゼロの暗黙 DO リストおよび繰り返し係数がゼロの値は、拡張された initial_value_list に変数を提供しません。

暗黙 DO リストを DATA ステートメントで使用すると、配列エレメント、スカラー構造体コンポーネントおよびサブストリングを初期化できます。暗黙 DO リストは、暗黙 DO 変数の制御のもとに、一連のスカラー構造体コンポーネント、配列エレメント、またはサブストリングに拡張されます。配列エレメントおよびスカラー構造体コンポーネントには定数の親を持たせないでください。各スカラー構造体コンポーネントには、添え字リストを指定する、少なくとも 1 つのコンポーネント参照を含める必要があります。

暗黙 DO リストの範囲は、do_object_list です。暗黙 DO 変数の反復カウントおよび値は、DO ステートメントの場合と同様に、integer_expr1、integer_expr2、およびinteger_expr3 から設定されます。暗黙 DO リストが実行される際、do_object_list 内の項目が、暗黙 DO リストの反復のたびに 1 回、暗黙 DO 変数の出現に対して適切な代替値で指定されます。暗黙 DO 変数の反復カウントが 0 である場合、変数は、拡張シーケンスに追加されません。

第 11 章 ステートメントおよび属性 365

Page 392: IBM XL Fortran for Linux, V15.1

do_object 内の添え字式には、範囲内にこの添え字式を持つ暗黙 DO リストの、定数または暗黙 DO 変数のみを含めることができます。各処理は組み込みにする必要があります。

IBM 拡張

論理定数を持つ論理タイプのリスト項目を初期化する場合、省略形を使用することができます。 (.TRUE. の場合 T、 .FALSE. の場合 F) T または F が、PARAMETER 属性を使用して以前に定義された定数名の場合、XL Fortran は、それを名前付き定数として認識し、その値を DATA ステートメント内の対応するリスト項目に割り当てます。

IBM 拡張 の終り

ブロック・データ・プログラム単位では、DATA ステートメントまたは型宣言ステートメントを使用して名前付き共通域ブロック内の変数に初期値を指定できます。

内部サブプログラムまたはモジュール・サブプログラムでは、data_object がホストにあるエンティティーと同じ名前を持ち、data_object が、内部サブプログラム内の他の仕様ステートメントで宣言されない場合、data_object は、DATA ステートメントの前で参照または定義されません。

DATA ステートメントは、以下に対して初期値を指定できません。

v 自動オブジェクト。

v 仮引数。

v ポインティング先。

v 無名共通ブロック内の変数。

v 関数の結果変数。

v ストレージ・クラスが自動であるデータ・オブジェクト。

v ALLOCATABLE 属性を持つ変数。

実行可能プログラムでは、変数を複数回初期化しないでください。 2 つ以上の変数を関連付ける場合、初期化できるデータ・オブジェクトは 1 つのみです。

例 1:

INTEGER Z(100),EVEN_ODD(0:9)LOGICAL FIRST_TIMECHARACTER*10 CHARARR(1)DATA FIRST_TIME / .TRUE. /DATA Z / 100* 0 /

! Implied-DO listDATA (EVEN_ODD(J),J=0,8,2) / 5 * 0 / &

& ,(EVEN_ODD(J),J=1,9,2) / 5 * 1 /! Nested example

DIMENSION TDARR(3,4) ! Initializes a two-dimensional arrayDATA ((TDARR(I,J),J=1,4),I=1,3) /12 * 0/

! Character substring exampleDATA (CHARARR(J)(1:3),J=1,1) /'aaa'/DATA (CHARARR(J)(4:7),J=1,1) /'bbbb'/DATA (CHARARR(J)(8:10),J=1,1) /'ccc'/

! CHARARR(1) contains 'aaabbbbccc'

366 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 393: IBM XL Fortran for Linux, V15.1

例 2:

TYPE DTINTEGER :: COUNT(2)

END TYPE DT

TYPE(DT), PARAMETER, DIMENSION(3) :: SPARM = DT ( (/3,5/) )

INTEGER :: A(5)

DATA A /SPARM(2)%COUNT(2) * 10/

関連情報v 154ページの『DO ステートメントの実行』

v 174ページの『ステートメント・エンティティーおよび構文エンティティー』

DEALLOCATE目的

DEALLOCATE ステートメントによって、割り振り可能オブジェクトおよびポインター・ターゲットを動的に割り振り解除します。指定した 1 つのポインターは関連付けを解除され、ターゲットに関連付けられた他のポインターは未定義の状態になります。

構文

allocate_object

データ・ポインターまたは割り振り可能オブジェクトです。

stat_variable

スカラー整変数です。

errmsg_variable

スカラー文字変数です。

規則

DEALLOCATE ステートメントに現れる割り振り可能オブジェクトは、割り振られている必要があります。

参照された関数の結果が割り振り可能であるか、結果に割り振り可能サブオブジェクトを持つ構造体がある場合、結果および割り振られた割り振り可能サブオブジェクトは、関数参照を含む、最も内側の実行可能構文の実行後に割り振り解除されます。

�� DEALLOCATE �

� ( allocate_object_list ), STAT = stat_variable (1)

, ERRMSG = errmsg_variable

��

注:

1 Fortran 2003

第 11 章 ステートメントおよび属性 367

Page 394: IBM XL Fortran for Linux, V15.1

TARGET 属性を持つ割り振り可能オブジェクトは、関連付けられたポインターを介して割り振り解除できません。このようなオブジェクトの割り振り解除は、関連付けられたポインターの関連付け状況を未定義状態にします。未定義の割り振り状況を持つ割り振り可能オブジェクトに対して、その時点で、参照、定義、割り振り、または割り振り解除を行うことはできません。 DEALLOCATE ステートメントが正常に実行されると、割り振り可能オブジェクトの割り振り状況は割り振られないようになります。

割り振り解除されるオブジェクトは、最初にファイナライズされます。派生型の変数が割り振り解除される場合、ALLOCATABLE 属性によって割り振られたサブオブジェクトも割り振り解除されます。割り振り可能コンポーネントがファイナライズされたオブジェクトのサブオブジェクトである場合、そのオブジェクトは、コンポーネントが自動的に割り振り解除される前にファイナライズされます。

組み込み代入ステートメントが実行される場合、変数の割り振られたサブオブジェクトは、代入が行われる前に割り振り解除されます。

DEALLOCATE に現れるポインターは、ALLOCATE ステートメントを使用して作成したターゲット全体に関連付ける必要があります。ポインター・ターゲットの割り振り解除は、ターゲットのすべてまたは一部に関連付けられた他のポインターの関連付け状況を未定義の状態にします。

割り振り可能コンポーネントを含む変数を割り振り解除すると、割り振られている変数の割り振り可能コンポーネントがすべて自動的に割り振り解除されます。

STAT= 指定子が表示されず、ステートメントの実行中にエラー条件が発生した場合、プログラムは終了します。STAT= 指定子が表示された場合、stat_variable には、以下の値の内の 1 つが割り当てられます。

IBM 拡張

STAT 値 エラー条件

0 エラーなし

1 割り振り解除を試みた時のシステム・ルーチンでのエラー

2 無効データ・オブジェクトが割り振り解除に指定された

3 1 と 2 の両方のエラー条件が発生した

IBM 拡張 の終り

ヒント

他のポインターが、割り振られたメモリーに関連付けられていない場合、DEALLOCATE

ステートメントを NULLIFY ステートメントの代わりに使用します。

ポインター関数が割り振ったメモリーを割り振り解除します。

368 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 395: IBM XL Fortran for Linux, V15.1

DEALLOCATE ステートメントの実行中にエラー条件が発生した場合、説明的なメッセージが errmsg_variable に割り当てられます。このような条件が発生しなければ、errmsg_variable の値は変更されません。

allocate_object は、同じ DEALLOCATE ステートメント内の他の allocate_object

の値、範囲、割り振り状況、または関連付け状況に左右されないようにしてください。また、同じ DEALLOCATE ステートメント内の stat_variable またはerrmsg_variable の値に左右されないようにしてください。

stat_variable および errmsg_variable は、同じ DEALLOCATE ステートメント内で割り振り解除しないでください。変数は、同じ DEALLOCATE ステートメントにある allocate_object の値、範囲、割り振り状況または関連付け状況に左右されないようにしてください。

例INTEGER, ALLOCATABLE :: A(:,:)INTEGER X,Y

.

.

.ALLOCATE (A(X,Y))

.

.

.DEALLOCATE (A,STAT=I)END

関連情報v 319ページの『ALLOCATE』

v 318ページの『ALLOCATABLE (Fortran 2003)』

v 30ページの『割り振り状況』

v 178ページの『ポインター関連付け』

v 91ページの『据え置き形状配列』

v 228ページの『仮引数が割り振り可能オブジェクトの場合 (Fortran 2003)』

派生型目的

派生型ステートメントは、派生型定義の最初のステートメントです。

構文

type_attribute

PRIVATE、PUBLIC、 BIND(C)、 extends_spec、またはABSTRACT です。

�� TYPE type_name:: ( type_param_name_list ),type_attribute_list ::

��

第 11 章 ステートメントおよび属性 369

Page 396: IBM XL Fortran for Linux, V15.1

type_name

派生型の名前です。

extends_spec (Fortran 2003)以下の通りです。

type_param_name (Fortran 2003)型パラメーターの名前です。詳しくは、 56ページの『派生型パラメーター(Fortran 2003)』を参照してください。

規則

同じ型の属性は、同じ派生型ステートメントに一度しか現れません。

派生型定義が、モジュールの宣言部分内にある場合、指定できる属性は、PRIVATEまたは PUBLIC のみです。派生型定義は、PRIVATE または PUBLIC のいずれかで、両方を指定することはできません。

型を PRIVATE として定義する場合、次のものは、定義するモジュール内でのみアクセス可能となります。

v この派生型の場合は、型名および任意の 型パラメーターの名前

。v その型の構造体コンストラクター

v その型の仮引数または関数結果を持つプロシージャー

type_name を、BYTE および DOUBLECOMPLEX 以外の組み込み型と同じ名前にしないでください。また、type_name を、他のアクセス可能な派生型の名前にしないでください。

Fortran 2003

BIND(C) によって、Fortran 派生型を、C 型と相互に使用できるよう明示的に定義します。コンポーネントは、相互使用可能な型にする必要があります。(追加情報は、 937ページの『型の相互運用性』を参照。)BIND 属性を持つ派生型は、SEQUENCE 型にできません。 BIND 属性を持つ派生型のコンポーネントには、相互使用可能な型と型パラメーターを持たせる必要があります。POINTER またはALLOCATABLE 属性を持たせることはできません。

BIND 属性を持つ派生型には、型パラメーターを持たせることはできません。

�� EXTENDS ( parent_type_name ) ��

�� type_param_name,

��

370 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 397: IBM XL Fortran for Linux, V15.1

parent_type_name は、アクセス可能な型にする必要があります。

拡張可能な型には、ABSTRACT 属性のみを指定できます。

EXTENDS が指定された場合、SEQUENCE は、その型に対して出現できません。

EXTENDS が指定され、定義される型に、ISO_FORTRAN_ENV 組み込みモジュールからの LOCK TYPE 型の最終コンポーネントがある場合、その親タイプには、LOCK TYPE 型の最終コンポーネントが必要です。

EXTENDS を指定する場合、型には、BIND(C) 属性を指定できません。

Fortran 2003 の終り

対応する END TYPE ステートメントで名前を指定する場合、type_name と同じ名前にする必要があります。

例MODULE ABC

TYPE, PRIVATE :: SYSTEM ! Derived type SYSTEM can only be accessedSEQUENCE ! within module ABCREAL :: PRIMARYREAL :: SECONDARYCHARACTER(20), DIMENSION(5) :: STAFF

END TYPEEND MODULE

TYPE MULTIDIM (K,NDIMS)INTEGER, KIND :: KINTEGER, LEN :: NDIMSREAL(K) :: POS(NDIMS)

END TYPE MULTIDIMTYPE, EXTENDS(MULTIDIM) :: NAMED_MULTI (L)

INTEGER, LEN :: LCHARACTER(L) :: NAME

END TYPE NAMED_MULTI

関連情報v 55ページの『第 4 章 派生型』

v 937ページの『型の相互運用性』

v 394ページの『END TYPE』

v 509ページの『SEQUENCE』

v 66ページの『拡張可能派生型 (Fortran 2003)』

v 67ページの『抽象型および据え置きバインディング (Fortran 2003)』

DIMENSION目的

DIMENSION 属性は、エンティティーが配列であることを指定します。

構文

第 11 章 ステートメントおよび属性 371

Page 398: IBM XL Fortran for Linux, V15.1

array_declarator_list

配列のランクを指定するか、配列のランクと形状を指定する、配列宣言子のリストです。

規則

Fortran 規格では、最大 15 の次元を持つ配列を使用できます。

XL Fortran を使用すると、最大 20 個の次元を指定できます。

有効範囲単位に指定できる、配列名の次元仕様は 1 つのみです。

表 39. DIMENSION 属性と互換性のある属性

ALLOCATABLE �1� OPTIONAL PUBLIC

ASYNCHRONOUS PARAMETER SAVE

AUTOMATIC �3� POINTER STATIC �3�

BIND �1� PRIVATE TARGET

CONTIGUOUS �2� PROTECTED �1� VOLATILE

INTENT

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張

例CALL SUB(5,6)CONTAINSSUBROUTINE SUB(I,M)

DIMENSION LIST1(I,M) ! automatic arrayINTEGER, ALLOCATABLE, DIMENSION(:,:) :: A ! deferred-shape array

...END SUBROUTINEEND

関連情報v 85ページの『第 5 章 配列の概念』v 539ページの『VIRTUAL (IBM 拡張)』

DO目的

DO ステートメントによって、それに続くステートメントの実行を、指定した終端ステートメントまで (終端ステートメントを含む) 制御します。同時に、これらのステートメントによって、DO 構文を形成します。

�� DIMENSION array_declarator_list::

��

372 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 399: IBM XL Fortran for Linux, V15.1

構文

DO_construct_name

DO 構文を識別する名前です。

stmt_label

同じ有効範囲単位内の DO ステートメントの後に現れる実行可能ステートメントのステートメント・ラベルです。このステートメントは、DO 構文の終わりを示します。

var_name

DO 変数と呼ばれる、整数型または実数のスカラー変数名です。

a_expr1、a_expr2、および a_expr3

整数型または実数のそれぞれのスカラー式です。

規則

DO_construct_name を DO ステートメントで指定する場合、END DO および同じDO_construct_name を使用して構文を終了する必要があります。逆に、DO_construct_name を DO ステートメントで指定せずに、DO 構文を END DO ステートメントで終了する場合、DO_construct_name を END DO ステートメントに指定しないでください。

DO ステートメントにステートメント・ラベルを指定した場合は、同じステートメント・ラベルの付いたステートメントで DO 構文を終了させなければなりません。ラベル付き DO ステートメントは、そのステートメント・ラベルでラベル付けされた END DO ステートメントを使用して終了できますが、ラベルが付いていないEND DO ステートメントでは終了できません。ラベルを DO ステートメントで指定しない場合、DO 構文は END DO ステートメントを使用して終了する必要があります。

制御節 (var_name で始まる節) が存在しない場合、ステートメントは、無限の DOになります。ループは、中断される (例えば、EXIT ステートメントによって) まで、無限に繰り返されます。

例INTEGER :: SUM=0OUTER: DO

INNER: DO M=1,10READ (5,*) JIF (J.LE.I) THEN

PRINT *, 'VALUE MUST BE GREATER THAN ', ICYCLE INNER

END IF

��DO_construct_name :

DOstmt_label

�var_name = a_expr1, a_expr2

, , a_expr3

��

第 11 章 ステートメントおよび属性 373

Page 400: IBM XL Fortran for Linux, V15.1

SUM=SUM+JIF (SUM.GT.500) EXIT OUTERIF (SUM.GT.100) EXIT INNER

END DO INNERSUM=SUM+II=I+10

END DO OUTERPRINT *, 'SUM =',SUMEND

関連情報v 153ページの『DO 構文』

v END DO ステートメントに関しての詳細は、 389ページの『END (構文)』

v 405ページの『EXIT』

v 362ページの『CYCLE』

v 574ページの『INDEPENDENT』

v 560ページの『ASSERT』

v 564ページの『CNCALL』

v 586ページの『PERMUTATION』

v 「XL Fortran 最適化およびプログラミング・ガイド」の『PARALLEL DO/ENDPARALLEL DO』

DO CONCURRENT (Fortran 2008)目的

DO CONCURRENT ステートメントは DO CONCURRENT 構文の最初のステートメントであり、これを使用して、個々のループ反復に相互依存性がないことを指定できます。

構文

DO_construct_name

DO CONCURRENT 構文を識別する名前です。

�� DO CONCURRENT concurrent_headerDO_construct_name : stmt_label ,

��

concurrent_header は以下のとおりです。

�� ( concurrent_control_list )integer_type_spec :: , scalar_mask_expr

��

concurrent_control は以下のとおりです。

�� index_name = concurrent_limit : concurrent_limit: concurrent_step

��

374 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 401: IBM XL Fortran for Linux, V15.1

stmt_label

同じ有効範囲単位内の DO CONCURRENT ステートメントの後にある実行可能ステートメントのステートメント・ラベルです。 DO CONCURRENT構文の終わりを指示します。

scalar_mask_expr

スカラー論理式です。 FORALL 構文で使用された場合と同様に、index-name 値の各組み合わせについて評価されます。

index_name

スカラー整数である名前付き変数です。 DO CONCURRENT 構文の有効範囲を持ちます。

concurrent_limit, concurrent_step

いずれもスカラー整数式です。これらは、FORALL 構文で有効な任意の順序で評価できます。

制約v concurrent_control 内の concurrent_limit または concurrent_step は、

concurrent_limit または concurrent_step のいずれかのパラメーターがあるconcurrent_control_list 内のどの index_name に対する参照も含んでいてはなりません。

v CYCLE ステートメントは、外側の構文に属している場合、DO CONCURRENT構文内にあってはなりません。

v RETURN ステートメントは、DO CONCURRENT 構文内にあってはなりません。

v DO CONCURRENT 構文内の分岐には、構文の外部にある分岐ターゲットがあってはなりません。

v 非純粋プロシージャーに対する参照は、DO CONCURRENT 構文内にあってはなりません。

v 組み込みモジュール IEEE_EXCEPTIONS からプロシージャーIEEE_GET_FLAG、IEEE_SET_HALTING_MODE、またはIEEE_GET_HALTING_MODE への参照は、DO CONCURRENT 構文内にあってはなりません。

v EXIT ステートメントは、CRITICAL 構文または DO CONCURRENT 構文に属しているか、その外側の構文に属している場合、このいずれかの構文内にあってはなりません。

規則

DO 構文の DO ステートメントが DO_construct_name を指定している場合、対応する END_DO_statement は同じ DO_construct_name を指定していなければなりません。そうでない場合、対応する END_DO_statement は DO_construct_name を指定してはなりません。

DO CONCURRENT 構文に属する CYCLE ステートメントの実行は、構文のその反復の実行を完了させます。

integer_type_spec は、concurrent_header にある場合、指定された型および型パラメーターを持ちます。そうでない場合は、以下の規則が適用されます。

第 11 章 ステートメントおよび属性 375

Page 402: IBM XL Fortran for Linux, V15.1

v その型および型パラメーターは、最も内側の実行可能構文または有効範囲単位内の変数の名前である場合に持つ型および型パラメーターと同じものになります。また、この型は整数でなければなりません。

v index_name は、共通ブロック名またはスカラー変数名を除き、アクセス可能なグローバル ID、ローカル ID、または外側の構文エンティティーの ID と同じであってはなりません。

index_name 値の組み合わせのセットは、制御仕様で定義されたセットのデカルト積です。 index_name 値の組み合わせのセットは、scalar_mask_expr が値 .TRUE. を持つ場合にアクティブです。 index_name は、このセットの評価時に定義済みになります。 DO CONCURRENT 構文の範囲が、index_name 値のアクティブな組み合わせごとに実行されます。この範囲の実行はそれぞれ反復です。実行は任意の順序で行われます。

含まれる DO CONCURRENT 構文の index_name は、含んでいるどの DOCONCURRENT 構文の index_name とも同じであってはなりません。

DO CONCURRENT 構文の場合、すべての反復の実行が完了すると、ループは終了し、DO 構文は非アクティブになります。

DO CONCURRENT 構文の終了時には、以下の規則が適用されます。

v ポインターの関連付け状況が構文の複数の反復内で変更された場合、ポインターの関連付け状況はプロセッサーに依存します。

v 構文の複数の反復中に、定義済みであるか、未定義になった変数は、未定義になります。

DO CONCURRENT 構文の異なる反復によって作成されたレコードの順序付けは、レコードが複数の反復によって順次アクセス用に接続されたファイルに書き込まれている場合、プロセッサーに依存します。

DO CONCURRENT 構文の実行に関連する規則は以下のとおりです。

v 反復内で参照される変数は、その反復中に事前に定義されていなければなりません。あるいは、他のいずれかの反復中に、定義されるか、未定義になってはなりません。複数の反復によって定義されるか、未定義になる変数は、ループの終了時に未定義になります。この規則は、ループ内で呼び出されるすべてのプロシージャーに適用されます。

v ポインターの割り当て、割り振り、またはヌル化の場合以外にポインターが反復内で使用された場合、ポインターはその反復中に事前に関連付けられていなければなりません。あるいは、他のいずれかの反復中にポインター関連付けが変更されてはなりません。複数の反復内でポインター関連付けが変更されたポインターは、構文の終了時に、関連付けの未定義状況になります。

v 割り振り可能オブジェクトが、反復内で、参照、定義、割り振り解除されるか、その割り振り状況、動的型、または据え置き型のパラメーター値が照会される場合、そのオブジェクトは、その反復内で事前に割り振られていなければなりません。あるいは、他のいずれかの反復内で割り振りまたは割り振り解除が行われてはなりません。割り振り可能オブジェクトが複数の反復内で割り振られている場合、そのオブジェクトは、各反復の終わりに割り振り状況が「割り振り解除済み」になっていなければなりません。

376 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 403: IBM XL Fortran for Linux, V15.1

v データが 1 つの反復内でファイル・レコードまたはファイル位置に書き込まれる場合、そのファイル内のそのレコードまたは位置は、別の反復内から読み取られるか、別の反復内に書き込まれてはなりません。

関連情報v 362ページの『CYCLE』

v 157ページの『DO CONCURRENT 構文 (Fortran 2008)』

v 389ページの『END (構文)』

v 405ページの『EXIT』

v 502ページの『RETURN』

DO WHILE目的

DO WHILE ステートメントは、DO WHILE 構文内の最初のステートメントです。これによって、ステートメント内で指定された論理式が真であり続けるかぎり、次のステートメント・ブロックを、指定した終端ステートメントまで (終端ステートメントを含む)、繰り返して実行させるように指示します。

構文

DO_construct_name

DO WHILE 構文を識別する名前です。

stmt_label

同じ有効範囲単位内の DO WHILE ステートメントの後に現れる実行可能ステートメントのステートメント・ラベルです。これは、DO WHILE 構文の終わりを示します。

logical_expr

スカラー論理式です。

規則

DO_construct_name を DO WHILE ステートメントで指定した場合、END DO および同じ DO_construct_name を使用して構文を終了する必要があります。逆に、DO_construct_name を DO WHILE ステートメントで指定せずに、DO WHILE 構文を END DO ステートメントで終了した場合、DO_construct_name を END DOステートメントに指定しないでください。

ステートメント・ラベルを DO WHILE ステートメントで指定した場合、そのステートメント・ラベルでラベル付けされたステートメントを使用して、DO WHILE

�� DODO_construct_name : stmt_label ,

� WHILE ( logical_expr ) ��

第 11 章 ステートメントおよび属性 377

Page 404: IBM XL Fortran for Linux, V15.1

構文を終了する必要があります。ラベル付き DO WHILE ステートメントは、そのステートメント・ラベルでラベル付けされた END DO ステートメントを使用して終了できますが、ラベルが付いていない END DO ステートメントでは終了できません。ラベルを DO WHILE ステートメントで指定しない場合、DO WHILE 構文は END DO ステートメントを使用して終了する必要があります。

例MYDO: DO 10 WHILE (I .LE. 5) ! MYDO is the construct name

SUM = SUM + INCI = I + 1

10 END DO MYDOEND

SUBROUTINE EXAMPLE2REAL X(10)LOGICAL FLAG1DATA FLAG1 /.TRUE./DO 20 WHILE (I .LE. 10)

X(I) = AI = I + 1

20 IF (.NOT. FLAG1) STOPEND SUBROUTINE EXAMPLE2

関連情報v 157ページの『DO WHILE 構文』

v END DO ステートメントに関しての詳細は、 389ページの『END (構文)』

v 405ページの『EXIT』

v 362ページの『CYCLE』

DOUBLE COMPLEX (IBM 拡張)目的

DOUBLE COMPLEX 型宣言ステートメントによって、二重複素数型のオブジェクトと関数の属性を指定します。初期値はオブジェクトに代入することができます。

構文

ここで、

attr_spec

以下のいずれかです。

ALLOCATABLE �1� INTRINSIC PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PARAMETER STATIC �2�

�� DOUBLE COMPLEX entity_decl_list::, attr_spec_list ::

��

378 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 405: IBM XL Fortran for Linux, V15.1

BIND �1� POINTER TARGET

DIMENSION (array_spec) PRIVATE VALUE �1�

EXTERNAL PROTECTED �1� VOLATILE

INTENT (intent_spec)

注:�1� Fortran 2003

�2� IBM 拡張

attr_spec

個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

intent_spec

IN、OUT、または INOUT のいずれかになります。

:: 二重コロン区切り文字です。属性 =constant_expr または => NULL() を指定する場合、二重コロン区切り文字を使用します。

array_spec

次元範囲のリストです。

entity_decl

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数には指定できません。

initial_value

すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。

constant_expr

直前の名前によって指定されるエンティティーの定数式を指定します。

=> NULL()ポインター・オブジェクトの初期値を指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

v コンパイラーは、型定義の有効範囲単位内の constant_expr を評価します。

�� a( array_spec ) / initial_value_list /

= constant_expr=> NULL()

��

第 11 章 ステートメントおよび属性 379

Page 406: IBM XL Fortran for Linux, V15.1

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

変数に constant_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。組み込み関数の型を確認する型宣言ステートメントを使用できます。一般または特定の組み込み関数の名前が型宣言ステートメント内に現れても、名前がその組み込みプロパティーを失うことはありません。

オブジェクトが、仮引数、割り振り可能オブジェクト、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内では初期化できません。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通ブロックに現れる場合、またはモジュール内 F2008 あるいはサブモジュール内 F2008 の名前付き共通ブロックに現れる場合は、オブジェクトを初期化できます。

Fortran 95 では、ポインターを初期化できます。ポインターは、=> NULL() の使用によってのみ初期化できます。

array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

ステートメントに PARAMETER 属性が含まれている場合は、constant_expr を指定する必要があります。宣言するエンティティーが変数で、constant_expr またはNULL() が指定された場合、変数は最初に定義されます。宣言するエンティティーが派生型コンポーネントで、constant_expr または NULL() が指定された場合、派生型はデフォルトの初期化値を持ちます。a は、組み込み代入の規則に応じて、constant_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、constant_expr または =>

NULL() の存在は、a が、名前付き共通域ブロック内のオブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。

380 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 407: IBM XL Fortran for Linux, V15.1

ALLOCATABLE または POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

例SUBROUTINE SUB

DOUBLE COMPLEX, STATIC, DIMENSION(1) :: BEND SUBROUTINE

関連情報v 354ページの『COMPLEX』

v 114ページの『定数式』

v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』

v 86ページの『配列宣言子』

v 21ページの『自動オブジェクト』

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 初期値に関しての詳細は、 363ページの『DATA』

DOUBLE PRECISION目的

DOUBLE PRECISION 型宣言ステートメントによって、倍精度型のオブジェクトと関数の属性を指定します。初期値はオブジェクトに代入することができます。

構文

ここで、

attr_spec

以下のいずれかです。

ALLOCATABLE �1� INTRINSIC PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PARAMETER STATIC �2�

BIND �1� POINTER TARGET

DIMENSION (array_spec) PRIVATE VALUE �1�

�� DOUBLE PRECISION entity_decl_list::, attr_spec_list ::

��

第 11 章 ステートメントおよび属性 381

Page 408: IBM XL Fortran for Linux, V15.1

EXTERNAL PROTECTED �1� VOLATILE

INTENT (intent_spec)

注:�1� Fortran 2003

�2� IBM 拡張

attr_spec

個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

intent_spec

IN、OUT、または INOUT のいずれかになります。

:: 二重コロン区切り文字です。属性 =initialization_expr または => NULL()を指定する場合、二重コロン区切り文字を使用します。

array_spec

次元範囲のリストです。

entity_decl

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数には指定できません。

initial_value

すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。

initialization_expr

すぐ前に来る名前によって指定されるエンティティーの初期値を定数式によって指定します。

=> NULL()ポインター・オブジェクトの初期値を指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

�� a( array_spec ) (1)

/ initial_value_list /= initialization_expr=> NULL()

��

注:

1 IBM 拡張.

382 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 409: IBM XL Fortran for Linux, V15.1

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

v コンパイラーは、型定義の有効範囲単位内の initialization_expr を評価します。

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

変数に initialization_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。組み込み関数の型を確認する型宣言ステートメントを使用できます。一般または特定の組み込み関数の名前が型宣言ステートメント内に現れても、名前がその組み込みプロパティーを失うことはありません。

オブジェクトが、仮引数、割り振り可能オブジェクト、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内では初期化できません。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通ブロックに現れる場合、 またはモジュール内あるいはサブモジュール内の名前付き共通ブロックに現れる場合は、オブジェクトを初期化できます。

Fortran 95 では、ポインターを初期化できます。ポインターは、=> NULL() の使用によってのみ初期化できます。

array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

initialization_expr は、ステートメントに PARAMETER 属性が含まれている場合、指定する必要があります。宣言するエンティティーが変数で、initialization_exprまたは NULL() が指定された場合、変数は最初に定義されます。宣言するエンティティーが派生型コンポーネントで、initialization_expr または NULL() が指定された場合、派生型はデフォルトの初期化値を持ちます。a は、組み込み代入の規則に応じて、initialization_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、initialization_expr または=> NULL() の存在は、a が、名前付き共通域ブロック内のオブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

第 11 章 ステートメントおよび属性 383

Page 410: IBM XL Fortran for Linux, V15.1

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。

POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

例DOUBLE PRECISION, POINTER :: PTRDOUBLE PRECISION, TARGET :: TAR

関連情報v 496ページの『REAL』

v 114ページの『定数式』

v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』

v 86ページの『配列宣言子』

v 21ページの『自動オブジェクト』

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 初期値に関しての詳細は、 363ページの『DATA』

ELSE目的

ELSE ステートメントは、IF 構文内のオプションの ELSE ブロックの最初のステートメントです。

構文

IF_construct_name

IF 構文を識別する名前です。

構文

IF 構文内の前の論理式がすべて偽と評価された場合、制御は、ELSE ブロックに分岐します。ELSE ブロックのステートメント・ブロックは実行され、IF 構文は完了します。

�� ELSEIF_construct_name

��

384 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 411: IBM XL Fortran for Linux, V15.1

IF_construct_name を指定した場合、IF ステートメント・ブロックで指定した名前と同じ名前にする必要があります。

例IF (A.GT.0) THEN

B = B-AELSE ! the next statement is executed if a<=0

B = B+AEND IF

関連情報v 158ページの『IF 構文』

v END IF ステートメントに関しての詳細は、 389ページの『END (構文)』

v 『ELSE IF』

ELSE IF目的

ELSE IF ステートメントは、IF 構文内のオプションの ELSE IF ブロックの最初のステートメントです。

構文

IF_construct_name

IF 構文を識別する名前です。

規則

scalar_logical_expr は、IF 構文内の前の論理式が評価されていない場合、真と評価されます。scalar_logical_expr が真の場合、それに続くステートメント・ブロックが実行され、IF 構文が完了します。

IF_construct_name を指定した場合、IF ステートメント・ブロックで指定した名前と同じ名前にする必要があります。

例IF (I.EQ.1) THEN

J=J-1ELSE IF (I.EQ.2) THEN

J=J-2ELSE IF (I.EQ.3) THEN

J=J-3ELSE

J=J-4END IF

�� ELSE IF ( scalar_logical_expr ) THENIF_construct_name

��

第 11 章 ステートメントおよび属性 385

Page 412: IBM XL Fortran for Linux, V15.1

関連情報v 158ページの『IF 構文』

v END IF ステートメントに関しての詳細は、 389ページの『END (構文)』

v 384ページの『ELSE』

ELSEWHERE目的

ELSEWHERE ステートメントは、WHERE 構文内のオプションの ELSEWHEREまたはマスクした ELSEWHERE ブロックの最初のステートメントです。

構文

mask_expr

論理配列式です。

where_construct_name

WHERE 構文を識別する名前です。

規則

マスクした ELSEWHERE ステートメントには、mask_expr が含まれます。マスク式の解釈については、 136ページの『マスクされた配列代入の解釈』を参照してください。WHERE 構文内の各 mask_expr は、同型を持つ必要があります。

where_construct_name を指定した場合、WHERE 構文ステートメントで指定した名前と同じ名前にする必要があります。

ELSEWHERE およびマスクした ELSEWHERE ステートメントは、分岐ターゲット・ステートメントにしないでください。

次の例では、簡単にマスクした ELSEWHERE ステートメントを使用して、配列内のデータを変更するプログラムを示します。

INTEGER ARR1(3, 3), ARR2(3,3), FLAG(3, 3)

ARR1 = RESHAPE((/(I, I=1, 9)/), (/3, 3 /))ARR2 = RESHAPE((/(I, I=9, 1, -1 /), (/3, 3 /))FLAG = -99

! Data in arrays ARR1, ARR2, and FLAG at this point:!! ARR1 = | 1 4 7 | ARR2 = | 9 6 3 | FLAG = | -99 -99 -99 |! | 2 5 8 | | 8 5 2 | | -99 -99 -99 |! | 3 6 9 | | 7 4 1 | | -99 -99 -99 |

WHERE (ARR1 > ARR2)

�� ELSEWHERE( mask_expr ) where_construct_name

��

386 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 413: IBM XL Fortran for Linux, V15.1

FLAG = 1ELSEWHERE (ARR1 == ARR2)

FLAG = 0ELSEWHERE

FLAG = -1END WHERE

! Data in arrays ARR1, ARR2, and FLAG at this point:!! ARR1 = | 1 4 7 | ARR2 = | 9 6 3 | FLAG = | -1 -1 1 |! | 2 5 8 | | 8 5 2 | | -1 0 1 |! | 3 6 9 | | 7 4 1 | | -1 1 1 |

関連情報v 133ページの『WHERE 構文』

v 545ページの『WHERE』

v END WHERE ステートメントに関しての詳細は、 389ページの『END (構文)』

END目的

END ステートメントによって、プログラム単位またはプロシージャーの終わりを示します。

構文

規則

END ステートメントは、プログラム単位内の唯一の必須ステートメントです。

�� ENDBLOCK DATA

BLOCK_DATA_nameFUNCTION

FUNCTION_nameMODULE

MODULE_name(1)

PROCEDUREPROCEDURE_name

PROGRAMPROGRAM_name

SUBROUTINESUBROUTINE_name

(2)SUBMODULE

SUBMODULE_name

��

注:

1 Fortran 2008

2 Fortran 2008

第 11 章 ステートメントおよび属性 387

Page 414: IBM XL Fortran for Linux, V15.1

名前が END BLOCK DATA、END FUNCTION、END MODULE、ENDPROGRAM、END SUBROUTINE、 F2008 END SUBMODULE または ENDPROCEDURE F2008 ステートメントで指定される場合、対応する BLOCKDATA、FUNCTION、MODULE、PROGRAM、SUBROUTINE、 F2008

SUBMODULE または MODULE PROCEDURE F2008 ステートメントに指定された名前と同じにする必要があります。

内部サブプログラムまたはモジュール・サブプログラムの場合、END ステートメントに FUNCTION または SUBROUTINE キーワードを指定する必要があります。

F2008 Fortran 2008 では、内部サブプログラムおよびモジュール・サブプログラムの END ステートメントで FUNCTION キーワードと SUBROUTINE キーワードを省略できます。ただし、FUNCTION キーワードまたは SUBROUTINE キーワードを省略した場合、END ステートメントに関数名またはサブルーチン名を追加できません。 F2008 ブロック・データ・プログラム単位、外部サブプログラム、メインプログラム、モジュール、インターフェース本体、 F2008 サブモジュール、および分離モジュール・サブプログラム F2008 の場合は、対応するキーワードはオプションです。

ステートメント END、END FUNCTION、 F2008 END PROCEDURE、 F2008

END PROGRAM、および END SUBROUTINE は分岐が可能な実行可能ステートメントです。固定ソース形式および Fortran 90 自由ソース形式の形式設定で、他のステートメントを、同じ行で END ステートメントに続けることはできません。固定ソース形式の形式設定では、プログラム単位の END ステートメントを続けられません。また最初の行がプログラム単位の END ステートメントとして現れるステートメントも続けられません。

メインプログラムの END ステートメントは、プログラムの実行を終了します。関数またはサブルーチンの END ステートメントには、RETURN ステートメントと同じ効果があります。インライン・コメントは、END ステートメントして、同じ行に指定できます。END ステートメントの後に現れるコメント行は、次のプログラム単位に属します。

例PROGRAM TEST

CALL SUB()CONTAINS

SUBROUTINE SUB

...END SUBROUTINE ! Reference to subroutine name SUB is optional

END PROGRAM TEST

関連情報v 169ページの『第 8 章 プログラム単位およびプロシージャー』

388 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 415: IBM XL Fortran for Linux, V15.1

END (構文)目的

END (構文) ステートメントによって、構文の実行を終了します。構文終了ステートメント の表には、各構文を終了するのに適切なステートメントがリストされています。

表 40. 構文終了ステートメント

構文 終了ステートメント

ASSOCIATE �1� END ASSOCIATE

BLOCK �2� END BLOCK

DO END DO

DO CONCURRENT�2�

DO WHILE

FORALL END FORALL

IF END IF

SELECT CASE END SELECT

SELECT TYPE �1�

WHERE END WHERE

注:�1� Fortran 2003

�2� Fortran 2008

第 11 章 ステートメントおよび属性 389

Page 416: IBM XL Fortran for Linux, V15.1

構文

ASSOCIATE_construct_name(Fortran 2003)ASSOCIATE 構文を識別する名前です。

BLOCK_construct_name (Fortran 2008)BLOCK 構文を識別する名前です。

DO_construct_name

DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれかの構文を識別する名前です。

FORALL_construct_name

FORALL 構文を識別する名前です。

IF_construct_name

IF 構文を識別する名前です。

CASE_construct_name

SELECT CASE 構文を識別する名前です。

SELECT_TYPE_construct_name (Fortran 2003)SELECT TYPE 構文を識別する名前です。

where_construct_name

WHERE 構文を識別する名前です。

�� END ASSOCIATE(1)

ASSOCIATE_construct_nameBLOCK

(2)BLOCK_construct_name

DODO_construct_name

FORALLFORALL_construct_name

IFIF_construct_name

(3)SELECT

CASE_construct_name

SELECT_TYPE_construct_nameWHERE

where_construct_name

��

注:

1 Fortran 2003

2 Fortran 2008

3 Fortran 2003

390 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 417: IBM XL Fortran for Linux, V15.1

規則

END DO ステートメントにラベルを付けた場合は、これをラベル付きまたはラベルなし DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれかの構文の終端ステートメントとして使用できます。 END DO ステートメントは、最も内側の DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれかの構文のみを終了させます。 DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれかのステートメントでステートメント・ラベルが指定されていない場合、DO 構文または DO WHILE 構文の終端ステートメントはEND DO ステートメントでなければなりません。

以下の構文では、対応する END ステートメントに、内部または外部から分岐を作成できます。

表 41. 構文の内外から END ステートメントへの分岐

構文名 内部からの分岐 外部からの分岐 分岐先

ASSOCIATE �1� ' END ASSOCIATE �1�

BLOCK �2� ' ' END BLOCK �2�

DO ' END DO

DO

CONCURRENT�2�

'

DO WHILE '

IF �3� ' ' END IF

CASE ' END SELECT

注:�1� Fortran 2003

�2� Fortran 2008

�3� Fortran 95 では、IF 構文の外側から対応する END IF ステートメントに分岐を作成できません。

構文を開始するステートメントに構文名を指定した場合、構文を終了する END ステートメントにも同じ構文名を指定する必要があります。逆に、構文を開始するステートメントに構文名を指定しない場合、構文名を END ステートメントに指定しないでください。

END WHERE ステートメントを、分岐ターゲット・ステートメントにしないでください。

例INTEGER X(100,100)DECR: DO WHILE (I.GT.0)

...IF (J.LT.K) THEN

...END IF ! Cannot reference a construct nameI=I-1

END DO DECR ! Reference to construct name DECR mandatory

END

次の例には、where_construct_name の無効な使用を示します。

第 11 章 ステートメントおよび属性 391

Page 418: IBM XL Fortran for Linux, V15.1

BW: WHERE (A /= 0)B = B + 1

END WHERE EW ! The where_construct_name on the END WHERE statement! does not match the where_construct_name on the WHERE! statement.

関連情報v 149ページの『第 7 章 実行制御』

v 150ページの『ASSOCIATE 構文 (Fortran 2003)』

v 151ページの『BLOCK 構文 (Fortran 2008)』

v 1117ページの『削除されたフィーチャー』

v 372ページの『DO』

v 374ページの『DO CONCURRENT (Fortran 2008)』

v 377ページの『DO WHILE』

v 411ページの『FORALL』

v 415ページの『FORALL (構文)』

v 428ページの『IF (ブロック)』

v 507ページの『SELECT CASE』

v 508ページの『SELECT TYPE (Fortran 2003)』

v 545ページの『WHERE』

END INTERFACE目的

END INTERFACE ステートメントによって、プロシージャー・インターフェース・ブロックを終了します。

構文

generic_spec

�� END INTERFACEgeneric_spec

��

�� generic_nameOPERATOR ( defined_operator )ASSIGNMENT ( = )

(1)dtio_generic_spec

��

注:

1 Fortran 2003

392 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 419: IBM XL Fortran for Linux, V15.1

defined_operator

定義済みの単項演算子、定義済みの 2 項演算子、または拡張組み込み演算子です。

Fortran 2003

dtio_generic_spec

Fortran 2003 の終り

規則

各 INTERFACE ステートメントには、対応する END INTERFACE ステートメントが必要です。

generic_spec なしの END INTERFACE ステートメントは、generic_spec のあるなしにかかわらず INTERFACE ステートメントに一致します。

END INTERFACE ステートメント内の generic_spec が、generic_name である場合、対応する INTERFACE ステートメントの generic_spec を同じ generic_name

にする必要があります。

END INTERFACE ステートメント内の generic_spec が、OPERATOR(defined_operator) である場合、対応する INTERFACE ステートメントのgeneric_spec を同じ OPERATOR(defined_operator) にする必要があります。

END INTERFACE ステートメント内の generic_spec が、ASSIGNMENT(=) である場合、対応する INTERFACE ステートメントの generic_spec を同じASSIGNMENT(=) にする必要があります。

END INTERFACE ステートメント内の generic_spec が、dtio_generic_spec である場合、対応する INTERFACE ステートメントのgeneric_spec を同じdtio_generic_spec にする必要があります。

例INTERFACE OPERATOR (.DETERMINANT.)

FUNCTION DETERMINANT (X)INTENT(IN) XREAL X(50,50), DETERMINANT

END FUNCTIONEND INTERFACE

�� READ ( FORMATTED )READ ( UNFORMATTED )WRITE ( FORMATTED )WRITE ( UNFORMATTED )

��

第 11 章 ステートメントおよび属性 393

Page 420: IBM XL Fortran for Linux, V15.1

INTERFACE OPERATOR(.INVERSE.)FUNCTION INVERSE(Y)

INTENT(IN) YREAL Y(50,50), INVERSE

END FUNCTIONEND INTERFACE OPERATOR(.INVERSE.)

関連情報v 448ページの『INTERFACE』

v 183ページの『インターフェースの概念』

END TYPE目的

END TYPE ステートメントによって、派生型定義の完了を示します。

構文

規則

type_name を指定する場合、対応する 派生型内の type_name に一致させる必要があります。

END TYPE ステートメントでラベルが指定された場合、そのラベルは、派生型定義の有効範囲単位に属します。

例TYPE A

INTEGER :: BREAL :: C

END TYPE A

関連情報v 55ページの『第 4 章 派生型』

ENDFILE目的

ENDFILE ステートメントによって、順次アクセスに関連付けられた外部ファイルの次のレコードとしてファイル終了レコードを書き込みます。このレコードは、ファイル内の最終レコードになります。

ストリーム・アクセスに関連付けされたファイルの ENDFILE ステートメントによって、終端点が現在のファイル位置になります。現在位置より前のファイル記憶単

�� END TYPEtype_name

��

394 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 421: IBM XL Fortran for Linux, V15.1

位は、書き込み済みであるとみなされ、読み取りが可能です。後続のストリーム出力ステートメントを使用して、ファイルに追加データを書き込めます。

ENDFILE ステートメントの実行により、指定した装置の保留非同期データ転送処理のために待機命令を実行します。

構文

u 外部装置識別子です。u の値を、アスタリスクまたはホレリス定数にしないでください。

position_list

必ず 1 つの装置指定子 ([UNIT=]u) を含み、他の有効な指示子のそれぞれのうちの 1 つを含めることのできるリストです。

[UNIT=] u

装置指定子です。u は、値がアスタリスクではない外部装置識別子にする必要があります。外部装置識別子は、外部ファイルを参照します。これは、以下のいずれかになります。

v 値の範囲が 1 から 2147483647 である整数式。

v F2008 A NEWUNIT 値 F2008

オプション文字 UNIT= を省略する場合、u を、position_list の最初の項目にする必要があります。

IOMSG= iomsg_variable (Fortran 2003)入出力状況指定子です。これは、入出力操作によって戻されるメッセージを指定します。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

v エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

v このような条件が発生しない場合は、変数の値は変更されません。

IOSTAT= ios

入出力操作の状況を示す入出力状況指定子です。 ios は、INTEGER(4) 型のスカラー変数またはデフォルトの整数です。 ENDFILE ステートメントが実行を終了すると、 ios は、以下の値で定義されます。

v エラー条件が発生しない場合はゼロ値

v エラーが発生した場合は正の値

ERR= stmt_label

エラー指定子です。これは、エラーが発生した場合に、制御の転送先と同じ

�� ENDFILE u( position_list )

��

第 11 章 ステートメントおよび属性 395

Page 422: IBM XL Fortran for Linux, V15.1

有効範囲単位内にある実行可能ステートメントのステートメント・ラベルを指定します。ERR= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

規則

IBM 拡張

装置が関連付けられていない場合、順次アクセスを指定する暗黙 OPEN が、fort.nという名前のデフォルト・ファイルに対して実行されます。n は先行ゼロを除去した u の値です。

2 つの ENDFILE ステートメントが、介入 REWIND または BACKSPACE ステートメントなしで、同じファイルに対して実行された場合、2 番目の ENDFILE ステートメントは無視されます。

IBM 拡張 の終り

順次アクセスに関連付けられたファイルの ENDFILE ステートメントの実行後、BACKSPACE または REWIND ステートメントを使用して、ファイルをデータ転送の入出力ステートメントの実行の前に位置変更する必要があります。

ERR= および IOSTAT= 指定子が設定され、エラーが検出された場合、ERR= 指定子によって指定されたステートメントに転送され、正整数値が ios に割り当てられます。

IBM 拡張

IOSTAT= および ERR= が指定されない場合、以下のようになります。

v 重大エラーが検出された場合、プログラムは停止します。

v リカバリー可能エラーが検出され、ERR_RECOVERY 実行時オプションが YESに設定されている場合は、プログラムは継続されて次のステートメントに進みます。オプションが NO に設定されている場合は、プログラムは停止します。

IBM 拡張 の終り

例ENDFILE 12ENDFILE (IOSTAT=IOSS,UNIT=11)

関連情報v 254ページの『条件および IOSTAT 値』

v 241ページの『第 9 章 XL Fortran の入出力』

v 「XL Fortran コンパイラー・リファレンス」に記載される『実行時オプションの設定』

396 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 423: IBM XL Fortran for Linux, V15.1

ENTRY目的

関数サブプログラムまたはサブルーチン・サブプログラムには、SUBROUTINE または FUNCTION ステートメントを通して設定される 1 次入口点があります。ENTRY ステートメントによって、外部サブプログラムまたはモジュール・サブプログラムの代替入口点を設定します。

構文

entry_name

関数サブプログラムまたはサブルーチン・サブプログラム内の入口点の名前です。

binding_label

文字を初期化するためのスカラー式です。

規則

ENTRY ステートメントは、メインプログラム、ブロック・データ・プログラム単位、内部サブプログラム、IF 構文、 DO 構文、CASE 構文、派生型定義またはインターフェース・ブロックに指定できません。

ENTRY ステートメントは、CRITICAL、MASTER、PARALLEL、PARALLEL SECTIONS、SECTIONS、または SINGLE 構文内に指定できません。

ENTRY ステートメントは、外部サブプログラムやモジュール・サブプログラムのFUNCTION または SUBROUTINE ステートメントの後 (および USE ステートメントの後) の、制御構文、派生型定義、またはインターフェース・ブロック内のステートメント・ブロック以外の場所に指定できます。ENTRY ステートメントは、実行可能ではなく、サブプログラムの実行中の制御順序付けに何の影響も与えません。

�� ENTRY entry_name( )

dummy_argument_list

� �

RESULT ( result_name )(1)

BIND ( C ), NAME = binding_label

��

注:

1 Fortran 2003

第 11 章 ステートメントおよび属性 397

Page 424: IBM XL Fortran for Linux, V15.1

結果変数を指定するのであれば、それは result_name になります。指定しない場合は、entry_name になります。ENTRY ステートメントの結果変数の特性が、FUNCTION ステートメントの結果変数と同じである場合、それらが別々の名前でも、結果変数は、同じ変数を識別します。それ以外の場合は、結果変数は、ストレージで関連付けられて、すべて、組み込み (非文字) 型の非ポインターで、割り振り不可能なスカラーになります。result_name は、FUNCTION ステートメントまたは他の ENTRY ステートメントに指定された結果変数名と同じにできます。

結果変数は、COMMON、DATA、整数 POINTER、または EQUIVALENCE ステートメントに指定できません。また、PARAMETER、INTENT、OPTIONAL、SAVE、VOLATILE 属性を持つことができません。STATIC および AUTOMATIC属性は、結果変数が割り振り可能オブジェクト、配列、またはポインターでなく、文字型や派生型でない場合にのみ指定できます。

RESULT キーワードを指定する場合、ENTRY ステートメントを、関数サブプログラム内に置き、entry_name が、関数サブプログラムの有効範囲内の仕様ステートメント内に現れないようにして、result_name が、entry_name と同じにならないようにする必要があります。

結果変数を、型宣言ステートメントまたは DATA ステートメントで初期化しないでください。

外部サブプログラムの入口名は、グローバル・エンティティーです。モジュール・サブプログラム内の入口名は、グローバル・エンティティーではありません。入口のインターフェースは、入口名がインターフェース本体でプロシージャー名として使用される場合にのみ、インターフェース・ブロックに指定できます。

多くて 1 つの RESULT 節と 1 つの BIND 節を指定できます。いずれの順序でも指定できます。

BIND キーワードによって、C プログラミング言語からエンティティーにアクセスする名前を指定する結合ラベルを、暗黙的または明示的に定義します。結果がある場合、結果変数は相互使用可能なスカラーにする必要があります。結合ラベルは、仮引数に指定できません。仮引数は、サイズをゼロにできません。BIND属性を持つプロシージャーの仮引数には、相互使用可能型および型パラメーターを指定する必要があります。ALLOCATABLE、OPTIONAL、または POINTER 属性は指定できません。

関数サブプログラムでは、entry_name が、関数を識別し、呼び出しプロシージャーからの関数として参照されます。サブルーチン・サブプログラムでは、entry_name

が、サブルーチンを識別し、呼び出しプロシージャーからのサブルーチンとして参照されます。参照が行われると、ENTRY ステートメントに最初の続く実行可能ステートメントの実行が開始します。

関数がその ENTRY ステートメントを通して呼び出された場合、結果変数を、関数からの出口の前に定義する必要があります。

dummy_argument_list 内の名前が、以下の場所に現れないようにしてください。

398 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 425: IBM XL Fortran for Linux, V15.1

v ENTRY ステートメントの前に来る実行可能ステートメント内 (実行可能ステートメントの前に来る FUNCTION、SUBROUTINE、または ENTRY ステートメントに指定される場合を除いて)

v ステートメント関数ステートメントの式内 (名前がステートメント関数の仮引数で、FUNCTION または SUBROUTINE ステートメントに指定される場合、あるいは、ステートメント関数ステートメントの前に来る ENTRY ステートメントに指定される場合を除いて)

仮引数の順序パラメーター、数値パラメーター、型パラメーター、および kind 型パラメーターは、FUNCTION または SUBROUTINE ステートメント、またはその他の ENTRY ステートメントのそれらと異なるものにできます。

オブジェクトの配列境界または文字長を指定するために、宣言式で仮引数が使用されているとします。仮引数が存在し、参照されるプロシージャー名の仮引数リストの中にあれば、プロシージャー参照中に実行されるステートメント内のオブジェクトを指定できます。

F2008 注: Fortran 2008 以降の言語標準では、ENTRY ステートメントが古くなったステートメントとしてマークされています。-qlanglvl=2008pureの指定時にENTRY ステートメントを使用すると、警告メッセージが生成されます。代わりに、専用データ項目を含むモジュールを、各エントリー・ポイント用のモジュール・プロシージャー、および専用モジュール・プロシージャー内の共有コードと共に使用できます。 F2008

再帰

ENTRY ステートメントは、サブプログラム・ステートメントが RECURSIVE を指定して、ENTRY ステートメントが RESULT を指定する場合にのみ、そのステートメント自身を直接に参照できます。そして、入口プロシージャーは、サブプログラム内に明示的インターフェースを持ちます。RESULT 節は、それ自身を間接的に参照する入口に必要ありません。

エレメント型サブプログラムには ENTRY ステートメントを指定することができますが、ENTRY ステートメントに ELEMENTAL プレフィックスを指定することはできません。 ELEMENTAL プレフィックスを SUBROUTINE またはFUNCTION ステートメント中に指定すると、 ENTRY ステートメントで定義されるプロシージャーはエレメント型になります。

再帰的関数では、entry_name が文字型である場合、その長さをアスタリスク (*、別の場所で想定または指定されたものを意味します) で表すことはできません。

プロシージャーで、RECURSIVE または RESULT キーワードが指定される場合に、XL Fortran は、-qrecur コンパイラー・オプションを無視しますが、このオプションを指定すると、外部プロシージャーを再帰的に呼び出すこともできます。

例RECURSIVE FUNCTION FNC() RESULT (RES)

...ENTRY ENT () RESULT (RES) ! The result variable name can be

第 11 章 ステートメントおよび属性 399

Page 426: IBM XL Fortran for Linux, V15.1

! the same as for the function

...END FUNCTION

関連情報v 419ページの『FUNCTION』v 517ページの『SUBROUTINE』v 233ページの『再帰』v 218ページの『仮引数』v 「XL Fortran コンパイラー・リファレンス」の『-qrecur オプション』

ENUM/END ENUM (Fortran 2003)目的

ENUM ステートメントを指定して、一連の名前付き整数定数を定義し 1 つにまとめることができます。ENUM ステートメント内の名前付き整数定数を、列挙子と呼びます。

構文

列挙子を定義するには、列挙型構文を使用する必要があります。

scalar_int_exp を使用して列挙子を指定する場合、二重コロン区切り文字 (::) も指定する必要があります。

列挙型構文

�� ENUM, BIND(C) ��

�� enumeration_block ��

�� ENDENUM ��

enumeration_block

�� �

,

ENUMERATOR named_constant:: = scalar_int_exp

��

400 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 427: IBM XL Fortran for Linux, V15.1

規則

スカラー整数定数式を指定する場合、列挙子の値は、スカラー整数定数式の結果です。

スカラー論理定数式を使用できるのは、-qintlog を使用してコンパイルする場合のみです。

スカラー整数定数式が指定されず、列挙子が enumeration_block の最初にある場合、列挙子の値は 0 になります。

スカラー整数定数式が指定されず、列挙子が enumeration_block 内の他の列挙子の後にある場合、その値は、先行する列挙子の値より大きくなります。

-qenum オプションを使用して、列挙子の kind 型パラメーターを設定できます。-qenum を指定しない場合、列挙子のデフォルトの種類は 4 になります。

次の例では、ENUM ステートメントを使用して、異なる方法で列挙子を定義しています。

enum, bind(c)

enumerator :: red =1, blue, black =5enumerator yellowenumerator gold, silver, bronzeenumerator :: purpleenumerator :: pink, lavender

endenum

これらの列挙子の値は、red = 1、blue = 2、black = 5、yellow = 6、gold =

7、silver = 8、bronze = 9、purple = 10、pink = 11、lavender = 12 になります。

列挙子の初期値を指定する場合、:: を ENUMERATOR ステートメントに置く必要があります。リスト内の red と black の列挙子は、スカラー整数定数式を使用して初期化されます。

:: は、スカラー整数定数式で宣言されている列挙子のリスト内の列挙子を初期化するのに使用されていない場合、列挙子定義内でオプションになります。

v 2 番目および 3 番目の列挙子定義では、yellow、gold、silver、および bronze

は、スカラー整数定数式を使用して初期化されていないので、:: は必要ありません。

v 4 番目および 5 番目の列挙子定義では、purple が、スカラー整数定数式を使用して初期化されていませんが、:: を使用できます。

関連情報v 470ページの『PARAMETER』

第 11 章 ステートメントおよび属性 401

Page 428: IBM XL Fortran for Linux, V15.1

EQUIVALENCE目的

EQUIVALENCE ステートメントは、有効範囲単位内の 2 つ以上のオブジェクトが、同じストレージを共用するように指定します。

構文

equiv_object

変数名、配列エレメント、またはサブストリングです。添え字またはサブストリング式は整数の定数式にする必要があります。サブストリングの長さはゼロにできません。

規則

equiv_object を、ターゲット、ポインター、仮引数、機能名、ポインティング先、入口名、結果名、構造体コンポーネント、名前付き定数、自動データ・オブジェクト、割り振り可能オブジェクト、非連続派生型オブジェクト、ポインター、または割り振り可能コンポーネント、あるいはこれらのサブオブジェクトを含む連続した派生型のオブジェクトにしないでください。

BIND 属性を持つ変数、または、BIND 属性を持つ共通ブロックのメンバーである変数は、EQUIVALENCE ステートメント内のオブジェクトにしないでください。

一組の括弧内にある名前付き項目は、最初の記憶単位が同じため、関連付けされます。これを、等価関連付け と呼びます。これによって、同様に他の関連付けが起こる場合もあります。

デフォルトの初期化は、ストレージ関連の記憶単位に対して指定できます。ただし、デフォルトの初期化を指定したオブジェクトまたはサブオブジェクトは、同じ型にする必要があります。また、同じ型パラメーターにして、記憶単位に対しても同じ値を指定する必要があります。

EQUIVALENCE ステートメント内の配列エレメントを指定する場合、添え字要素数を、配列内の次元数より大きくすることはできません。単一添え字 n を指定して配列エレメントを使用して、多次元を指定する場合、配列のストレージ・シーケンス内の n エレメントが指定されます。その他すべての場合、XL Fortran は、足りない添え字を、配列の対応する次元の下限で置き換えます。添え字を持たない、サイズがゼロ以外の配列は、配列の最初のエレメントを参照します。

equiv_object が派生型から成っている場合、順序派生型にする必要があります。

�� �

,

EQUIVALENCE ( equiv_object , equiv_object_list ) ��

402 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 429: IBM XL Fortran for Linux, V15.1

IBM 拡張

オブジェクトが EQUIVALENCE ステートメントに使用できる場合、順序派生型のオブジェクトを、順序派生型または組み込みデータ型の他のオブジェクトと等価にできます。

XL Fortran では、関連項目は組み込み型または、順序派生型にできます。この場合、EQUIVALENCE ステートメントは型変換を起こしません。

IBM 拡張 の終り

関連項目の長さは、同じにしないでください。

サイズがゼロの項目は、他の項目およびサイズがゼロ以外のシーケンスの最初の記憶単位とストレージが関連付けられています。

EQUIVALENCE ステートメントは、2 つの異なる共通ブロックのストレージ・シーケンスを関連付けることはできません。同じ記憶単位が、ストレージ・シーケンスで 2 回以上現れるように指定しないでください。EQUIVALENCE ステートメントは、そのステートメント自体や EQUIVALENCE ステートメントによって前に設定された関連と矛盾しないようにする必要があります。

EQUIVALENCE ステートメントを使用して、共通ブロック内にない名前と、共通ブロック内の名前がストレージを共用するようにできます。

EQUIVALENCE グループによって宣言されたオブジェクトに、PROTECTED 属性を持たせるように指定した場合、EQUIVALENCE グループで指定されたすべてのオブジェクトが PROTECTED 属性を持つようにする必要があります。

最初の項目の前に追加するのではなく、最後の項目に追加することでのみ、EQUIVALENCE ステートメントを使用して共通ブロックを拡張できます。例えば、EQUIVALENCE ステートメントを使用して、共通ブロック内の変数に関連付ける変数が、配列のエレメントである場合、その配列のエレメントの残りの暗黙的な関連付けによって、共通ブロックのサイズを拡張できます。

例DOUBLE PRECISION A(3)REAL B(5)EQUIVALENCE (A,B(3))

記憶単位の関連付け:

| | | | | | | | |Array A: | A(1) | A(2) | A(3) |Array B: | B(1) | B(2) | B(3) | B(4) | B(5) |

この例では、2 つの項目の関連付けが、さらにどのような結果になるかを示しています。

AUTOMATIC ACHARACTER A*4,B*4,C(2)*3EQUIVALENCE (A,C(1)),(B,C(2))

記憶単位の関連付け:

第 11 章 ステートメントおよび属性 403

Page 430: IBM XL Fortran for Linux, V15.1

| | | | | | | |Variable A: | A |Variable B: | B |Array C: | C(1) | C(2) |

XL Fortran は、A および B の両方を C に関連付けるので、A および B は、互いに関連付けられて、それらすべてが、自動ストレージ・クラスを持つようになります。

INTEGER(4) G(2,-1:2,-3:2)REAL(4) H(3,1:3,2:3)EQUIVALENCE (G(2),H(1,1)) ! G(2) is G(2,-1,-3)

! H(1,1) is H(1,1,2)

関連情報v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 23ページの『変数の定義状況』

ERROR STOP (Fortran 2008)目的

ERROR STOP ステートメントは、プログラムのエラー終了を開始し、それによってプログラムの実行が強制終了されます。stop_code が指定された場合、キーワード「ERROR STOP」の後に stop_code が付いたものが ERROR_UNIT に出力されます。

構文

scalar_char_constant_expr

スカラー文字定数式です。

scalar_int_constant_expr

スカラー整数定数式です。

規則

ERROR STOP ステートメントが実行されると、システム戻りコードが返され、ERROR_UNIT にエラー・メッセージが出力されます。その内容は、stop_code が指定されているかどうかに応じて、以下のようになります。

v stop_code が scalar-char-constant-expr である場合、システム戻りコードは 1 です。キーワード「ERROR STOP」の後に stop_code が付いたものが出力されます。

�� ERROR STOPstop_code

��

ここで、stop_code は、次のようになります。

�� scalar_char_constant_exprscalar_int_constant_expr

��

404 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 431: IBM XL Fortran for Linux, V15.1

v stop_code が scalar-int-constant-expr である場合、XL Fortran によってシステム戻りコードが MOD (stop_code, 256) に設定されます。キーワード「ERROR

STOP」の後に stop_code が付いたものが出力されます。

v 何も指定されていない場合、システム戻りコードは 1 です。エラー・メッセージは出力されません。

DO 構文を終了させるラベル付きステートメントとして ERROR STOP ステートメントを使用することはできません。

以下の例では、ERROR STOP ステートメントの使用方法を示します。

PROGRAM pINTEGER, SAVE :: s = -1INTEGER, SAVE :: arr(3) = -1

! If the initialization for s is wrong, the error! message "ERROR STOP Initial value wrong!" is printed.! The system return code is 1.IF (s .NE. -1) ERROR STOP "Initial value wrong!"

! If the initialization for arr is wrong, no message is printed.! The system return code is 1.IF (ANY(arr .NE. -1)) ERROR STOP

s = 1arr = 1

! If the value for s is not 1, the error message "ERROR STOP 127" is printed.! The system return code is 127.IF (s .NE. 1) ERROR STOP 127

! If the value for arr is not 1, the error message "ERROR STOP 0" is printed.! The system return code is 0.IF (ANY(arr .NE. 1)) ERROR STOP 0

STOP "Good!"END PROGRAM p

関連情報v 513ページの『STOP』v 77ページの『最終化されないエンティティー』

EXIT目的

EXIT ステートメントは、DO、 F2008 DO CONCURRENT F2008 、または DOWHILE のいずれかの構文がその反復をすべて終了する前に、その実行を終了させます。さらに、このステートメントは、DO、 F2008 DO CONCURRENT

F2008 、または DO WHILE のいずれでもない、指定した構文の実行を終了させるために使用できます。

構文

第 11 章 ステートメントおよび属性 405

Page 432: IBM XL Fortran for Linux, V15.1

construct_name

構文の名前。

以下の構文のいずれかです。

v ASSOCIATE

v F2008 BLOCK F2008

v DO

v F2008 DO CONCURRENT F2008

v DO WHILE

v IF

v SELECT CASE

v SELECT TYPE

規則

construct_name を指定する場合、EXIT ステートメントは construct_name で指定された構文内に置く必要があります。construct_name を指定しない場合、EXIT ステートメントは、1 つ以上の DO 構文または DO WHILE 構文の範囲内に置く必要があります。

construct_name を指定した場合、EXIT ステートメントは construct_name で指定された構文に含まれます。construct_name が指定されていない場合、EXIT ステートメントは、そのすぐ外側の DO、 F2008 DO CONCURRENT F2008 、またはDO WHILE のいずれかの構文に属します。

F2008 EXIT ステートメントは、CRITICAL 構文または DO CONCURRENT 構文に属しているか、その外側の構文に属している場合、このいずれかの構文内に配置してはなりません。 F2008

EXIT が DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれかの構文に属している場合、EXIT ステートメントの実行により、構文は非アクティブになります。 EXIT ステートメントが他の DO、 F2008 DOCONCURRENT F2008 、または DO WHILE のいずれかの構文内でネストされている場合は、これらの構文も非アクティブになります。 DO 変数があると、最後に定義された値が保存されます。DO 構文に構文制御がない場合、非アクティブになるまで、無限に繰り返されます。 EXIT ステートメントを使用して構文を非アクティブにできます。

F2008 EXIT ステートメントが、DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれでもない構文に属している場合、EXIT ステートメントの実行により、構文の実行は終了します。構文内に含まれる任意の DO、 F2008

DO CONCURRENT F2008 、または DO WHILE の各ループは非アクティブになります。 F2008

�� EXITconstruct_name

��

406 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 433: IBM XL Fortran for Linux, V15.1

EXIT ステートメントにはラベルを付けることができますが、構文を強制終了させるラベル付きステートメントとして使用することはできません。

例 1: 以下の例では、EXIT ステートメントを DO ステートメントおよび DOWHILE ステートメント内で使用する場合を示します。

LOOP1: DO I = 1, 20N = N + 1

10 IF (N > NMAX) EXIT LOOP1 ! EXIT from LOOP1

LOOP2: DO WHILE (K==1)KMAX = KMAX - 1

20 IF (K > KMAX) EXIT ! EXIT from LOOP2END DO LOOP2

LOOP3: DO J = 1, 10N = N + 1

30 IF (N > NMAX) EXIT LOOP1 ! EXIT from LOOP1EXIT LOOP3 ! EXIT from LOOP3

END DO LOOP3

END DO LOOP1

F2008

例 2: 以下の例では、BLOCK 構文の実行を強制終了させる目的で EXIT ステートメントを使用する方法を示します。

a : BLOCKDO i = 1, num_in_set

IF (X == a(i)) EXIT a ! EXIT from the a BLOCK constructEND DOCALL r

END BLOCK a

F2008

関連情報v 324ページの『ASSOCIATE (Fortran 2003)』

v 332ページの『BLOCK (Fortran 2008)』

v 339ページの『CASE』

v 507ページの『SELECT CASE』

v 153ページの『DO 構文』

v 157ページの『DO WHILE 構文』

v 157ページの『DO CONCURRENT 構文 (Fortran 2008)』

v 158ページの『IF 構文』

v 163ページの『SELECT TYPE 構文 (Fortran 2003)』

EXTERNAL目的

EXTERNAL 属性によって、名前が、外部プロシージャー、ダミー・プロシージャー、またはブロック・データ・プログラム単位を表すことを指定します。

第 11 章 ステートメントおよび属性 407

Page 434: IBM XL Fortran for Linux, V15.1

EXTERNAL 属性を持つプロシージャー名は、実引数として使用できます。

構文

name 外部プロシージャー、ダミー・プロシージャー、または BLOCK DATA プログラム単位の名前です。

規則

外部プロシージャー名または仮引数名が、実引数として使用される場合、有効範囲単位内で EXTERNAL 属性またはインターフェース・ブロックによって宣言される必要があります。しかし、両方で指定することはできません。

組み込みプロシージャー名が、有効範囲単位内の EXTERNAL 属性で指定された場合、名前は、ユーザー定義の外部プロシージャーの名前になります。そのため、その有効範囲単位からその名前を使用して、その組み込みプロシージャーを呼び出せません。

有効範囲単位内で 1 つの名前に、EXTERNAL 属性を指定できるのは一回のみです。

EXTERNAL ステートメント内の名前は、プロシージャー宣言ステートメント内で指定したり、有効範囲単位内のインターフェース・ブロックにある特定のプロシージャー名として、指定しないでください。

表 42. EXTERNAL 属性と互換性のある属性

CONTIGUOUS �1� PRIVATE

OPTIONAL PUBLIC

注:�1� Fortran 2008

例PROGRAM MAIN

EXTERNAL AAACALL SUB(AAA) ! Procedure AAA is passed to SUB

END

SUBROUTINE SUB(ARG)CALL ARG() ! This results in a call to AAA

END SUBROUTINE

関連情報v 230ページの『仮引数がプロシージャーの場合』

v 1113ページの『標準間の互換性』 に記載される項目 4

�� EXTERNAL name_list::

��

408 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 435: IBM XL Fortran for Linux, V15.1

FLUSH (Fortran 2003)目的

FLUSH ステートメントは、他の処理に使用できるように外部ファイルにデータを書き込むか、Fortran 以外の方法で外部ファイル内に置かれたデータを READ ステートメントで使用できるようにします。

構文

u 以下のいずれかの値を持つ整数スカラー式です。

v 1 から 2147483647 の範囲内の値

v F2008 A NEWUNIT 値 F2008

この単位は、外部ファイルを参照します。整数スカラー式の値を、アスタリスクまたはホレリス定数にしないでください。

flush_listUNIT= を入れる必要がある指定子のリストです。これには、以下の指定子をそれぞれ 1 つ入れることができます。

v [UNIT=] は、以下のいずれかの値を持つ整数スカラー式として外部ファイルを指定します。

– 1 から 2147483647 の範囲内の値

– F2008 A NEWUNIT 値 F2008

整数スカラー式の値を、アスタリスクまたはホレリス定数にしないでください。

v ERR=stmt_label は、エラー指定子です。これは、エラーが発生した場合に、制御の転送先と同じ有効範囲単位内にある実行可能ステートメントのステートメント・ラベルを指定します。ERR= 指定子を組み込むことによって、エラー・メッセージを抑制します。stmt_label は、FLUSH ステートメントとして同じ有効範囲単位に現れる、分岐ターゲット・ステートメントのステートメント・ラベルにする必要があります。

v IOMSG=iomsg_variable は、入出力状況指定子です。これは、入出力操作によって戻されるメッセージを指定します。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

– エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

– このような条件が発生しない場合は、変数の値は変更されません。

�� FLUSH uflush_list

��

第 11 章 ステートメントおよび属性 409

Page 436: IBM XL Fortran for Linux, V15.1

v IOSTAT=ios は、INTEGER 型のスカラー変数として、フラッシュ処理の状況を指定します。フラッシュ・ステートメントの実行が完了すると、ios は次のようになります。

– エラー条件が発生しない場合はゼロ値

– エラーが発生した場合は正の値

– テープや TTY などのように、デバイスがシーク可能ではなく、最新のデータ転送操作が入力であった場合は負の値

IOSTAT 指定子を組み込むことによって、エラー・メッセージを抑制します。プログラムが重大エラーを検出した場合、ios の値は 200 になります。

ERR や IOSTAT を指定しない場合、重大エラーを検出すると、プログラムは終了します。

規則

FLUSH ステートメントが、純粋なサブプログラムに現れないようにしてください。

FLUSH ステートメントは、ファイル位置には影響しません。

バッファリング実行時オプションは、FLUSH ステートメントの実行に影響しません。

例 1:

次の例では、Fortran プログラムによって作成されたデータ・ファイルが、C ルーチンによって読み取られます。プログラムは、バッファーに入った入出力に、FLUSHステートメントを指定します。

! The following Fortran program writes data to an external file.subroutine process_data()

integer data(10)external read_data

data = (/(i,i=1,10)/)open(50, file="data_file")write(50, *) data ! write data to an external fileflush(50) ! since Fortran I/O is buffered, a FLUSH

! statement is needed for the C routine to! to read the data

call read_data(10) ! call C routine to read the fileend subroutine

/* The following C routine reads data from the external file. */void read_data(int *sz) {

#include < stdio.h>#include < stdlib.h>int *data, i;

FILE *fp;

data = (int *) malloc((*sz)*sizeof(int));fp = fopen("data_file", "r");

410 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 437: IBM XL Fortran for Linux, V15.1

for (i=0; i<*sz-1; i++) {fscanf(fp, "%d", &dat5[i]);

}}

関連情報v 241ページの『第 9 章 XL Fortran の入出力』

v 1030ページの『flush_(lunit)』

v 「XL Fortran 最適化およびプログラミング・ガイド」の『入出力バッファーのフラッシュ』を参照してください。

FORALL目的

FORALL ステートメントによって、サブオブジェクトのグループ (特に配列エレメント) への代入を実行します。WHERE ステートメントと違って、代入は、配列レベル以外のエレメント型レベルで実行できます。FORALL ステートメントは、ポインター代入も使用できます。

構文

forall_header

forall_triplet_spec

forall_assignment

assignment_statement か pointer_assignment_statement のいずれかです。

F2008 type_spec

整数型を指定します。 F2008

�� FORALL forall_header forall_assignment ��

�� ( forall_triplet_spec_list )(1) , scalar_mask_expr

type_spec ::

��

注:

1 Fortran 2008

�� index_name = subscript : subscript: stride

��

第 11 章 ステートメントおよび属性 411

Page 438: IBM XL Fortran for Linux, V15.1

scalar_mask_expr

スカラー論理式です。

subscript, stride

それぞれのスカラー整数式です。

規則

forall_header のマスク式および forall_assignment では、純粋なプロシージャーのみを参照できます。(定義済み操作、定義済み代入、定義済み終結 (finalization) によって参照されるものを含む)。

index_name は、スカラー整変数にする必要があります。これは、ステートメント・エンティティーでもあります。すなわち、有効範囲単位内の他のエンティティーに影響を与えることはないし、影響を受けるということもありません。

F2008

以下の場合には、FORALL インデックス変数を明示的に宣言する必要があります。

v index_name の値の範囲が、デフォルトの整数型の範囲を超えています。

v IMPLICIT NONE ステートメントは有効です。 例 2 を参照してください。

type_spec を指定して、FORALL ステートメントの有効範囲内で index_name を宣言できます。 type_spec を forall_header に指定した場合、index_name には任意のアクセス可能 ID を再使用できます。

F2008

forall_triplet_spec_list で、subscript または stride には、 forall_triplet_spec_list 内のindex_name への参照を入れることができません。forall_header 内の式の評価が、forall_header 内の他の式の評価に影響しないようにしてください。

forall_triplet_spec が以下のように指定された場合

index1 = s1:s2:s3

インデックス値の最大数は、以下によって決定されます。

max = INT((s2-s1+s3)/s3)

ストライド (上記の s3) が指定されない場合、値は 1 とみなされます。インデックスに対して、max ≤ 0 の場合、forall_assignment は実行されません。例を以下に示します。

index1 = 2:10:3 ! The index values are 2,5,8.max = INT((10-2+3)/3) = 3.

index2 = 6:2:-1 ! The index values are 6,5,4,3,2.index2 = 6:2 ! No index values.

マスク式が省略される場合、値は .TRUE. とみなされます。

アトミック・オブジェクトは、一度しか割り当てができません。非アトミック・オブジェクトへの割り当てによって、すべてのサブオブジェクトに割り当てられる

412 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 439: IBM XL Fortran for Linux, V15.1

か、ターゲットを、すべてのサブオブジェクトと関連付けます。

例 1

INTEGER A(1000,1000), B(200)I=17FORALL (I=1:1000,J=1:1000,I.NE.J) A(I,J)=A(J,I)PRINT *, I ! The value 17 is printed because the I

! in the FORALL has statement scope.FORALL (N=1:200:2) B(N)=B(N+1)END

F2008

例 2

IMPLICIT NONEINTEGER, PARAMETER :: limit=60000INTEGER(1) :: flag(limit)flag=0FORALL (INTEGER(4) :: i=2:limit:2) flag(i)=1PRINT *, flag(limit)END

F2008

関連情報v 130ページの『組み込み代入』

v 144ページの『データ・ポインターの代入』

v 141ページの『FORALL 構文』

v 574ページの『INDEPENDENT』

v 174ページの『ステートメント・エンティティーおよび構文エンティティー』

FORALL ステートメントの解釈1. それぞれの forall_triplet_spec の subscript および stride 式を、いずれかの順序で評価します。index_name 値の可能性のあるペアすべてが、組み合わせのセットを形成します。例えば、次のステートメントを指定した場合、

FORALL (I=1:3,J=4:5) A(I,J) = A(J,I)

I および J の組み合わせのセットは、以下のようになります。

{(1,4),(1,5),(2,4),(2,5),(3,4),(3,5)}

-1 および -qnozerosize コンパイラー・オプションは、このステップに影響を与えません。

2. アクティブな組み合わせ (scalar_mask_expr が .TRUE. と評価される組み合わせ)

のセットを作成しながら、いずれかの順序で組み合わせのセットのscalar_mask_expr を評価します。例えば、マスク (I+J.NE.6) が上記のセットに適用された場合、アクティブな組み合わせのセットは、以下のようになります。

{(1,4),(2,5),(3,4),(3,5)}

第 11 章 ステートメントおよび属性 413

Page 440: IBM XL Fortran for Linux, V15.1

3. assignment_statement の場合、index_name 値のすべてのアクティブな組み合わせに対して、右側の expression にあるすべての値および左側の variable にあるすべての添え字、ストライド、サブストリング範囲をいずれかの順序で評価します。

pointer_assignment の場合、いずれかの順序で、ポインター代入のターゲットになるものを判別して、index_name 値のすべてのアクティブな組み合わせの、ポインター内のすべての添え字、ストライド、およびサブストリング範囲を評価します。ターゲットがポインターであろうとなかろうと、ターゲットの判別に、その値の評価は含まれません。

4. assignment_statement の場合、index_name 値のすべてのアクティブな組み合わせに対して、計算された expression 値を、対応する variable エンティティーにいずれかの順序で割り当てます。

pointer_assignment の場合、index_name 値のすべてのアクティブな組み合わせに対して、すべてのターゲットを、対応するポインター・エンティティーに、いずれかの順序で関連付けます。

ループ並列化FORALL ステートメントと FORALL 構文は、代入ステートメントの並列化ができるように設計されています。FORALL 内の代入ステートメントを実行する場合、オブジェクトの代入は、他のオブジェクトの代入を妨げません。次の例では、結果を変更せずにいずれかの順序で、エレメント A への代入を実行できます。

FORALL (I=1:3,J=1:3) A(I,J)=A(J,I)

IBM 拡張

INDEPENDENT ディレクティブは、プログラムの意味に影響を与えずに、DO ループの各反復、または FORALL ステートメントか FORALL 構文の各処理が、いずれかの順序で実行できることを表明します。FORALL ステートメントか FORALL構文の操作は、以下のように定義されます。

v mask の評価

v 右側と左側のインデックスの評価

v 代入の評価

したがって、次のループは、

INTEGER, DIMENSION(2000) :: a!IBM* INDEPENDENT

FORALL (i=1:1999:2) a(i) = a(i+1)

次の配列代入と意味的に同じです。

INTEGER, DIMENSION(2000) :: AA(1:1999:2) = A(2:2000:2)

414 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 441: IBM XL Fortran for Linux, V15.1

IBM 拡張 の終り

FORALL (構文)目的

FORALL (構文) ステートメントは、FORALL 構文の最初のステートメントです。

構文

forall_header

forall_triplet_spec

F2008 type_spec

整数型を指定します。 F2008

scalar_mask_expr

スカラー論理式です。

subscript, stride

両方ともスカラー整数式です

ヒント:

特定の FORALL 並列を作成するのが可能で、有益な場合、FORALL ステートメントの前に、INDEPENDENT ディレクティブを指定します。XL Fortran は、FORALL を並列化することが正当であるかどうかを常に判別できるわけではないので、INDEPENDENT

ディレクティブは、それが正当だと表明します。

�� FORALLFORALL_construct_name : forall_header

��

�� ( forall_triplet_spec_list )(1) , scalar_mask_expr

type_spec ::

��

注:

1 Fortran 2008

�� index_name = subscript : subscript: stride

��

第 11 章 ステートメントおよび属性 415

Page 442: IBM XL Fortran for Linux, V15.1

規則

forall_header のマスク式で参照されるプロシージャー (定義済み操作または定義済み代入によって参照されるプロシージャーを含む) は、純粋にする必要があります。

index_name は、スカラー整変数にする必要があります。index_name の有効範囲は、FORALL 構文全体です。

F2008

以下の場合には、FORALL インデックス変数を明示的に宣言する必要があります。

v index_name の値の範囲が、デフォルトの整数型の範囲を超えています。

v IMPLICIT NONE ステートメントは有効です。

type_spec を指定して、FORALL 構文の有効範囲内で index_name を宣言できます。 type_spec を forall_header に指定した場合、index_name には任意のアクセス可能 ID を再使用できます。

F2008

forall_triplet_spec_list で、subscript または stride には、 forall_triplet_spec_list 内のindex_name への参照を入れることができません。forall_header 内の式の評価が、forall_header 内の他の式の評価に影響しないようにしてください。

次の forall_triplet_spec が指定された場合:

index1 = s1:s2:s3

インデックス値の最大数は、以下によって決定されます。

max = INT((s2-s1+s3)/s3)

ストライド (上記の s3) が指定されない場合、値は 1 とみなされます。インデックスに対して、max ≤ 0 の場合、forall_assignment は実行されません。以下に例を示します。

index1 = 2:10:3 ! The index values are 2,5,8.! max = floor(((10-2)/3)+1) = 3.

index2 = 6:2:-1 ! The index values are 6,5,4,3,2.index2 = 6:2 ! No index values.

マスク式が省略される場合、値は .TRUE. とみなされます。

例POSITIVE: FORALL (X=1:100,A(X)>0)

I(X)=I(X)+J(X)J(X)=J(X)-I(X+1)

END FORALL POSITIVE

関連情報v 389ページの『END (構文)』

v 141ページの『FORALL 構文』

416 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 443: IBM XL Fortran for Linux, V15.1

v 174ページの『ステートメント・エンティティーおよび構文エンティティー』

FORMAT目的

FORMAT ステートメントによって入出力ステートメントの形式仕様を指定します。

構文

format_item

r kind 型パラメーターを指定できない、符号なしの、正の整数リテラル定数か、不等号括弧 (< および >) で囲まれているスカラー整数式です。これを、繰り返し仕様と呼びます。これにより、format_item_list または data_edit_desc を繰り返す回数を指定します。デフォルトは、1 です。

data_edit_desc

データ編集記述子です。

control_edit_desc

制御編集記述子です。

char_string_edit_desc

文字ストリング編集記述子です。

規則

定様式の READ、WRITE、または PRINT ステートメントの形式識別子が、ステートメント・ラベルまたはステートメント・ラベルを割り当てられた変数の場合、ステートメント・ラベルは、FORMAT ステートメントを識別します。

FORMAT ステートメントには、ステートメント・ラベルを指定する必要があります。FORMAT 文を、ブロック・データ・プログラム単位、インターフェース・ブロック、モジュール F2008 あるいはサブモジュール F2008 の有効範囲、または派生型定義に指定することはできません。

�� FORMAT ( )format_item_list

��

�� data_edit_descr

control_edit_desc( format_item_list )

rchar_string_edit_desc

��

第 11 章 ステートメントおよび属性 417

Page 444: IBM XL Fortran for Linux, V15.1

コンマは編集記述子を区切ります。P 編集記述子および、その後にすぐ続く F、E、EN、ES、D、G、または Q (拡張精度と文字カウントの両方) 編集記述子の間のコンマは、オプションの繰り返し仕様が現れない場合はスラッシュ編集記述子の前、スラッシュ編集記述子の後、コロン編集記述子の前と後で省略できます。

FORMAT 仕様は、入出力ステートメント内の文字式として指定することもできます。

XL Fortran は、文字ストリング編集記述子の場合を除いて、大文字と小文字を形式仕様で同じものとして処理します。

例CHARACTER*32 CHARVARCHARVAR="('integer: ',I2,' binary: ',B8)" ! Character formatM = 56 ! specificationJ = 1 ! OUTPUT:X = 2355.95843 !WRITE (6,770) M,X ! 56 2355.96WRITE (6,CHARVAR) M,M ! integer: 56

! binary: 00111000WRITE (6,880) J,M ! 1

! 56770 FORMAT(I3, 2F10.2)880 FORMAT(I<J+1>)

END

関連情報v 267ページの『第 10 章 入出力の形式設定』

v 476ページの『PRINT』

v 488ページの『READ』

v 547ページの『WRITE』

文字形式仕様定様式の READ、WRITE、または PRINT ステートメントの形式識別子が、文字配列名または文字式の場合、配列や式の値は、文字形式仕様になります。

形式識別子が文字配列のエレメント名である場合、形式仕様は、配列エレメント内に完全に含まれている必要があります。形式識別子が文字配列名の場合は、形式仕様は、最初のエレメントを超えて、続く連続エレメントに継続できます。

ブランクを、形式仕様の前に置けます。文字データは、形式仕様に影響を与えることなく、形式仕様を終了する右括弧に続けられます。

変数形式設定式 (IBM 拡張)編集記述子が、整数定数を必要とする時にはいつでも、整数定数を FORMAT ステートメントに指定できます。整数式は、不等号括弧 (< および >) で囲む必要があります。変数形式設定式の外側では符号を使用できません。以下は、有効な形式仕様です。

WRITE(6,20) INT120 FORMAT(I<MAX(20,5)>)

WRITE(6,FMT=30) INT2, INT330 FORMAT(I<J+K>,I<2*M>)

418 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 445: IBM XL Fortran for Linux, V15.1

整数式は、関数呼び出しや仮引数への参照を含む、以下の制限がある有効な Fortran

式にできます。

v 式は、H 編集記述子と一緒に使用できません。

v 式には、グラフィック関係演算子を入れることはできません。

式の値は、READ、WRITE、または PRINT ステートメントの実行中に、入出力項目が処理されるたびに再評価されます。

例CHARACTER*32 CHARVARCHARVAR="('integer: ',I2,' binary: ',B8)" ! Character formatM = 56 ! specificationJ = 1 ! OUTPUT:X = 2355.95843 !WRITE (6,770) M,X ! 56 2355.96WRITE (6,CHARVAR) M,M ! integer: 56

! binary: 00111000WRITE (6,880) J,M ! 1

! 56770 FORMAT(I3, 2F10.2)880 FORMAT(I<J+1>)

END

関連情報v 267ページの『第 10 章 入出力の形式設定』

v 476ページの『PRINT』

v 488ページの『READ』

v 547ページの『WRITE』

FUNCTION目的

FUNCTION ステートメントは、関数サブプログラムの最初のステートメントです。

構文

第 11 章 ステートメントおよび属性 419

Page 446: IBM XL Fortran for Linux, V15.1

prefix 次のいずれかになります。declaration_type_spec

ELEMENTALF2008 IMPURE F2008

F2008 MODULE F2008

PURERECURSIVE

declaration_type_spec

関数結果の型および型パラメーターを指定します。declaration_type_spec については、 526ページの『型宣言』を参照してください。

name 関数サブプログラムの名前です。

len

符号なし整数リテラル、または括弧に入れられたスカラー整数の定数式です。len の値は、関数の結果変数の長さを指定します。FUNCTION ステートメント内で型を指定する場合にのみ含めることができます。型は、DOUBLE PRECISION、DOUBLE COMPLEX、BYTE、または派生型にはできません。

binding_label

スカラー文字定数式です。

規則

指定できるのは、多くても、それぞれの種類の prefix を 1 つです。RECURSIVEおよび ELEMENTAL の両方のプレフィックス指定子を指定することはできません。 F2008 PURE および IMPURE の両方のプレフィックス指定子を指定することはできません。 F2008

多くて 1 つの RESULT 節と 1 つの BIND 節を指定できます。いずれの順序でも指定できます。

関数結果の型と型パラメーターは、関数サブプログラムの宣言部分にあるdeclaration_type_spec または結果変数の宣言の両方によってではなく、いずれかによ

�� �

prefixFUNCTION name

(1)* len

� �( )dummy_argument_list RESULT ( result_name )

(2)BIND ( C )

, NAME = binding_label

��

注:

1 IBM 拡張.

2 Fortran 2003

420 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 447: IBM XL Fortran for Linux, V15.1

って指定できます。これが全然指定されない場合、暗黙的な型の決定の規則が効力を持ちます。長さ指定子は、declaration_type_spec および len の両方を使用して指定できません。

RESULT が指定された場合、result_name は関数結果変数になります。name は、参照できても、サブプログラム内のいずれかの仕様ステートメントにおいて宣言しないでください。result_name は、name と同じにしないでください。RESULT が指定されない場合、name は関数結果変数になります。

BIND キーワードは、C プログラミング言語からプロシージャーにアクセスするのに使用される結合ラベルを暗黙的または明示的に定義します。結果変数は相互使用可能なスカラーにする必要があります。仮引数は、サイズをゼロにできません。BIND 属性を持つプロシージャーの仮引数には、相互使用可能型および型パラメーターを指定する必要があります。ALLOCATABLE または POINTER 属性を指定することはできません。

FUNCTION ステートメントが、ダミー・プロシージャーを記述するインターフェース本体の一部である場合、NAME= 指定子があってはなりません。エレメント型プロシージャーには、BIND 属性を指定できません。

の終り

結果変数が配列かポインターの場合、DIMENSION または POINTER 属性は、それぞれ、関数本体内に指定する必要があります。

関数結果がポインターの場合、結果変数の形状が、関数から戻される値の形状を決定します。結果変数がポインターの場合、関数によって、ターゲットをポインターに関連付けるか、ポインターの関連付け状況を関連付け解除として定義する必要があります。

結果変数がポインターでない場合、関数によってその値を定義する必要があります。

外部関数の名前が派生型から成っている場合、型が使用で関連付けられているかホストで関連付けられていなければ、派生型を、順序派生型にする必要があります。

関数結果変数を、変数形式設定式、COMMON、DATA、整数 POINTER、またはEQUIVALENCE ステートメントに現れないようにしてください。また、この変数は、PARAMETER、INTENT、OPTIONAL、SAVE 属性を持つことができません。STATIC および AUTOMATIC 属性は、結果変数が割り振り可能オブジェクト、配列、またはポインターでなく、文字型や派生型でない場合にのみ指定できます。

関数結果変数は、入口プロシージャーの結果変数と関連付けられています。これを、入口関連付けと呼びます。これらの結果変数のどの定義も、同じ型および型パラメーターを持つすべての関連付けられた変数の定義になり、入口点に関係ない関数の値になります。

関数サブプログラムに、入口プロシージャーが含まれている場合、結果変数は、型が文字か派生型から成っているのではないかぎり、あるいは、変数に、

第 11 章 ステートメントおよび属性 421

Page 448: IBM XL Fortran for Linux, V15.1

ALLOCATABLE または POINTER 属性があるか、結果変数がスカラーでなければ、同じ型にする必要はありません。名前が関数を参照するのに使用されている変数は、RETURN または END ステートメントが、サブプログラム内で実行される場合、定義済み状態に置く必要があります。異なる型の関連変数は、同じ型および型パラメーターの関連変数が、サブプログラムの実行中に後で、それを再定義する場合を除いて、関数参照の実行中に定義されないようにする必要があります。

F2008

モジュールまたはサブモジュールの有効範囲単位内で宣言された、モジュール・サブプログラムまたは非抽象インターフェース本体の FUNCTION ステートメントに対して、MODULE プレフィックス指定子を指定できます。 例 2 を参照してください。

v モジュール・サブプログラムの FUNCTION ステートメントに対して MODULEプレフィックス指定子を指定した場合、モジュール・サブプログラムは分離モジュール・プロシージャーです。

v 非抽象インターフェース本体の FUNCTION ステートメントに対して MODULEプレフィックス指定子を指定した場合、インターフェース本体はモジュール・プロシージャー・インターフェース本体です。

NAME= 指定子を持つ BIND 属性は、内部プロシージャーでは許可されません。

F2008

例 1RECURSIVE FUNCTION FACTORIAL (N) RESULT (RES)

INTEGER RESIF (N.EQ.0) THEN

RES=1ELSE

RES=N*FACTORIAL(N-1)END IF

END FUNCTION FACTORIAL

PROGRAM PINTERFACE OPERATOR (.PERMUTATION.)

ELEMENTAL FUNCTION MYPERMUTATION(ARR1,ARR2)INTEGER :: MYPERMUTATIONINTEGER, INTENT(IN) :: ARR1,ARR2

END FUNCTION MYPERMUTATIONEND INTERFACE

INTEGER PERMVEC(100,150),N(100,150),K(100,150)...PERMVEC = N .PERMUTATION. K...

END

例 2 (Fortran 2008)MODULE m

! The MODULE prefix specifier is specified for the FUNCTION! statement of a module procedure interface body.INTERFACE

INTEGER MODULE FUNCTION func(a, b)INTEGER :: a, b

422 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 449: IBM XL Fortran for Linux, V15.1

END FUNCTIONEND INTERFACE

END MODULE

SUBMODULE (m) n

CONTAINS! The MODULE prefix specifier is specified for the FUNCTION! statement of a separate module procedure.INTEGER MODULE FUNCTION func(a, b) RESULT (res)

INTEGER :: a, bres = a + b

END FUNCTIONEND SUBMODULE

関連情報v 206ページの『関数サブプログラムとサブルーチン・サブプログラム』

v 397ページの『ENTRY』

v 331ページの『BIND (Fortran 2003)』

v 209ページの『関数参照』

v 218ページの『仮引数』

v 510ページの『ステートメント関数』

v 233ページの『再帰』

v 「XL Fortran コンパイラー・リファレンス」の『-qrecur オプション』

v 234ページの『純粋プロシージャー』

v 237ページの『エレメント型プロシージャー』

v 940ページの『プロシージャーの相互運用性』

v 199ページの『モジュール』

v 203ページの『サブモジュール (Fortran 2008)』

v 211ページの『分離モジュール・プロシージャー (Fortran 2008)』

再帰RECURSIVE キーワードは、以下の場合、直接に、または間接的に指定する必要があります。

v 関数がそれ自身を呼び出す

v 関数が、同じサブプログラム内の ENTRY ステートメントによって定義された関数を呼び出す

v 同じサブプログラム内の入口プロシージャーが、それ自身を呼び出す

v 同じサブプログラム内の入口プロシージャーが、同じサブプログラム内の他の入口プロシージャーを呼び出す

v 同じサブプログラム内の入口プロシージャーが、FUNCTION ステートメントによって定義されたサブプログラムを呼び出す

それ自身を直接に呼び出す関数は、RECURSIVE および RESULT キーワードが指定されていることが必要です。両方のキーワードがあることによって、サブプログラム内のプロシージャー・インターフェースを明示的にします。

第 11 章 ステートメントおよび属性 423

Page 450: IBM XL Fortran for Linux, V15.1

name が、文字型から成っている場合、その長さは、関数が再帰的であるならば、アスタリスクにはできません。

RECURSIVE が指定される場合、結果変数は、デフォルトの自動ストレージ・クラスを持ちます。

FUNCTION ステートメントで、RECURSIVE または RESULT が指定される場合に、XL Fortran は、-qrecur コンパイラー・オプションを無視しますが、このオプションを指定すると、外部プロシージャーを再帰的に呼び出すこともできます。

エレメント型プロシージャーエレメント型プロシージャーの場合、キーワード ELEMENTAL を指定する必要があります。ELEMENTAL キーワードを指定した場合、RECURSIVE キーワードは指定できません。

GO TO (代入)目的

代入型 GO TO ステートメントは、プログラム制御を実行可能ステートメントに転送します。このステートメント・ラベルは、ASSIGN ステートメントで指定されます。

構文

variable_name

ステートメント・ラベルを ASSIGN ステートメントで代入した、INTEGER(4) または INTEGER(8) 型のスカラー変数です。

stmt_label

代入型 GO TO と同じ有効範囲単位内の実行可能ステートメントのステートメント・ラベルです。同じステートメント・ラベルを、複数回stmt_label_list に指定できます。

規則

代入型 GO TO ステートメントを実行する場合、ステートメント・ラベルの値を持つ variable_name を使用して、指定する変数を定義する必要があります。代入型GO TO ステートメントと同じ有効範囲単位内に、ASSIGN ステートメントを使用して、この定義を設定する必要があります。整変数がサブプログラム内の仮引数である場合、そのサブプログラム内の代入型 GO TO で使用するために、整変数をサ

�� GO TO variable_name( stmt_label_list )

,

��

424 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 451: IBM XL Fortran for Linux, V15.1

ブプログラム内のステートメント・ラベルに代入する必要があります。代入型 GOTO ステートメントの実行によって、制御は、そのステートメント・ラベルで識別されるステートメントに転送されます。

stmt_label_list がある場合、variable_name によって指定された変数に代入されたステートメント・ラベルを、リスト内のステートメント・ラベルのいずれかにする必要があります。

代入型 GO TO は、DO、 F2008 DO CONCURRENT F2008 、または DOWHILE のいずれかの構文の終端ステートメントにはできません。

代入型 GO TO ステートメントは、Fortran 95 で削除されました。

例INTEGER RETURN_LABEL

.

.

.! Simulate a call to a local procedure

ASSIGN 100 TO RETURN_LABELGOTO 9000

100 CONTINUE...

9000 CONTINUE! A "local" procedure

.

.

.GOTO RETURN_LABEL

関連情報v 9ページの『ステートメント・ラベル』

v 166ページの『分岐』

v 1117ページの『削除されたフィーチャー』

GO TO (計算)目的

計算型 GO TO ステートメントは、プログラム制御を可能ないくつかの実行可能ステートメントの 1 つに転送します。

構文

�� GO TO ( stmt_label_list ) arith_expr,

��

第 11 章 ステートメントおよび属性 425

Page 452: IBM XL Fortran for Linux, V15.1

stmt_label

計算型 GO TO と同じ有効範囲単位内の実行可能ステートメントのステートメント・ラベルです。同じステートメント・ラベルを、複数回stmt_label_list に指定できます。

arith_expr

スカラー整数式です。

これは、実数または複素数にすることもできます。式の値が非整数の場合、XL Fortran は、その値を使用する前に INTEGER(4) に変換します。

規則

計算型 GO TO ステートメントが実行される場合、arith_expr が評価されます。結果値は、stmt_label_list へのインデックスとして使用されます。インデックスによって識別されるステートメント・ラベルを持つステートメントに制御が転送されます。例えば、arith_expr の値が 4 の場合、リスト内に、少なくとも 4 つのラベルがあれば、ステートメント・ラベルが stmt_label_list の 4 番目にくるステートメントに制御が転送されます。

arith_expr の値が 1 より小さいか、リスト内のステートメント・ラベルの数より大きい場合、GO TO ステートメントは、何の影響も与えず (CONTINUE ステートメントのように)、次のステートメントが実行されます。

例INTEGER NEXT

...GO TO (100,200) NEXT

10 PRINT *,'Control transfers here if NEXT does not equal 1 or 2'...

100 PRINT *,'Control transfers here if NEXT = 1'...

200 PRINT *,'Control transfers here if NEXT = 2'

関連情報v 9ページの『ステートメント・ラベル』v 166ページの『分岐』

GO TO (無条件)目的

無条件 GO TO ステートメントは、プログラム制御を指定した実行可能ステートメントに転送します。

構文

�� GO TO stmt_label ��

426 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 453: IBM XL Fortran for Linux, V15.1

stmt_label

無条件 GO TO と同じ有効範囲単位内の実行可能ステートメントのステートメント・ラベルです。

規則

無条件 GO TO ステートメントは、stmt_label で識別されるステートメントに制御を転送します。

無条件 GO TO ステートメントは、DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれかの構文の終端ステートメントにはできません。

例REAL(8) :: X,YGO TO 10

...10 PRINT *, X,Y

END

関連情報v 9ページの『ステートメント・ラベル』v 166ページの『分岐』

IF (算術)目的

算術 IF ステートメントは、算術式の評価に応じて、実行可能ステートメントの 1

つにプログラム制御を転送します。

構文

arith_expr

整数型または実数のスカラー算術式です。

stmt_label1、stmt_label2、および stmt_label3

IF ステートメントと同じ有効範囲単位内の実行可能ステートメントのステートメント・ラベルです。同じステートメント・ラベルを、複数回、3 つのステートメント・ラベルに指定できます。

規則

算術 IF ステートメントは、arith_expr を評価して、arith_expr の値が、ゼロより小さいか、ゼロであるか、ゼロより大きいか、それぞれに応じて、stmt_label1、stmt_label2、または stmt_label3 で識別されるステートメントに制御を転送します。

�� IF ( arith_expr ) stmt_label1 , stmt_label2 , stmt_label3 ��

第 11 章 ステートメントおよび属性 427

Page 454: IBM XL Fortran for Linux, V15.1

例IF (K-100) 10,20,30

10 PRINT *,'K is less than 100.'GO TO 40

20 PRINT *,'K equals 100.'GO TO 40

30 PRINT *,'K is greater than 100.'40 CONTINUE

関連情報v 166ページの『分岐』

v 9ページの『ステートメント・ラベル』

IF (ブロック)目的

ブロック IF ステートメントは、IF 構文内の最初のステートメントです。

構文

IF_construct_name

IF 構文を識別する名前です。

規則

ブロック IF ステートメントは、論理式を評価して、IF 構文内に含まれるブロックの 1 つを (多くても) 実行します。

IF_construct_name を指定する場合、END IF ステートメントに指定する必要があります。また、オプションで、IF 構文内の ELSE IF または ELSE ステートメントに指定する必要があります。

例WHICHC: IF (CMD .EQ. 'RETRY') THEN

IF (LIMIT .GT. FIVE) THEN ! Nested IF constructs...CALL STOP

ELSECALL RETRY

END IFELSE IF (CMD .EQ. 'STOP') THEN WHICHC

CALL STOPELSE IF (CMD .EQ. 'ABORT') THEN

CALL ABORTELSE WHICHC

GO TO 100END IF WHICHC

��IF_construct_name :

IF ( scalar_logical_expr ) THEN ��

428 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 455: IBM XL Fortran for Linux, V15.1

関連情報v 158ページの『IF 構文』

v 385ページの『ELSE IF』

v 384ページの『ELSE』

v END IF ステートメントに関しての詳細は、 389ページの『END (構文)』

IF (論理)目的

論理 IF ステートメントは、論理式を評価して、真であれば、指定したステートメントを実行します。

構文

logical_expr

スカラー論理式です。

stmt ラベルが付いていない実行可能ステートメントです。

規則

論理 IF ステートメントが実行される場合、logical_expr が評価されます。logical_expr の値が真の場合、stmt が実行されます。logical_expr の値が偽の場合は、stmt は実行せず、IF ステートメントは何の影響も与えません (CONTINUE ステートメントのように)。

logical_expr 内の関数参照の実行によって、stmt に現れる変数の値を変更できます。

stmt は、SELECT CASE、CASE、END SELECT、DO、 F2008 DOCONCURRENT F2008 、DO WHILE、END DO、ブロック IF、ELSE IF、ELSE、END IF、END FORALL、その他の論理 IF、ELSEWHERE、ENDWHERE、END、END FUNCTION、END SUBROUTINE の各ステートメント、ASSOCIATE 構文ステートメント、FORALL 構文ステートメント、またはWHERE 構文ステートメントにすることはできません。

例IF (ERR.NE.0) CALL ERROR(ERR)

関連情報v 149ページの『第 7 章 実行制御』

�� IF ( logical_expr ) stmt ��

第 11 章 ステートメントおよび属性 429

Page 456: IBM XL Fortran for Linux, V15.1

IMPLICIT目的

IMPLICIT ステートメントによって、デフォルトの暗黙的な型の決定やローカル・エンティティーのデフォルト・ストレージ・クラスを、変更したり確認したり、IMPLICIT NONE 形式を指定して、暗黙の型の規則を完全に無効にすることができます。

構文

declaration_type_spec

データ型を指定します。 526ページの『型宣言』を参照してください。

range 1 つの文字か文字の範囲になります。文字の範囲には、letter1-letter2 という形式があります。ここで、letter1 は、範囲内の最初の文字で、アルファベット順に letter1 に続く letter2 が、範囲内の最後の文字になります。ドル記号($) および下線 (_) も範囲内に使用できます。下線 (_) は、ドル記号 ($) に続きます。そしてこれは、Z に続きます。したがって Y - _ は、Y、Z、$、_ に相当します。

規則

文字範囲はオーバーラップできません。すなわち、任意の文字に複数の型は指定できません。

任意の有効範囲単位で、IMPLICIT ステートメントに文字が指定されない場合、プログラム単位またはインターフェース本体内のエンティティーの暗黙の型は、文字I-N で始まるエンティティーのデフォルトの整数です。それ以外の場合はデフォルトの実数になります。内部プロシージャーまたはモジュール・プロシージャーのデフォルトは、ホストの有効範囲単位で使用される暗黙の型と同じです。

range_list によって指定された文字で始まり、型を明示的に指定していないデータ・エンティティー名の場合、すぐ前に来る declaration_type_spec によって指定された

��

IMPLICIT NONE,

declaration_type_spec ( range_list )(1)

STATIC(2)

AUTOMATIC(3)

UNDEFINED

��

注:

1 IBM 拡張.

2 IBM 拡張.

3 IBM 拡張.

430 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 457: IBM XL Fortran for Linux, V15.1

型が指定されます。暗黙的な型の決定は、派生型がホストの有効範囲にアクセス可能な場合、ローカルの有効範囲内でアクセス不能な派生型にすることができます。

F2008 ホスト有効範囲単位の暗黙的な型決定の規則は、BLOCK 構文内でも適用されます。 F2008

IMPLICIT ステートメントに指定する型は、VECTOR 型にしないでください。

据え置き length 型パラメーターは、declaration_type_spec には指定できません。

STATIC または AUTOMATIC として指定する文字または文字の範囲は、すべてのデータ型の IMPLICIT ステートメントにも指定できます。有効範囲単位内のrange_list 内の文字に、declaration_type_spec と UNDEFINED の両方を指定することはできません。同じ文字に対して、STATIC と AUTOMATIC の両方を指定することもできません。

有効範囲単位で形式 IMPLICIT NONE を指定する場合、型宣言ステートメントを使用して、その有効範囲単位にローカルな名前のデータ型を指定する必要があります。明示的に定義されたデータ型を持たない名前は参照できません。このおかげで、不注意で参照したすべての名前を制御できます。IMPLICIT NONE を指定する場合、同じ有効範囲単位内に STATIC または AUTOMATIC を含むもの以外のその他の IMPLICIT ステートメントを指定することはできません。プログラムを-qundef コンパイラー・オプションでコンパイルすることにより、IMPLICIT ステートメントが使用できる、それぞれの有効範囲単位に IMPLICIT NONE ステートメントを指定するのと同じ効果を得られます。

IMPLICIT UNDEFINED は、指定した文字または文字範囲に対して、暗黙的なデータ型の決定のデフォルトをオフにします。IMPLICIT UNDEFINED を指定する場合、指定した文字で始まる有効範囲単位内のすべてのシンボル名のデータ型を宣言する必要があります。コンパイラーは、明示的に定義されたデータ型を持たない、有効範囲単位にローカルな、それぞれのシンボル名の診断メッセージを出します。

IMPLICIT ステートメントは、組み込み関数のデータ型を変更しません。

-qsave/-qnosave コンパイラー・オプションを使用して、ストレージ・クラスの暗黙規定を変更します。

-qsave コンパイラー・オプション

暗黙規定を作成します IMPLICIT STATIC( a - _ )

-qnosave コンパイラー・オプション

暗黙規定を作成します IMPLICIT AUTOMATIC( a - _ )

-qmixed コンパイラー・オプションを指定しても、範囲リスト項目は大/小文字の区別がありません。例えば、-qmixed を指定した IMPLICIT INTEGER(A) は、A で始まるデータ・オブジェクトと同様に a で始まるデータ・オブジェクトの暗黙的な型の決定に影響します。

第 11 章 ステートメントおよび属性 431

Page 458: IBM XL Fortran for Linux, V15.1

例IMPLICIT INTEGER (B), COMPLEX (D, K-M), REAL (R-Z,A)

! This IMPLICIT statement establishes the following! implicit typing:!! A: real! B: integer! C: real! D: complex! E to H: real! I, J: integer! K, L, M: complex! N: integer! O to Z: real! $: real! _: real

関連情報v 暗黙の規則の説明は、 20ページの『型の決定』

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 「XL Fortran コンパイラー・リファレンス」の『-qundef オプション』

v 「XL Fortran コンパイラー・リファレンス」の『-qsave オプション』

IMPORT (Fortran 2003)目的

モジュール・プロシージャー・インターフェース本体ではないインターフェース本体内で、ホストの有効範囲単位の名前付きエンティティーにアクセスすることはできません。IMPORT ステートメントは、親子結合によって、そうしたインターフェース本体内でのそれらエンティティーへのアクセスを可能にします。 IMPORT ステートメントは、モジュール・プロシージャー・インターフェース本体内では無効です。

構文

import_name_list

ホストの有効範囲単位内でアクセス可能な名前付きエンティティーのリストです。

規則

IMPORT ステートメントは、モジュール・プロシージャー・インターフェース本体を除く、インターフェース本体内でのみ許可されます。指定したそれぞれの名前は、インターフェース本体の前にはっきりと宣言する必要があります。

�� IMPORTimport_name_list

::

��

432 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 459: IBM XL Fortran for Linux, V15.1

インポートの名前リストにあるエンティティーは、現行有効範囲単位にインポートされて、親子結合を使用してアクセスできます。名前を指定しない場合、ホストの有効範囲単位内のアクセス可能な名前付きエンティティーのすべてがインポートされます。

インポートされたエンティティーの名前が、ホスト・エンティティーをアクセス不能にするコンテキストに現れないようにしてください。

例use, intrinsic :: ISO_C_BINDINGinterface

subroutine process_buffer(buffer, n_bytes), bind(C,NAME="ProcessBuffer")IMPORT :: C_PTR, C_INTtype (C_PTR), value :: bufferinteger (C_INT), value :: n_bytes

end subroutine process_bufferend interface......

関連情報v 448ページの『INTERFACE』

v 175ページの『ホスト関連付け』

v 183ページの『インターフェースの概念』

INQUIRE目的

INQUIRE ステートメントによって、名前付きファイルのプロパティーまたは特定の装置への関連付けに関する情報を取得します。

INQUIRE ステートメントには、以下の 3 つの形式があります。

v ファイルによる照会。これには、FILE= 指定子が必要です。

v 出力リストによる照会。これには、IOLENGTH= 指定子が必要です。

v 装置による照会。これには、UNIT= 指定子が必要です。

構文

iol 不定様式出力ステートメント内の出力リストを使用した結果のデータのバイト数を示します。iol は、スカラー整変数です。

output_item

PRINT または WRITE ステートメントを参照してください。

inquiry_list

INQUIRE ステートメントの、ファイルによる照会形式と装置による照会形

�� INQUIRE ( inquiry_list )( IOLENGTH = iol ) output_item_list

��

第 11 章 ステートメントおよび属性 433

Page 460: IBM XL Fortran for Linux, V15.1

式の照会指定子のリストです。ファイルによる照会形式には、装置指定子を入れることはできないし、装置による照会には、ファイル指定子を入れることはできません。 INQUIRE ステートメントには、指定子は、複数回指定できません。照会指定子は、以下のとおりです。

[UNIT=] u

装置指定子です。これによって、装置による照会形式のステートメントで照会する装置を指定します。u は、値がアスタリスクでない、外部装置識別子にする必要があります。外部装置識別子は、外部ファイルを参照します。これは、以下のいずれかになります。

v 値の範囲が 1 から 2147483647 である整数式。

v F2008 A NEWUNIT 値 F2008

オプション文字 UNIT= を省略する場合、u を、inquiry_list の最初の項目にする必要があります。

ACCESS= char_var

ファイル接続が直接アクセス用、順次アクセス用、 ストリーム・アクセス用のいずれであるかを示します。 char_var はスカラー文字変数で、ファイルが順次アクセス用に接続されている場合は、値SEQUENTIAL が割り当てられます。ファイルが直接アクセスに関連付けられている場合は、割り当てられる値は DIRECT です。 ファイルがストリーム・アクセスに関連付けられている場合は、割り当てられる値はSTREAM です。 関連付けがない場合、char_var には、値UNDEFINED を割り当てます。

ACTION= act

ファイルが、読み取りおよび書き込みアクセスに関連付けられているかどうかを示します。 act は、スカラー文字変数です。これには、ファイルが入力のみに関連付けられている場合は、値 READ、ファイルが出力のみに関連付けられている場合は WRITE、ファイルが入力と出力の両方に関連付けられている場合は READWRITE、関連付けがない場合は UNDEFINED を割り当てます。

ASYNCH= char_variable (IBM 拡張)装置が非同期アクセスに関連付けられているかどうかを示します。

char_variable は、以下の値を割り当てられた文字変数です。

v YES。装置が同期アクセスと非同期アクセスの両方に関連付けられている場合。

v NO。装置が同期アクセスのみに関連付けられている場合。

v UNDEFINED。装置が関連付けられていない場合。

ASYNCHRONOUS= char_var (Fortran 2003)ファイルが関連付けられているかどうか、および、装置上の非同期入出力が使用可能かどうかを示します。

char_var は、以下の値を割り当てられた文字変数です。

v YES。ファイルが関連付けられていて、装置上の非同期入出力が使用可能な場合。

v NO。ファイルが関連付けられていて、装置上の非同期入出力が使用可能でない場合。

434 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 461: IBM XL Fortran for Linux, V15.1

v UNDEFINED。ファイルが関連付けられていない場合。

ASYNCH= 指定子および ASYNCHRONOUS=指定子 は、同じ INQUIRE ステートメントに指定できません。2

番目に指定したものが無視されます。

BLANK= char_var

定様式入出力に関連付けられたファイルのブランクのデフォルトの扱いを示します。char_var は、スカラー文字変数です。これには、数値入力フィールド内のすべてのブランクを無視する場合は、値 NULL、非先行ブランクをゼロとして解釈する場合は、値 ZERO を割り当てます。関連付けがない場合、あるいは、定様式入出力の関連付けではない場合、char_var には、値UNDEFINED を割り当てます。

CONVERT= char_var

ファイルの入出力操作に対するバイト・オーダーを示します。ビッグ・エンディアンのバイト・オーダーがファイルの入出力操作で使用されている場合、char_var は、値 BIG_ENDIAN を割り当てられたスカラー文字変数です。そうでなければ、char_var は、値 NATIVE が割り当てられます。

DECIMAL= char_var (Fortran 2003)char_var は、スカラー文字変数です。これには、定様式入出力関連付けの実質上の 10 進数編集モードに対応する POINT または COMMA のいずれかの値が割り当てられます。関連付けがない場合、あるいは、定様式入出力の関連付けではない場合、char_var には、値 UNDEFINED を割り当てます。

DELIM= del

形式がある場合は、リスト指示形式設定または名前リスト形式設定によって書き込まれる、文字データを区切るのに使用される形式を示します。del

は、スカラー文字変数です。これには、データを区切るのにアポストロフィを使用する場合は、値 APOSTROPHE、データを区切るのに引用符を使用する場合は QUOTE、データを区切るのにアポストロフィも引用符も使用しない場合は NONE、ファイルの関連付けまたは定様式データへの関連付けがない場合は UNDEFINED を割り当てます。

DIRECT= dir

ファイルが直接アクセスに関連付けられているかどうかを示します。dir

は、スカラー文字変数です。これには、ファイルに直接アクセスできる場合は、値 YES、ファイルに直接アクセスできない場合は、値 NO、アクセスが判別できない場合は、値 UNKNOWN を割り当てます。

ENCODING=char_variable (Fortran 2003)ファイルのエンコード形式を示します。char_variable は文字変数です。これには、ファイルのエンコード形式が ASCII の場合には値 DEFAULT、入出力への関連付けが不定形式の場合には UNDEFINED、さらにファイルの関連付けがない場合には UNKNOWN を割り当てます。

ERR= stmt_label

エラー指定子です。これは、エラーが発生した場合に、制御の転送先と同じ

第 11 章 ステートメントおよび属性 435

Page 462: IBM XL Fortran for Linux, V15.1

有効範囲単位内にある実行可能ステートメントのステートメント・ラベルを指定します。ERR= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

EXIST= ex

ファイルまたは装置が存在するかどうかを示します。ex は、値 true または false を割り当てられた整変数です。ファイルによる照会形式のステートメントの場合、FILE= 指定子で指定されたファイルが存在すれば、値true が割り当てられます。ファイルが存在しない場合、値 false が割り当てられます。装置による照会形式のステートメントの場合、UNIT= で指定された装置が存在すれば、値 true が割り当てられます。装置が無効であれば、値 false が割り当てられます。

FILE= char_expr

ファイル指定子です。これによって、ファイルによる照会形式でステートメントが照会するファイルの名前を指定します。char_expr は、末尾ブランクが除去された時に、値が、有効な Linux オペレーティング・システムのファイル名であるスカラー文字式です。名前付きファイルが存在しないようにして、それが装置と関連付けられないようにしてください。

注: 有効な Linux オペレーティング・ システムのファイル名は、合計長さが 1023 文字以下、各ファイル名の長さが 255 文字以下の絶対パス名にする必要があります (絶対パス名を指定する必要はありませんが)。

FORM= char_var

ファイルが定様式入出力または不定形式入出力に関連付けられているかどうかを示します。char_var は、デフォルトのスカラー文字変数です。これには、デフォルトが定様式入出力に関連付けられている場合は、値FORMATTED を割り当てます。ファイルが不定形式入出力に関連付けられている場合は、割り当てられる値は UNFORMATTED です。関連付けがない場合、char_var には、値 UNDEFINED を割り当てます。

FORMATTED= fmt

ファイルを定様式入出力に関連付けできるかどうかを示します。 fmt は、スカラー文字変数です。これには、ファイルを定様式入出力に関連付けできる場合は、値 YES、ファイルを定様式入出力に関連付けできない場合は、値 NO、形式設定が判別できない場合は、値 UNKNOWN を割り当てます。

ID= scalar_int_expr (Fortran 2003)指定した装置の保留データ転送処理を識別する指定子です。scalar_int_expr

は、デフォルトのスカラー文字変数です。

ID= 指定子が現れ、指定したデータ転送処理が完了した場合、PENDING=指定子に指定した変数に、値 false が割り当てられて、INQUIRE ステートメントが、指定したデータ転送の待機命令を実行します。

436 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 463: IBM XL Fortran for Linux, V15.1

ID= 指定子がなくて、指定した装置のすべてのデータ転送処理が完了した場合、PENDING= 指定子に指定した変数に、値 false が割り当てられて、INQUIRE ステートメントが、指定した装置の前の保留データ転送のすべてに対する待機命令を実行します。

それ以外の場合は、PENDING= 指定子に、値 true が割り当てられて、待機命令は実行されません。INQUIRE ステートメントの実行後、前の保留データ転送は保留のままです。

IOMSG= iomsg_variable (Fortran 2003)入出力状況指定子です。これは、入出力操作によって戻されるメッセージを指定します。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

v エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

v このような条件が発生しない場合は、変数の値は変更されません。

IOSTAT= ios

入出力状況指定子です。これは、入出力操作の状況を指定します。ios は、整変数です。この指定子を含む入出力ステートメントが実行を終了する時、ios は、以下の値で定義されます。

v エラー条件が発生しない場合はゼロ値

v エラーが発生した場合は正の値

IOSTAT= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

NAME= fn

ファイルの名前を示します。fn は、スカラー文字変数です。これには、装置が関連付けられているファイルの名前を割り当てます。

NAMED= nmd

ファイルに名前があるかどうかを示します。nmd は、ファイルに名前がある場合に、値 true を割り当てられる整変数です。ファイルに名前がない場合、割り当てられる値は false です。

NEXTREC= nr

直接アクセスに関連付けられたファイルで、次のレコードの読み取りまたは書き込みができる場所を示します。nr は、値 n + 1 が割り当てられた整変数です。ここで n は、直接アクセスに関連付けられたファイルで、読み取りまたは書き込みされる最終レコードのレコード番号です。ファイルが関連付けられていて、関連付け以降、レコードが読み取りまたは書き込みされていない場合、nr には、値 1 が割り当てられます。ファイルが直接アクセスに関連付けられていないか、前のエラーのためにファイルの位置が判別できない場合は、nr は未定義になります。

第 11 章 ステートメントおよび属性 437

Page 464: IBM XL Fortran for Linux, V15.1

レコード数は 2**31-1 より大きい可能性があるため、INTEGER(8) 型の NEXTREC= 指定子で指定されたスカラー変数を構成することを選択できます。これは、以下の 2 つの例を含む、多くの方法で遂行できます。

v nr を INTEGER(8) として明示的に宣言する

v -qintsize=8 コンパイラー・オプションを使用して、整数のデフォルトの種類を変更する

NUMBER= num

現在、ファイルに関連付けられている外部装置識別子を示します。num

は、現在、ファイルに関連付けられている装置の、外部装置識別子の値を割り当てられる整変数です。ファイルに関連付けられている装置がない場合、num には、値 -1 が割り当てられます。

OPENED= od

ファイルまたは装置が関連付けられているかどうかを示します。od は、値true または false を割り当てられた整変数です。ファイルによる照会形式のステートメントの場合、FILE= char_var で指定されたファイルが装置に関連付けられていれば、値 true が割り当てられます。ファイルが装置に関連付けられていなければ、値 false が割り当てられます。装置による照会形式のステートメントの場合、UNIT= で指定された装置がファイルに関連付けられていれば、値 true が割り当てられます。装置がファイルに関連付けられていなければ、値 false が割り当てられます。閉じられていない、事前に関連付けられたファイルの場合、値は、最初の入出力操作の前と後の両方で true になります。

PAD= pd

関連付けの現行 PAD モードを示します。pd は、デフォルト値 YES のスカラー文字変数です。pd には、ファイルの関連付けで PAD=NO を指定する場合、値 NO を割り当てます。

PAD= は、関連付けがない場合、または不定形式入出力に関連付けされている場合、UNDEFINED を戻します。アプリケーションを - qxlf90=oldpadでコンパイルした場合、このような場合は PAD= は YES を戻します。

PENDING=scalar_default_logical_variable (Fortran 2003)前の保留非同期データ転送が完了したかどうかを示します。データ転送処理は、INQUIRE ステートメントの実行の開始時に保留されている場合、前もって保留されています。scalar_default_logical_variable は、値 true またはfalse を割り当てられた整変数です。

ID= 指定子が現れ、指定したデータ転送処理が完了した場合、PENDING=指定子に指定した変数に、値 false が割り当てられて、INQUIRE ステートメントが、指定したデータ転送の待機命令を実行します。

ID= 指定子がなくて、指定した装置のすべてのデータ転送処理が完了した場合、PENDING= 指定子に指定した変数に、値 false が割り当てられて、INQUIRE ステートメントが、指定した装置の前の保留データ転送のすべてに対する待機命令を実行します。

438 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 465: IBM XL Fortran for Linux, V15.1

それ以外の場合は、PENDING= 指定子に、値 true が割り当てられて、待機命令は実行されません。INQUIRE ステートメントの実行後、前の保留データ転送は保留のままです。

POS=integer_var (Fortran 2003)integer_var は、ストリーム・アクセスに関連付けられたファイルのファイル位置の値を示す整変数です。integer_var には、ストリーム・アクセスに関連付けられたファイルの現在位置のすぐ後に続く、ファイル記憶単位の番号が割り当てられます。ファイルが、終端位置に置かれている場合、integer_var

は、ファイル内の最大番号の記憶単位より大きい値を割り当てます。integer_var は、ファイルがストリーム・アクセスに関連付けられていない場合、または、前のエラー条件のために、ファイルの位置が判別できない場合、未定義になります。

POSITION= pos

ファイルの位置を示します。pos は、スカラー文字変数です。これには、ファイルが初期点での位置決めのために OPEN ステートメントで関連付けられている場合は、値 REWIND、ファイルがファイル終了レコードの前あるいは終端点での位置決めのために関連付けられている場合は APPEND、ファイルが位置を変更することなく関連付けられている場合は ASIS、関連付けがない場合、またはファイルが直接アクセスに関連付けられている場合はUNDEFINED を割り当てます。

ファイルのオープン以降、ファイルが初期点に位置変更された場合は、pos

には、値 REWIND が割り当てられます。ファイルのオープン以降、ファイルがファイル終了レコードのすぐ前に位置変更された場合 (または、終端点にファイル終了レコードがない場合)、pos には、値 APPEND が割り当てられます。上記の両方ともが真でファイルが空の場合、pos には、値APPEND が割り当てられます。ファイルがファイル終了レコードの後に置かれた場合、pos には、値 ASIS が割り当てられます。

READ= rd

ファイルの読み取りが可能かどうかを示します。rd は、スカラー文字変数です。これには、ファイルの読み取りが可能であれば、値 YES、ファイルの読み取りが不可能な場合は NO、ファイルの読み取りが可能かどうか判別できない場合は UNKNOWN を割り当てます。

READWRITE= rw

ファイルの読み取りと書き込みの両方が可能かどうかを示します。rw はスカラー文字変数です。これには、ファイルの読み取りと書き込みの両方が可能な場合、値 YES、ファイルの読み取りと書き込みの両方が不可能な場合、NO、ファイルの読み取りと書き込みの両方が可能かどうか判別できない場合は UNKNOWN を割り当てます。

RECL= rcl

直接アクセスに関連付けられたファイルのレコード長の値、または、順次アクセスに関連付けられたファイルの最大レコード長の値を示します。

rcl は、レコード長の値を割り当てた整変数です。

ファイルが定様式入出力に関連付けられている場合、その長さは、文字データを含むすべてのレコードの文字数になります。ファイルが不定形式入出力

第 11 章 ステートメントおよび属性 439

Page 466: IBM XL Fortran for Linux, V15.1

に関連付けられている場合、その長さは、データのバイト数になります。関連付けがない場合、rcl は未定義になります。

ファイルがストリーム・アクセスに関連付けられている場合、rcl

は、未定義になります。

ROUND= char_var (Fortran 2003)

値 UP、DOWN、ZERO、PROCESSOR_DEPENDENT、NEAREST またはCOMPATIBLE、(どれでも、現行関連付けの丸めモード) を char_var に割り当てます。関連付けがない場合、または入力が定様式でない場合、戻り値は UNDEFINED です。char_var は、文字変数です。

丸めモード・ヘルプによって、定様式入出力中に 10 進数を文字表記から内部表記 (すなわち、2 進数) に変換する方法、またはその逆にする方法を指定します。丸めモードには、以下の関数があります。

v UP 丸めモードでは、変換による値は、元の値以上の最小値になります。

v DOWN 丸めモードでは、変換による値は、元の値以下の最大値になります。

v ZERO 丸めモードでは、変換による値は、元の値に最も近く、絶対値ではより大きくない値になります。

v NEAREST 丸めモードでは、変換による値は、表記可能な、最も隣接した 2 つの値のより近い方になります。両方の値が同じように近い場合、偶数値が選択されます。IEEE 丸め変換で、NEAREST は、IEEE 標準で指定される ieee_nearest 丸めモードに相当します。

v COMPATIBLE 丸めモードでは、変換による値は、表記可能な、最も隣接した 2 つの値の内、最も近い値か、中間である場合はよりゼロから離れた値になります。

v PROCESSOR_DEFINED 丸めモードでは、変換による値は、プロセッサー従属となり、他のモードに対応することがあります。XL Fortran では、PROCESSOR_DEFINED 丸めモードは、浮動小数点制御レジスターで選択する丸めモードとなります。浮動小数点制御レジスターを明示的に設定していない場合、デフォルトの丸めモードは NEAREST です。

SEQUENTIAL= seq

ファイルが順次アクセスに関連付けられているかどうかを示します。seq はスカラー文字変数です。これには、順次にファイルにアクセスできる場合は、値 YES、順次にファイルにアクセスできない場合は、値 NO、アクセスが判別できない場合は、値 UNKNOWN を割り当てます。

SIGN= char_var (Fortran 2003)定様式入出力の関連付けに効力のある符号モードを示します。 char_var

に、値 PLUS が割り当てられている場合、プロセッサーは、通常オプションの正符号が含まれているすべての位置に、正符号を出し、char_var に、値SUPPRESS が割り当てられている場合は、これらの位置で正符号を抑制します。char_var には、値 PROCESSOR_DEFINED を割り当てることもできます。これは、デフォルトの符号モードで、SUPPRESS と同じ働きをします。関連付けがない場合、あるいは、定様式入出力の関連付けではない場合、char_var には、値 UNDEFINED を割り当てます。

440 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 467: IBM XL Fortran for Linux, V15.1

SIZE=filesize

filesize は、バイトでファイル・サイズを割り当てられた整変数です。

STREAM=strm (Fortran 2003)ファイルがストリーム・アクセスに関連付けられているかどうかを示すスカラー・デフォルト文字変数です。strm には、ストリーム・アクセスを使用して、ファイルにアクセスできる場合は、値 YES、ストリーム・アクセスを使用して、ファイルにアクセスできない場合は、値 NO、アクセスが判別できない場合は、値 UNKNOWN を割り当てます。

TRANSFER= char_variable (IBM 拡張)同期および非同期データ転送が、許されるファイルの転送方式かどうかを示す非同期入出力指定子です。

char_variable は、スカラー文字変数です。char_variable に、値 BOTH が割り当てられた場合、同期および非同期データ転送の両方を使用できます。char_variable に、値 SYNCH が割り当てられた場合、同期データ転送のみを使用できます。char_variable に、値 UNKNOWN が割り当てられた場合、プロセッサーは、このファイルの許される転送方式を判別できません。

UNFORMATTED= unf

ファイルを不定形式入出力に関連付けできるかどうかを示します。 fmt

は、スカラー文字変数です。これには、ファイルを不定形式入出力に関連付けできる場合は、値 YES、ファイルを不定形式入出力に関連付けできない場合は、値 NO、形式設定が判別できない場合は、値 UNKNOWN を割り当てます。

WRITE= wrt

ファイルに書き込みが可能化どうかを示します。wrt は、スカラー文字変数です。これには、ファイルの書き込みが可能であれば、値 YES、ファイルの書き込みが可能でない場合は NO、ファイルに書き込めるかどうかが判別できない場合は UNKNOWN を割り当てます。

規則

INQUIRE ステートメントはファイルの装置への関連付けの前、最中、および後に実行できます。INQUIRE ステートメントの結果として割り当てられる値は、ステートメントが実行される時に現行である値です。

IBM 拡張

装置またはファイルが関連付けされる場合、ACCESS=、SEQUENTIAL=、STREAM=、DIRECT=、ACTION=、READ=、WRITE=、READWRITE=、FORM=、FORMATTED=、UNFORMATTED=、BLANK=、DELIM=、PAD=、RECL=、POSITION=、NEXTREC=、NUMBER=、NAME=、NAMED=、DECIMAL=、ROUND= および SIGN= 指定子の戻り値は、関連付けのプロパティーであり、そのファイルからのものではありません。 EXIST= および OPENED=指定子は、このような状態に true を戻します。

装置またはファイルが関連付けされないか、存在しない場合、ACCESS=、ACTION=、FORM=、BLANK=、DELIM=、POSITION= 指定子は、値UNDEFINED、DIRECT=、SEQUENTIAL=、STREAM=、FORMATTED=、UNFORMATTED= を戻し、READ=、WRITE= および READWRITE= 指定子は、

第 11 章 ステートメントおよび属性 441

Page 468: IBM XL Fortran for Linux, V15.1

値 UNKNOWN を戻し、RECL= および NEXTREC= 指定子変数は定義されず、PAD= 指定子は、値 YES を戻し、OPENED 指定子は、値 false を戻します。SIZE= 指定子によって戻される値は -1 です。

装置またはファイルが存在しない場合、EXIST= および NAMED= 指定子は、値false を戻し、NUMBER= 指定子は、値 -1 を戻し、NAME= 指定子変数は定義されません。

装置またはファイルは存在するが関連付けられていない場合、EXIST= 指定子は、値 true を戻します。装置による照会形式のステートメントの場合、NAMED= 指定子は、値 false を戻し、NUMBER= 指定子は装置番号を戻し、NAME= 指定子変数は未定義になります。ファイルによる照会形式のステートメントの場合、NAMED= 指定子は、値 true を戻し、NUMBER= 指定子は、-1 を戻し、NAME=指定子は、ファイル名を戻します。

IBM 拡張 の終り

同じ INQUIRE ステートメント内で複数の指定子に同じ変数名を指定しないでください。また、指定子のリスト内にある他の変数と関連付けしないでください。

例SUBROUTINE SUB(N)

CHARACTER(N) A(5)INQUIRE (IOLENGTH=IOL) A(1) ! Inquire by output listOPEN (7,RECL=IOL)

...END SUBROUTINE

関連情報v 254ページの『条件および IOSTAT 値』

v 241ページの『第 9 章 XL Fortran の入出力』

INTEGER目的

INTEGER 型宣言ステートメントによって、整数型のオブジェクトと関数の長さと属性を指定します。初期値はオブジェクトに代入することができます。

構文

ここで、

�� INTEGERkind_selector ::

, attr_spec_list ::

entity_decl_list ��

442 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 469: IBM XL Fortran for Linux, V15.1

attr_spec

以下のいずれかです。

ALLOCATABLE �1� INTRINSIC PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PARAMETER STATIC �2�

BIND �1� POINTER TARGET

DIMENSION (array_spec) PRIVATE VALUE �1�

EXTERNAL PROTECTED �1� VOLATILE

INTENT (intent_spec)

注:�1� Fortran 2003

�2� IBM 拡張

kind_selector

整数エンティティーの長さ、1、2、4 または 8 を指定します。int_literal_constant は、kind 型パラメーターを指定できません。

attr_spec

個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

intent_spec

IN、OUT、または INOUT のいずれかになります。

:: 二重コロン区切り文字です。属性、=constant_expr、または => NULL() を指定する場合は、二重コロン区切り文字を使用します。

array_spec

次元範囲のリストです。

entity_decl

�� ( int_constant_expr )KIND =

(1)* int_literal_constant

��

注:

1 IBM 拡張.

第 11 章 ステートメントおよび属性 443

Page 470: IBM XL Fortran for Linux, V15.1

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数名には指定できません。

len

kind_selector に指定されたように長さをオーバーライドします。kind 型パラメーターは指定できません。エンティティーの長さは、許される長さ指定の 1 つを表す、整数のリテラル定数にする必要があります。

initial_value

すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。

constant_expr

直前の名前によって指定されるエンティティーの定数式を指定します。

=> NULL()ポインター・オブジェクトの初期値を指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

v コンパイラーは、型定義の有効範囲単位内の constant_expr を評価します。

�� a(1) (2) ( array_spec )

* len(3) (4)

( array_spec ) * len

�(5)

/ initial_value_list /= constant_expr=> NULL()

��

注:

1 IBM 拡張.

2 IBM 拡張.

3 IBM 拡張.

4 IBM 拡張.

5 IBM 拡張.

444 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 471: IBM XL Fortran for Linux, V15.1

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

変数に constant_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。組み込み関数の型を確認する型宣言ステートメントを使用できます。一般または特定の組み込み関数の名前が型宣言ステートメント内に現れても、名前がその組み込みプロパティーを失うことはありません。

オブジェクトが、仮引数、割り振り可能オブジェクト、ポインター、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内では初期化できません。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通ブロックに現れる場合、 またはモジュール内あるいはサブモジュール内の名前付き共通ブロックに現れる場合は、オブジェクトを初期化できます。

=> NULL() を使用してポインターを初期化できます。

array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

ステートメントに PARAMETER 属性が含まれている場合は、constant_expr を指定する必要があります。宣言するエンティティーが変数で、constant_expr またはNULL() が指定された場合、変数は最初に定義されます。

宣言するエンティティーが派生型コンポーネントで、constant_expr または NULL()が指定された場合、派生型はデフォルトの初期化値を持ちます。

a は、組み込み代入の規則に応じて、constant_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、constant_expr または NULL() の存在は、a が、名前付き共通域ブロック内のオブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。

第 11 章 ステートメントおよび属性 445

Page 472: IBM XL Fortran for Linux, V15.1

ALLOCATABLE または POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

例MODULE INT

INTEGER, DIMENSION(3) :: A,B,CINTEGER :: X=234,Y=678

END MODULE INT

関連情報v 41ページの『整数』v 114ページの『定数式』v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』v 86ページの『配列宣言子』v 21ページの『自動オブジェクト』v 31ページの『変数のストレージ・クラス (IBM 拡張)』v 初期値に関しての詳細は、 363ページの『DATA』

INTENT目的

INTENT 属性によって、仮引数の意図した使用を指定します。

構文

dummy_arg_name

仮引数の名前です。これは、ダミー・プロシージャーにはできません。

規則

非ポインターの割り振り不可能な仮引数を指定する場合、INTENT 属性は、以下の特性を持ちます。

v INTENT(IN) は、サブプログラムの実行中に、仮引数が再定義されたり、未定義にならないようにする必要があるように指定します。

�� INTENT ( IN ) dummy_arg_name_listOUT ::INOUT

��

446 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 473: IBM XL Fortran for Linux, V15.1

v INTENT(OUT) は、仮引数が、サブプログラム内で参照される前に、定義される必要があるように指定します。このような仮引数は、サブプログラムの呼び出し時に未定義にならない可能性があります。

v INTENT(INOUT) は、仮引数が、呼び出しサブプログラムとのデータの受け取りと戻しの両方ができるように指定します。

ポインターの仮引数を指定する場合、INTENT 属性は、以下の特性を持ちます。

v INTENT(IN) は、プロシージャーの実行中、ポインターのターゲットが割り振り解除される場合を除いて、ポインターの仮引数の関連付け状況を変更できないように指定します。ポインターのターゲットが割り振り解除された場合、ポインターの仮引数の関連付け状況は未定義になります。

ポインター代入ステートメント内では、INTENT(IN) ポインターの仮引数をポインター・オブジェクトとして使用できません。INTENT(IN) ポインターの仮引数を割り振ったり、割り振り解除したり、または無効にすることはできません。

INTENT(IN) ポインターの仮引数は、関連付けられた仮引数が、INTENT(OUT)または INTENT(INOUT) 属性を持つポインターである場合、プロシージャーへの実引数として指定できません。

v INTENT(OUT) は、プロシージャーの実行時に、ポインターの仮引数の関連付け状況が未定義になるように指定します。

v INTENT(INOUT) は、仮引数が、呼び出しサブプログラムとのデータの受け取りと戻しの両方ができるように指定します。

割り振り可能な仮引数を指定する場合、INTENT 属性は、以下の特性を持ちます。

v INTENT(IN) は、プロシージャーの実行中、仮引数の割り振り状況を変更できないように、また再定義されたり、未定義にならないように指定します。

v INTENT(OUT) は、プロシージャーの実行時に、関連付けられる実引数が、割り振られている場合に、割り振り解除されるように指定します。

v INTENT(INOUT) は、仮引数が、呼び出しサブプログラムとのデータの受け取りと戻しの両方ができるように指定します。

INTENT(OUT) が指定されている仮引数が、デフォルトの初期化が指定されている派生型である場合、その仮引数を想定サイズ配列にすることはできません。

ポインターの仮引数または割り振り可能な仮引数に、INTENT 属性を指定しない場合、その使用は関連付けられた実引数の制限や制約事項に左右されます。

OUT または INOUT を意図した仮引数に関連付けられた実引数は、定義できるようにしておく必要があります。従って、IN を意図する仮引数、あるいは定数か、定数のサブオブジェクトか、式である実引数は、OUT または INOUT を意図した引数を必要とするサブプログラムへの実引数として渡すことができません。

ベクトル添え字を持つ配列セクションである実引数は、定義または再定義される(すなわち、OUT または INOUT の意図を持つ) ダミー配列と関連付けることはできません。

表 43. INTENT 属性と互換性のある属性

ALLOCATABLE �1� CONTIGUOUS �2� TARGET

第 11 章 ステートメントおよび属性 447

Page 474: IBM XL Fortran for Linux, V15.1

表 43. INTENT 属性と互換性のある属性 (続き)

ASYNCHRONOUS OPTIONAL VALUE �1�

DIMENSION POINTER VOLATILE

注:�1� Fortran 2003

�2� Fortran 2008

OUT または INOUT を意図する仮引数に、VALUE 属性を指定しないようにしてください。

言語間呼び出しに使用される %VAL 組み込み関数は、IN を意図する仮引数に対応する実引数か、意図を指定しない実引数に対してのみ使用できます。この制約は、%REF 組み込み関数には適用されません。

例PROGRAM MAIN

DATA R,S /12.34,56.78/CALL SUB(R+S,R,S)

END PROGRAM

SUBROUTINE SUB (A,B,C)INTENT(IN) AINTENT(OUT) BINTENT(INOUT) CC=C+A+ABS(A) ! Valid references to A and C

! Valid redefinition of CB=C**2 ! Valid redefinition of B

END SUBROUTINE

関連情報v 222ページの『仮引数の意図』

v 219ページの『引数関連付け』

v 言語間呼び出しに関しての詳細は、 221ページの『%VAL および %REF (IBM

拡張)』

v 218ページの『仮引数』

INTERFACE目的

INTERFACE ステートメントは、インターフェース・ブロックの最初のステートメントです。これによって、外部プロシージャーまたはダミー・プロシージャーに対して明示的インターフェースを指定できます。

構文

448 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 475: IBM XL Fortran for Linux, V15.1

generic_spec

以下の通りです。

defined_operator

定義済みの単項演算子、定義済みの 2 項演算子、または拡張組み込み演算子です。

dtio_generic_spec

規則

generic_spec がある場合、インターフェース・ブロックは一般です。generic_spec とABSTRACT がない場合、インターフェース・ブロックは固有です。ABSTRACTINTERFACE で導入されるインターフェース・ブロックは、抽象インターフェース・ブロックです。generic_name は、インターフェース・ブロック内のすべてのプロシージャーを参照する単一の名前を指定します。一般名によって、プロシージャー参照があるたびに、多くても 1 つの固有のプロシージャーが呼び出されます。

一般または固有のインターフェース・ブロック内のインターフェース本体は、外部プロシージャーまたはダミー・プロシージャーに対して、EXTERNAL 属性および

�� INTERFACEgeneric_spec

(1)ABSTRACT INTERFACE

��

注:

1 Fortran 2003

�� generic_nameOPERATOR ( defined_operator )ASSIGNMENT ( = )

(1)dtio_generic_spec

��

注:

1 Fortran 2003

�� READ ( FORMATTED )READ ( UNFORMATTED )WRITE ( FORMATTED )WRITE ( UNFORMATTED )

��

第 11 章 ステートメントおよび属性 449

Page 476: IBM XL Fortran for Linux, V15.1

明示的な固有インターフェースを指定します。宣言されたプロシージャーの名前がインターフェース本体を含むサブプログラム内の仮引数の名前である場合、プロシージャーは、ダミー・プロシージャーになります。それ以外では、外部プロシージャーになります。

generic_spec を、INTERFACE ステートメントに指定する場合、対応する ENDINTERFACE ステートメント内の generic_spec と一致させる必要があります。

INTERFACE ステートメント内の generic_spec が generic_name の場合、対応するEND INTERFACE ステートメントの generic_spec を、同じ generic_name にする必要があります。

generic_spec なしの INTERFACE ステートメントは、generic_spec のあるなしにかかわらず END INTERFACE ステートメントに一致します。

固有のプロシージャーには、指定された有効範囲単位内の明示的インターフェースを複数指定しないでください。

アクセス可能であれば、固有インターフェースを介してプロシージャーを常に参照できます。プロシージャーの一般インターフェースが存在する場合、一般インターフェースを介してプロシージャーを参照することもできます。

generic_spec が OPERATOR(defined_operator) である場合、インターフェース・ブロックによって、定義済み演算子の定義、あるいは組み込み演算子の拡張が可能です。

generic_spec が ASSIGNMENT(=) である場合、インターフェース・ブロックは、組み込み代入を拡張できます。

generic_spec が dtio_generic_spec である場合、インターフェース・ブロックは派生型の入出力プロシージャーを定義します。ユーザー定義の派生型入出力プロシージャーは、アプリケーションが、データ転送入出力ステートメント内の派生型オブジェクトと値のデフォルトの処理をオーバーライドできるようにします。このインターフェース・ブロック内のサブルーチンには、 250ページの『ユーザー定義の派生型入出力プロシージャー・インターフェース (Fortran 2003)』で説明されているインターフェースを入れる必要があります。

例INTERFACE ! Nongeneric interface block

FUNCTION VOL(RDS,HGT)REAL VOL, RDS, HGT

END FUNCTION VOLFUNCTION AREA (RDS)

REAL AREA, RDSEND FUNCTION AREA

END INTERFACE

INTERFACE OPERATOR (.DETERMINANT.) ! Defined operator interfaceFUNCTION DETERMINANT(X)

INTENT(IN) XREAL X(50,50), DETERMINANT

END FUNCTIONEND INTERFACE

INTERFACE ASSIGNMENT(=) ! Defined assignment interface

450 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 477: IBM XL Fortran for Linux, V15.1

SUBROUTINE BIT_TO_NUMERIC (N,B)INTEGER, INTENT(OUT) :: NLOGICAL, INTENT(IN) :: B(:)

END SUBROUTINEEND INTERFACE

関連情報v 185ページの『明示的インターフェース』

v 125ページの『拡張組み込み演算および定義済み演算』

v 192ページの『定義済み演算子』

v 193ページの『定義済み代入』

v 250ページの『ユーザー定義の派生型入出力プロシージャー・インターフェース(Fortran 2003)』

v 419ページの『FUNCTION』

v 517ページの『SUBROUTINE』

v 479ページの『PROCEDURE』

v 209ページの『プロシージャー参照』

v 同じ一般名を持つ 2 つのプロシージャーを異なるものにする方法についての規則の詳細は、 189ページの『一義的な総称プロシージャー参照』

INTRINSIC目的

INTRINSIC 属性によって、名前を組み込みプロシージャーとして識別し、組み込みプロシージャーの固有の名前を実引数として使用できるようにします。

構文

name 組み込みプロシージャーの名前です。

規則

有効範囲単位で、固有の組み込みプロシージャー名を実引数として使用する場合、INTRINSIC 属性を指定する必要があります。一般名には、INTRINSIC 属性がありますが、それらが、固有名である場合を除いて、引数として渡すことができません。

INTRINSIC 属性を持つ一般または固有のプロシージャーは、それぞれのプロパティーを保持します。

INTRINSIC 属性を持つ一般組み込みプロシージャーは、一般インターフェース・ブロックの名前にすることもできます。一般インターフェース・ブロックによって、一般組み込みプロシージャーへの拡張機能を定義します。

�� INTRINSIC name_list::

��

第 11 章 ステートメントおよび属性 451

Page 478: IBM XL Fortran for Linux, V15.1

表 44. INTRINSIC 属性と互換性のある属性

PRIVATE PUBLIC

例PROGRAM MAIN

INTRINSIC SIN, ABSINTERFACE ABS

LOGICAL FUNCTION MYABS(ARG)LOGICAL ARG

END FUNCTIONEND INTERFACE

LOGICAL LANS,LVARREAL(8) DANS,DVARDANS = ABS(DVAR) ! Calls the DABS intrinsic procedureLANS = ABS(LVAR) ! Calls the MYABS external procedure

! Pass intrinsic procedure name to subroutineCALL DOIT(0.5,SIN,X) ! Passes the SIN specific intrinsic

END PROGRAM

SUBROUTINE DOIT(RIN,OPER,RESULT)INTRINSIC :: MATMULINTRINSIC COSRESULT = OPER(RIN)

END SUBROUTINE

関連情報v 一般および固有の組み込みプロシージャーは 623ページの『第 14 章 組み込みプロシージャー』にリストされています。このセクションを参照して、固有の組み込み名が実引数として使用できるかどうかを調べてください。

v 189ページの『総称インターフェース・ブロック』

LOGICAL目的

LOGICAL 型宣言ステートメントによって、論理型のオブジェクトと関数の長さと属性を指定します。初期値はオブジェクトに代入することができます。

構文

ここで、

attr_spec

以下のいずれかです。

ALLOCATABLE �1� INTRINSIC PUBLIC

�� LOGICALkind_selector ::

, attr_spec_list ::

entity_decl_list ��

452 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 479: IBM XL Fortran for Linux, V15.1

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PARAMETER STATIC �2�

BIND �1� POINTER TARGET

DIMENSION (array_spec) PRIVATE VALUE �1�

EXTERNAL PROTECTED �1� VOLATILE

INTENT (intent_spec)

注:�1� Fortran 2003

�2� IBM 拡張

kind_selector

論理エンティティーの長さ、1、2、4 または 8 を指定します。int_literal_constant は、kind 型パラメーターを指定できません。

attr_spec

個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

intent_spec

IN、OUT、または INOUT のいずれかになります。

:: 二重コロン区切り文字です。属性、=constant_expr、または => NULL() を指定する場合は、二重コロン区切り文字を使用します。

array_spec

次元範囲のリストです。

entity_decl

�� ( int_constant_expr )KIND =

(1)* int_literal_constant

��

注:

1 IBM 拡張.

第 11 章 ステートメントおよび属性 453

Page 480: IBM XL Fortran for Linux, V15.1

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数には指定できません。

len

kind_selector に指定されたように長さをオーバーライドします。kind 型パラメーターは指定できません。エンティティーの長さは、許される長さ指定の 1 つを表す、整数のリテラル定数にする必要があります。

initial_value

すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。

constant_expr

直前の名前によって指定されるエンティティーの定数式を指定します。

=> NULL()ポインター・オブジェクトの初期値を指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

v コンパイラーは、型定義の有効範囲単位内の constant_expr を評価します。

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

�� a(1) (2) ( array_spec )

* len(3)

( array_spec ) * len

�(4)

/ initial_value_list /= constant_expr=> NULL()

��

注:

1 IBM 拡張.

2 IBM 拡張.

3 IBM 拡張

4 IBM 拡張.

454 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 481: IBM XL Fortran for Linux, V15.1

変数に constant_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。組み込み関数の型を確認する型宣言ステートメントを使用できます。一般または特定の組み込み関数の名前が型宣言ステートメント内に現れても、名前がその組み込みプロパティーを失うことはありません。

オブジェクトが、仮引数、割り振り可能オブジェクト、ポインター、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内では初期化できません。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通ブロックに現れる場合、またはモジュール内 F2008 あるいはサブモジュール内 F2008

の名前付き共通ブロックに現れる場合は、オブジェクトを初期化できます。

Fortran 95 では、ポインターを初期化できます。ポインターは、=> NULL() の使用によってのみ初期化できます。

array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

ステートメントに PARAMETER 属性が含まれている場合は、constant_expr を指定する必要があります。宣言するエンティティーが変数で、constant_expr またはNULL() が指定された場合、変数は最初に定義されます。

宣言するエンティティーが派生型コンポーネントで、constant_expr または NULL()が指定された場合、派生型はデフォルトの初期化値を持ちます。

a は、組み込み代入の規則に応じて、constant_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、constant_expr または NULL() の存在は、a が、名前付き共通域ブロック内のオブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。

第 11 章 ステートメントおよび属性 455

Page 482: IBM XL Fortran for Linux, V15.1

ALLOCATABLE または POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

例LOGICAL, ALLOCATABLE :: L(:,:)LOGICAL :: Z=.TRUE.

関連情報v 47ページの『論理演算子』

v 114ページの『定数式』

v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』

v 86ページの『配列宣言子』

v 21ページの『自動オブジェクト』

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 初期値に関しての詳細は、 363ページの『DATA』

MODULE目的

MODULE ステートメントは、モジュール・プログラム単位の最初のステートメントです。これには、他のプログラム単位へアクセス可能にする仕様と定義が含まれています。

構文

規則

モジュール名は、モジュールのパブリック・エンティティーにアクセスするために、他のプログラム単位内で USE ステートメントによって参照されるグローバル・エンティティーです。ユーザー定義のモジュールを、プログラム内の他のプログラム単位、外部プロシージャー、共通ブロック、グローバル・エンティティーのバインディング・ラベルの名前と同じにしないでください。また、モジュール内のローカル名と同じにすることはできません。

モジュールを完了する END ステートメントによって、モジュール名を指定します。この名前は MODULE ステートメント内に指定された名前と同じにする必要があります。

�� MODULE module_name ��

456 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 483: IBM XL Fortran for Linux, V15.1

例MODULE MM

CONTAINSREAL FUNCTION SUM(CARG)

COMPLEX CARGSUM_FNC(CARG) = IMAG(CARG) + REAL(CARG)SUM = SUM_FNC(CARG)RETURN

ENTRY AVERAGE(CARG)AVERAGE = SUM_FNC(CARG) / 2.0

END FUNCTION SUMSUBROUTINE SHOW_SUM(SARG)

COMPLEX SARGREAL SUM_TMP

10 FORMAT('SUM:',E10.3,' REAL:',E10.3,' IMAG',E10.3)SUM_TMP = SUM(CARG=SARG)WRITE(10,10) SUM_TMP, SARG

END SUBROUTINE SHOW_SUMEND MODULE MM

関連情報v 199ページの『モジュール』

v 534ページの『USE』

v 177ページの『使用関連付け』

v END MODULE ステートメントに関しての詳細は、 387ページの『END』

v 478ページの『PRIVATE』

v 485ページの『PROTECTED (Fortran 2003)』

v 486ページの『PUBLIC』

MODULE PROCEDURE (Fortran 2008)目的

MODULE PROCEDURE ステートメントは、分離モジュール・サブプログラムの最初のステートメントです。

構文

規則

procedure_name は、格納元のプログラム単位内、上位モジュール内、または上位サブモジュール内の分離モジュール・プロシージャーとなるように宣言される必要があります。

次の例では、分離モジュール・サブプログラムの最初のステートメントとしてMODULE PROCEDURE ステートメントがどのように使用されるかを示しています。

�� MODULE PROCEDURE procedure_name ��

第 11 章 ステートメントおよび属性 457

Page 484: IBM XL Fortran for Linux, V15.1

MODULE mINTERFACE

MODULE SUBROUTINE sub(arg)INTEGER :: arg

END SUBROUTINEEND INTERFACE

END MODULE

SUBMODULE (m) nCONTAINS

MODULE PROCEDURE sub ! MODULE PROCEDURE statementarg = 1

END PROCEDUREEND SUBMODULE

関連情報v 211ページの『分離モジュール・プロシージャー (Fortran 2008)』

v 212ページの『分離モジュール・サブプログラム (Fortran 2008)』

v 387ページの『END』

NAMELIST目的

NAMELIST ステートメントによって、READ、WRITE、および PRINT ステートメント内で使用する名前の 1 つ以上のリストを指定します。

構文

Nname 名前リストのグループ名です。

variable_name

想定サイズ配列、またはポインティング先にしないでください。variable_name が、ポインター、または割り振り可能オブジェクトである最終コンポーネントを持つ型の変数である場合、ユーザー定義の派生型入出力プロシージャーによって処理される必要があります。

規則

名前リストのグループ名に属する名前のリストは、他の名前リストのグループ名が現れるか、NAMELIST ステートメントが終わると終了します。

variable_name は、使用関連付けあるいはホスト関連付けを介してアクセスされるか、同じ有効範囲単位内の前の仕様ステートメント、または暗黙的な型の決定の規則によって指定された、型および型パラメーターが指定されている必要があります。暗黙的に型が決定されている場合、続いて起こる型宣言ステートメント内のオ

�� �

,

NAMELIST / Nname / variable_name_list ��

458 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 485: IBM XL Fortran for Linux, V15.1

ブジェクトの出現によって、暗黙の型および型パラメーターを確認する必要があります。名前リストのグループ名を指定している名前リストの入出力ステートメントを含む有効範囲単位内で、オブジェクト内に最終的に含まれるコンポーネントに、アクセスできない場合、ユーザー定義の派生型入出力プロシージャーによって処理される場合を除いて、派生型オブジェクトをリスト項目として指定しないでください。

variable_name は、1 つ以上の名前リストに入れることができます。名前リストのグループ名に、PUBLIC 属性がある場合、リスト内の項目に、PRIVATE 属性または専用コンポーネントを指定できません。

Nname は、有効範囲単位内の複数の NAMELIST ステートメントに指定でき、各NAMELIST ステートメントに複数回指定できます。有効範囲単位内で連続して指定されている同じ Nname のそれぞれの後に続く variable_name_list は、そのNname のリストの続きとして扱われます。

名前リストの名前は、入出力ステートメントにのみ指定できます。名前リスト・データの入出力変換の規則は、データ変換の規則と同じです。

例DIMENSION X(5), Y(10)NAMELIST /NAME1/ I,J,KNAMELIST /NAME2/ A,B,C /NAME3/ X,YWRITE (10, NAME1)PRINT NAME2

関連情報v 305ページの『名前リストの形式設定』v 「XL Fortran コンパイラー・リファレンス」に記載される『実行時オプションの設定』

NULLIFY目的

NULLIFY ステートメントは、ポインターの関連付け解除を行います。

構文

pointer_object

ポインター変数名または構造体コンポーネントです。

規則

pointer_object は、定義できるようにして、POINTER 属性を指定する必要があります。

�� NULLIFY ( pointer_object_list ) ��

第 11 章 ステートメントおよび属性 459

Page 486: IBM XL Fortran for Linux, V15.1

pointer_object は、同じ NULLIFY ステートメント内の、他の pointer_object の値、範囲、関連付け状況に左右されないようにしてください。

ヒント:

ポインターは、常に NULLIFY ステートメント、ポインター代入、 デフォルトの初期化 または明示的初期化によって初期化します。

例TYPE T

INTEGER CELLTYPE(T), POINTER :: NEXT

ENDTYPE TTYPE(T) HEAD, TAILTARGET :: TAILHEAD%NEXT => TAILNULLIFY (TAIL%NEXT)END

関連情報v 144ページの『データ・ポインターの代入』v 178ページの『ポインター関連付け』

OPEN目的

OPEN ステートメントは、既存の外部ファイルの装置への関連付け、事前に関連付けられた外部ファイルの作成、外部ファイルの作成および装置への関連付け、または、外部ファイルと装置間の関連付けの特定の指定子の変更を行うために使用できます。

構文

open_list

必ず 1 つの装置指定子 ([UNIT=u]) F2008 または 1 つの NEWUNIT=指定子 F2008 を含むリストです。このリストには、他の有効な指定子を必要に応じて 1 つずつ追加できます。リストに複数の指定子が含まれる場合は、区切り文字としてコンマ (,) を使用します。有効な指定子は、次のとおりです。

[UNIT=] u

装置指定子です。u は、値がアスタリスクではない外部装置識別子にする必要があります。外部装置識別子とは、整数式によって表される外部ファイルのことです。整数式の値は、以下のいずれかです。

v 1 から 2147483647 の範囲内の値

v F2008 A NEWUNIT 値 F2008

�� OPEN ( open_list ) ��

460 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 487: IBM XL Fortran for Linux, V15.1

オプション文字 UNIT= を省略する場合、u を、open_list の最初の項目にする必要があります。

ACCESS= char_expr

ファイルの関連付けのためのアクセス方式を指定します。char_expr は、末尾ブランクが除去された時に、値が SEQUENTIAL、DIRECT またはSTREAM のいずれかであるスカラー文字式です。ACCESS= が DIRECTの場合、RECL= を指定する必要があります。 ACCESS= がSTREAM の場合、RECL= を指定しないでください。

SEQUENTIAL がデフォルトで、この場合、RECL= はオプションです。

ACTION= char_expr

使用できる入出力操作を指定します。char_expr は、値が、READ、WRITEまたは READWRITE として評価されるスカラー文字式です。READ が指定された場合、WRITE、PRINT および ENDFILE ステートメントは、この関連付けを参照できません。WRITE が指定された場合、READ ステートメントは、この関連付けを参照できません。値 READWRITE は、すべての入出力ステートメントが、この関連付けを参照できるようにします。ACTION= 指定子が省略された場合、デフォルト値は実際のファイル・アクセス権によって異なります。

v STATUS= 指定子に、値 OLD または UNKNOWN が指定され、ファイルが存在している場合、以下のようになります。

– ファイルが READWRITE で開かれる

– 上記が不可能な場合、ファイルは READ で開かれる

– 上記のどちらも不可能な場合は、ファイルは WRITE で開かれる

v STATUS= 指定子に、値 NEW、REPLACE、SCRATCH またはUNKNOWN が指定され、ファイルが存在しない場合、以下のようになります。

– ファイルが READWRITE で開かれる

– 上記が不可能な場合、ファイルは WRITE で開かれる

ASYNCH= char_expr (IBM 拡張)明示的に関連付けられた装置が、非同期入出力に使用されるかどうかを示す、非同期入出力指定子です。

char_expr はスカラー文字式で、その値は YES または NO のいずれかです。YES は、非同期データ転送ステートメントを、この関連付けに使用できることを指定します。NO は、非同期データ転送ステートメントを、この関連付けに使用できないことを指定します。指定された値は、ファイルに使用できる転送方式のセットに入ります。この指定子が省略された場合、デフォルト値は NO です。

事前に関連付けられた値は、ASYNCH= の値 NO で関連付けられます。

暗黙的に関連付けられた ASYNCH= 値は、装置で実行される最初のデータ転送ステートメントによって決定されます。最初のステートメントが非同期データ転送を実行して、暗黙的に関連付けられるファイルが非同期データ転送を使用できる場合、ASYNCH= の値は YES になります。それ以外では、ASYNCH= の値は NO になります。

第 11 章 ステートメントおよび属性 461

Page 488: IBM XL Fortran for Linux, V15.1

ASYNCHRONOUS=char_expr (Fortran 2003)装置において非同期入出力が使用できるかどうかを指定します。

char_expr はスカラー文字式で、その値は YES または NO のいずれかです。char_expr の値が YES の場合、装置における非同期入出力は使用可能です。char_expr の値が NO の場合、装置における非同期入出力は使用不可能です。ASYNCHRONOUS= がない場合は、デフォルト値は NO になります。

ASYNCH= 指定子 および ASYNCHRONOUS=指定子 は同じ OPEN ステートメントに指定できません。2 番目に指定したものが無視されます。

BLANK= char_expr

形式仕様を使用する際、ブランクのデフォルト変換処理を制御します。char_expr は、末尾ブランクが除去された時に、値が NULL か ZERO のいずれかであるスカラー文字式です。BLANK= が指定された場合、FORM='FORMATTED' を使用する必要があります。BLANK= が指定されず、FORM='FORMATTED' を指定した場合、NULL がデフォルトになります。

CONVERT= char_expr

不定形式データ・ファイルの入出力操作に対するバイト・オーダーを指定します。char_expr は、値が NATIVE、BIG_ENDIAN、またはLITTLE_ENDIAN として評価されるスカラー文字式です。値が NATIVEまたは LITTLE_ENDIAN である場合、リトル・エンディアンのバイト・オーダーが使用され、変換は不要です。値が BIG_ENDIAN である場合、データおよびレコード・マーカーのバイト・オーダーは実行時に変換されます。

以下の方法で、入出力操作に対するバイト・オーダーを指定できます。同じ装置に対して複数のバイト・オーダーが指定され、それらが互いに競合する場合、リストの最初のバイト・オーダーが優先されます。

1. 実行時オプション XLFRTEOPTS=ufmt_bigendian を設定する。

2. OPEN ステートメントの CONVERT= char_expr を設定する。ここでchar_expr は NATIVE、BIG_ENDIAN または LITTLE_ENDIAN。

3. @PROCESS UFMT(BE) または @PROCESS UFMT(LE)

4. コンパイラー・オプション -qufmt=be または -qufmt=le を設定する。

DECIMAL= char_expr (Fortran 2003)対応する装置のデフォルトの 10 進数編集モード を指定します。char_expr

は、値が POINT または COMMA のいずれかに評価される必要があるスカラー文字式です。DECIMAL= を指定しない場合、小数点モードが実質上デフォルトになります。

DELIM= char_expr

区切り文字がある場合は、リスト指示または名前リスト形式設定によって書き込まれる文字定数を区切るのに使用される区切り文字を指定します。char_expr は、値が APOSTROPHE、QUOTE、または NONE として評価されるスカラー文字式です。値が APOSTROPHE である場合、アポストロ

462 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 489: IBM XL Fortran for Linux, V15.1

フィ区切り文字定数および文字定数内のすべてのアポストロフィは二重にされます。値が QUOTE である場合、二重引用符区切り文字定数および文字定数内のすべての二重引用符は二重にされます。値が NONE である場合、文字定数は区切り文字で区切られず、文字は二重になりません。デフォルト値は NONE です。DELIM= 指定子は、定様式レコードの入力中に無視されますが、定様式入出力に関連付けられるファイルにのみ使用できます。

ENCODING= char_expr (Fortran 2003)ファイルのエンコード形式を指定します。char_expr は、末尾ブランクが除去された時に、値が、DEFAULT のスカラー文字式です。 ENCODING=指定子は、定様式 I/O ステートメントでのみ使用できます。省略された場合、デフォルト値は DEFAULT です。

ERR= stmt_label

エラー指定子です。これは、エラーが発生した場合に、制御の転送先と同じ有効範囲単位内にある実行可能ステートメントのステートメント・ラベルを指定します。ERR= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

FILE= char_expr

指定した装置に関連付けられるファイルの名前を指定するファイル指定子です。

char_expr は、末尾ブランクが除去された時に、値が、有効な Linux オペレーティング・システムのファイル名であるスカラー文字式です。ファイル指定子を省略した場合、必要になると、装置は、暗黙的に (デフォルトで)

fort.u に関連付けられます。ここで u は、先行ゼロを除去して指定された装置です。代替ファイル名を暗黙的に関連付けたファイルに使用できるようにするには、UNIT_VARS 実行時オプションを使用します。

注: 有効な Linux オペレーティング・システムのファイル名は、合計長さが 1023 文字以下、各ファイル名の長さが 255 文字以下の絶対パス名にする必要があります (絶対パス名を指定する必要はありませんが)。

FORM= char_expr

ファイルが定様式入出力または不定形式入出力に関連付けられているかどうか指定します。char_expr は、末尾ブランクが除去された時に、値がFORMATTED か UNFORMATTED のいずれかであるスカラー文字式です。ファイルを順次アクセス用に接続する場合、FORMATTED がデフォルトです。ファイルを直接アクセス用 またはストリーム・アクセス用 に接続する場合、UNFORMATTED がデフォルトです。

IOMSG= iomsg_variable (Fortran 2003)入出力状況指定子です。これは、入出力操作によって戻されるメッセージを指定します。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

v エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

第 11 章 ステートメントおよび属性 463

Page 490: IBM XL Fortran for Linux, V15.1

v このような条件が発生しない場合は、変数の値は変更されません。

IOSTAT= ios

入出力操作の状況のための入出力状況指定子です。ios は、スカラー整変数です。この指定子を含む入出力ステートメントが実行を終了する時、ios

は、以下の値で定義されます。

v エラー条件が発生しない場合はゼロ値

v エラーが発生した場合は正の値

NEWUNIT= var (Fortran 2008)接続の NEWUNIT 値を指定する入出力指定子。var は、スカラー・デフォルト整変数です。NEWUNIT 値は、-2 未満の負の数値で、現在接続されているどのファイルの装置番号とも一致しません。NEWUNIT= 指定子をOPEN ステートメントで指定する場合、同時に STATUS= 指定子で値SCRATCH を指定するか、FILE= 指定子を指定する必要があります。

PAD= char_expr

入力レコードをブランクで埋め込むかどうかを指定します。char_expr は、YES または NO として評価されるスカラー文字式です。値が YES の場合、入力リストが指定されて、形式仕様が、レコードに含まれるより多くのデータをレコードから必要とすると、定様式入力レコードはブランクで埋め込まれます。 NO が指定される場合、入力リストおよび形式仕様に、レコードから、レコードが含むよりも多くの文字を必要としないようにしてください。デフォルト値は YES です。 PAD= 指定子は、定様式レコードの出力中に無視されますが、定様式入出力に関連付けられるファイルにのみ使用できます。

-qxlf77 コンパイラー・オプションで、noblankpad サブオプションを指定し、ファイルが定様式の直接入出力に関連付けられている場合、PAD= 指定子が省略されると、デフォルト値は NO になります。

POSITION= char_expr

順次アクセスまたはストリーム・アクセスに関連付けられたファイルのファイル位置を指定します。以前に存在しないファイルは、初期点に置かれます。char_expr は、末尾ブランクが除去された時に、値が ASIS、REWINDまたは APPEND のいずれかであるスカラー文字式です。REWIND はファイルを初期点に置きます。APPEND は、ファイル終了レコードの前か、ファイル終了レコードがない場合は、終端点にファイルを置きます。ASISは、位置を変更しないでそのままにします。以下の条件下を除いて、デフォルト値は ASIS になります。

v OPEN ステートメントの後に装置を参照する最初の入出力ステートメント (INQUIRE ステートメント以外) が、WRITE ステートメントで、かつ以下のような場合。

– STATUS= 指定子で UNKNOWN を、-qposition コンパイラー・オプションで appendunknown を指定

– STATUS= 指定子で OLD を -qposition コンパイラー・オプションでappendold を指定

このような場合、POSITION= 指定子のデフォルト値は、WRITE ステートメントの実行時に、APPEND になります。

464 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 491: IBM XL Fortran for Linux, V15.1

RECL= integer_expr

直接アクセスに関連付けられたファイル内の各レコードの長さ、または順次アクセスに関連付けられたファイル内のレコードの最大長を指定します。integer_expr は、値を正にする必要がある整数式です。この指定子は、ファイルが直接アクセスに関連付けられる場合に、指定されている必要があります。定様式入出力の場合、その長さは、文字データを含むすべてのレコードの文字数になります。不定形式入出力の場合、その長さは、データの内部形式に必要なバイト数になります。不定様式順次レコードの長さは、データを囲む 4 バイトのフィールドを数えません。

ランダムにアクセスできないファイルに接続された装置の場合、デフォルトの長さは 2**15 (32,768) です。

RECL= を省略した場合、ファイルが順次アクセスに関連付けられていると、長さは、2**63-1 からレコード終止符を引いたものになります。定様式順次ファイルの場合、デフォルトのレコード長は 2**63-2 です。不定形式ファイルについては、UWIDTH 実行時オプションが 64 に設定されている場合、デフォルトのレコード長は 2**63-17 です。

ROUND= char_expr (Fortran 2003)

定様式入出力の入出力丸めモードの現行値を示します。ROUND= は、他のステートメントによって変更できます。省略された場合、プロセッサーによって丸めモードを選択できます。char_expr は、UP、DOWN、ZERO、NEAREST、COMPATIBLE または PROCESSOR_DEFINED のいずれかとして評価されます。

丸めモード・ヘルプによって、定様式入出力中に 10 進数を文字表記から内部表記 (すなわち、2 進数) に変換する方法、またはその逆にする方法を指定します。丸めモードには、以下の関数があります。

v UP 丸めモードでは、変換による値は、元の値以上の最小値になります。

v DOWN 丸めモードでは、変換による値は、元の値以下の最大値になります。

v ZERO 丸めモードでは、変換による値は、元の値に最も近く、絶対値ではより大きくない値になります。

v NEAREST 丸めモードでは、変換による値は、表記可能な、最も隣接した 2 つの値のより近い方になります。両方の値が同じように近い場合、偶数値が選択されます。IEEE 丸め変換で、NEAREST は、IEEE 標準で指定される ieee_nearest 丸めモードに相当します。

v COMPATIBLE 丸めモードでは、変換による値は、表記可能な、最も隣接した 2 つの値の内、最も近い値か、中間である場合はよりゼロから離れた値になります。

v PROCESSOR_DEFINED 丸めモードでは、変換による値は、プロセッサー従属となり、他のモードに対応することがあります。XL Fortran では、PROCESSOR_DEFINED 丸めモードは、浮動小数点制御レジスター

第 11 章 ステートメントおよび属性 465

Page 492: IBM XL Fortran for Linux, V15.1

で選択する丸めモードとなります。浮動小数点制御レジスターを明示的に設定していない場合、デフォルトの丸めモードは NEAREST です。

SIGN= char_expr (Fortran 2003)定様式入出力の関連付けに効力のある符号モードを示します。 char_expr

に、値 PLUS が割り当てられている場合、プロセッサーは、通常オプションの正符号が含まれているすべての位置に、正符号を出し、char_expr に、値 SUPPRESS が割り当てられている場合は、これらの位置で正符号を抑制します。char_expr には、値 PROCESSOR_DEFINED を割り当てることもできます。これは、デフォルトの符号モードで、SUPPRESS と同じ働きをします。関連付けがない場合、あるいは、定様式入出力の関連付けではない場合、char_expr には、値 UNDEFINED を割り当てます。符号モードは、シングルデータ転送ステートメントで、一時的に変更できます。ステートメントが終了すると、符号モードは、前の値を再び取り戻します。

STATUS= char_expr

ファイルが開かれた時のファイルの状況を指定します。char_expr は、末尾ブランクが除去された時に、値が、以下のいずれかであるスカラー文字式です。

v OLD。既存ファイルを装置に関連付けします。OLD を指定する場合、そのファイルが存在している必要があります。ファイルが存在しない場合、エラー状態が生じます。

v NEW。新規ファイルの作成、そのファイルの装置への関連付け、および状況を OLD に変更します。NEW を指定する場合、そのファイルを存在させないでください。ファイルが既に存在する場合、エラー状態が生じます。

v SCRATCH。関連付けが解除される時に削除される新規ファイルを作成および関連付けします。SCRATCH は、名前付きファイルで指定しないでください (すなわち、FILE=char_expr を省略してください)。

v REPLACE。ファイルが存在しないファイル場合、ファイルが作成され、状況は OLD に変更されます。ファイルが存在する場合、そのファイルが削除され、新規ファイルが同じ名前で作成され、状況は OLD に変更されます。

v UNKNOWN。既存ファイルを関連付けするか、新規ファイルを作成して関連付けします。ファイルが存在する場合、ファイルは、OLD として関連付けられます。ファイルが存在しない場合、ファイルは NEW として関連付けられます。

UNKNOWN がデフォルトです。

規則

装置が存在するファイルに関連付けられた場合、装置に対して OPEN ステートメントを実行できます。FILE= 指定子が OPEN ステートメントに入っていない場合、装置に関連付けられようとしているファイルは、装置が関連付けられているファイルと同じです。

F2008 NEWUNIT= 指定子を含む OPEN ステートメントが正常に実行されると、NEWUNIT= で指定された変数に、新しい NEWUNIT の値が代入されます。しか

466 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 493: IBM XL Fortran for Linux, V15.1

し、OPEN ステートメントの実行中にエラーが発生すると、NEWUNIT= で指定された変数は、元の値のままになります。 F2008

装置に関連付けられようとしているファイルが、装置が関連付けられているファイルと同じでない場合、結果は、CLOSE ステートメントで OPEN ステートメントの実行のすぐ前の装置に対して、STATUS= 指定子を指定しないで実行したようになります。

装置に関連付けられようとしているファイルが、装置が関連付けられているファイルと同じ場合、BLANK=、DELIM=、PAD=、ERR=、および IOSTAT= 指定子のみが、現在効力がある値と異なる値を持つことができます。OPEN ステートメントの実行により、BLANK=、DELIM= または PAD= 指定子の新規値が有効になりますが、指定されていない指定子またはファイルの位置において何の変更も起きません。以前に実行された OPEN ステートメントの ERR= および IOSTAT= 指定子は、現在の OPEN ステートメントに対して何の影響も及ぼしません。STATUS= 指定子を指定する場合、その値は OLD にする必要があります。装置に現在関連付けられているファイルと同じファイルを指定するために、同じファイル名を指定するか、FILE= 指定子を省略するか、記号により同じファイルにリンクされているファイルを指定することができます。

ファイルが装置に関連付けられている場合、そのファイルと別の装置に対してOPEN ステートメントを実行できません。

STATUS= 指定子の値が、OLD、NEW または REPLACE の場合、FILE=指定子はオプションです。

BLANK=、DELIM= および PAD= 指定子の値を変更することはできますが、事前に関連付けたファイル、標準エラー・デバイス以外のファイルに関連付けるのに、装置 0 を指定することはできません。

ERR= および IOSTAT= 指定子が設定され、エラーが検出された場合、ERR= 指定子によって指定されたステートメントに転送され、正整数値が ios に割り当てられます。

IOSTAT= および ERR= が指定されない場合、以下のようになります。v 重大エラーが検出された場合、プログラムは停止します。v リカバリー可能エラーが検出され、ERR_RECOVERY 実行時オプションが YESに設定されている場合は、プログラムは継続されて次のステートメントに進みます。オプションが NO に設定されている場合は、プログラムは停止します。

F2008

例 1: ファイル「hello」に「hello world」と書き込みます。

INTEGER unit_numberOPEN(newunit = unit_number, file = 'hello')WRITE(unit_number, *) 'hello world'CLOSE(unit_number)

F2008

第 11 章 ステートメントおよび属性 467

Page 494: IBM XL Fortran for Linux, V15.1

例 2:

! Open a new file with name fname

CHARACTER*20 FNAMEFNAME = 'INPUT.DAT'OPEN(UNIT=8,FILE=FNAME,STATUS='NEW',FORM='FORMATTED')

OPEN (4,FILE="myfile")OPEN (4,FILE="myfile", PAD="NO") ! Changing PAD= value to NO

! Connects unit 2 to a tape device for unformatted, sequential! write-only access:

OPEN (2, FILE="/dev/rmt0",ACTION="WRITE",POSITION="REWIND", && FORM="UNFORMATTED",ACCESS="SEQUENTIAL",RECL=32767)

関連情報v 245ページの『装置』

v 1113ページの『標準間の互換性』 に記載される項目 3

v 241ページの『第 9 章 XL Fortran の入出力』

v 「XL Fortran コンパイラー・リファレンス」に記載される『実行時オプションの設定』

v 「XL Fortran コンパイラー・リファレンス」の『XLFRTEOPTS 環境変数』

v 「XL Fortran コンパイラー・リファレンス」の『-qposition オプション』

v 「XL Fortran コンパイラー・リファレンス」の『-qxlf77 オプション』

v 347ページの『CLOSE』

v 488ページの『READ』

v 547ページの『WRITE』

OPTIONAL目的

OPTIONAL 属性によって、プロシージャーへの参照内の実引数と仮引数を関連付ける必要がないことを指定します。

構文

規則

オプションの仮引数を持つプロシージャーには、プロシージャーが参照される有効範囲内に明示的インターフェースが必要です。

�� OPTIONAL dummy_arg_name_list::

��

468 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 495: IBM XL Fortran for Linux, V15.1

PRESENT 組み込み関数を使用して、実引数が、オプションの仮引数と関連付けられているかどうかを判別します。仮引数があるということを最初に確認せずに、オプションの仮引数を参照しないでください。

セクション 223ページの『指定されていないオプションの仮引数に関する制約事項』で説明するルールに従って、サブプログラム内に仮引数が存在すると見なされます。

指定されないオプションの仮引数は、オプションの仮引数に対応する実引数として使用することができます。これも、実引数と関連付けられないとみなされます。指定されないオプションの仮引数は、 223ページの『指定されていないオプションの仮引数に関する制約事項』

に指定された制限に従属します。

定義済み演算子または定義済み代入に明示的インターフェースを指定する、インターフェース本体内の仮引数には、OPTIONAL 属性を指定できません。

表 45. OPTIONAL 属性と互換性のある属性

ALLOCATABLE �1� EXTERNAL TARGET

ASYNCHRONOUS INTENT VALUE �1�

CONTIGUOUS �2� POINTER VOLATILE

DIMENSION

注:�1� Fortran 2003

�2� Fortran 2008

注:

1. Fortran 2008

例SUBROUTINE SUB (X,Y)

INTERFACESUBROUTINE SUB2 (A,B)

OPTIONAL :: BEND SUBROUTINE

END INTERFACEOPTIONAL :: YIF (PRESENT(Y)) THEN ! Reference to Y conditional

X = X + Y ! on its presenceENDIFCALL SUB2(X,Y)

END SUBROUTINE

SUBROUTINE SUB2 (A,B)OPTIONAL :: B ! B and Y are argument associated,IF (PRESENT(B)) THEN ! even if Y is not present, in

B = B * A ! which case, B is also not presentPRINT*, B

ELSEA = A**2PRINT*, A

ENDIFEND SUBROUTINE

第 11 章 ステートメントおよび属性 469

Page 496: IBM XL Fortran for Linux, V15.1

関連情報v 223ページの『オプションの仮引数』

v 183ページの『インターフェースの概念』

v 742ページの『PRESENT(A)』

v 218ページの『仮引数』

PARAMETER目的

PARAMETER 属性によって、定数の名前を指定できます。

構文

constant_expr

定数式

規則

名前付き定数は、同じ有効範囲単位内の前の仕様ステートメントに指定された、型、形状、パラメーターを持つか、暗黙的に宣言される必要があります。名前付き定数が暗黙的に型が決定されている場合、後続の型宣言ステートメントまたは属性仕様ステートメント内にそれが現れた時に、暗黙の型およびパラメーター値を確認する必要があります。

有効範囲単位内で PARAMETER 属性を使用して、constant_name を 1 回のみ定義できます。

定数式で指定されている名前付き定数は、前に定義されている (前のステートメント内でない場合、ことによると同じ PARAMETER または型宣言ステートメント内で) か、使用関連付けまたはホスト関連付けを介してアクセス可能になっている必要があります。

定数式は、組み込み代入の規則を使用して、名前付き定数に代入されます。名前付き定数が文字型から成っていて、長さが継承されている場合、定数式の長さが取られます。

表 46. PARAMETER 属性と互換性のある属性

DIMENSION PRIVATE PUBLIC

�� �

,

PARAMETER ( constant_name = constant_expr ) ��

470 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 497: IBM XL Fortran for Linux, V15.1

例REAL, PARAMETER :: TWO=2.0

COMPLEX XCONSTREAL RPART,IPARTPARAMETER (RPART=1.1,IPART=2.2)PARAMETER (XCONST = (RPART,IPART+3.3))

CHARACTER*2, PARAMETER :: BB=' '...

END

関連情報v 114ページの『定数式』

v 21ページの『データ・オブジェクト』

PAUSE目的

PAUSE ステートメントは、プログラムの実行を一時的に中断し、キーワードPAUSE と、指定されていれば、文字定数か数字ストリングが装置 0 に出力されます。

構文

char_constant

ホレリス定数ではないスカラー文字定数です。

digit_string

1 桁から 5 桁のストリングです。

規則

PAUSE ステートメントの実行後、Enter キーを押すと処理が続行されます。装置 5 が端末に関連付けられていない場合、PAUSE ステートメントは実行を中断しません。

PAUSE ステートメントは、Fortran 95 で削除されました。

例PAUSE 'Ensure backup tape is in tape drive'PAUSE 10 ! Output: PAUSE 10

関連情報v 1117ページの『削除されたフィーチャー』

�� PAUSEchar_constantdigit_string

��

第 11 章 ステートメントおよび属性 471

Page 498: IBM XL Fortran for Linux, V15.1

POINTER (Fortran 90)目的

POINTER 属性によって、オブジェクトをポインター変数として指定します。

ポインター という用語は、Fortran 90 POINTER 属性を持つオブジェクトを参照します。整数 POINTER ステートメントは、XL Fortran の前のバージョンでPOINTER ステートメントとして文書化されたものに関して詳細を提供します。これらのポインターは、現在、整数ポインター として参照されます。

構文

deferred_shape_spec

コロン (:) です。各コロンは次元を表します。

規則

object_name はデータ・オブジェクトまたは関数結果を参照します。object_name

が、有効範囲単位内のどこかで DIMENSION 属性を使用して宣言された場合、配列仕様は、deferred_shape_spec_list にする必要があります。

object_name は、整数 POINTER、NAMELIST または EQUIVALENCE ステートメントに指定しないでください。object_name が派生型定義のコンポーネントの場合、型で宣言されたいずれの変数も、EQUIVALENCE または NAMELIST ステートメントで指定できません。

ポインター変数は、共通ブロック単位およびブロック・データ・プログラム単位に指定できます。

Fortran 90 ポインターがスレッド固有であることを確かにするには、ポインターに SAVE または STATIC 属性を指定しないでください。これらの属性は、ユーザーによって明示的に指定されるか、-qsave コンパイラー・オプションを使用して暗黙的に指定されます。ただし、非静的ポインターが、ターゲットが静的であるポインター代入ステートメント内で使用される場合、ポインターを参照するすべてが、実際、静的な共有ターゲットを参照します。

POINTER 属性を持つコンポーネントを含むオブジェクトは、データ転送ステートメントに指定できませんが、そのオブジェクト自体が、TARGET、INTENT、または ALLOCATABLE 属性を持つことができます。

TS 29113 POINTER 属性は、想定ランク・エンティティーに対して指定できます。TS 29113

�� POINTER::

,

object_name( deferred_shape_spec_list )

��

472 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 499: IBM XL Fortran for Linux, V15.1

表 47. POINTER 属性と互換性のある属性

AUTOMATIC �3� INTENT PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

CONTIGUOUS �2� PRIVATE STATIC �3�

DIMENSION PROTECTED �1� VOLATILE

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張

これらの属性は、ポインター自体に対してのみ適用され、関連ターゲットには適用されません。例外は、DIMENSION 属性で、これは関連ターゲットに適用されます。

例 1:

INTEGER, POINTER :: PTR(:)INTEGER, TARGET :: TARG(5)PTR => TARG ! PTR is associated with TARG and is

! assigned an array specification of (5)

PTR(1) = 5 ! TARG(1) has value of 5PRINT *, FUNC()CONTAINS

REAL FUNCTION FUNC()POINTER :: FUNC ! Function result is a pointer

.

.

.END FUNCTION

END

例 2: Fortran 90 ポインターおよびスレッド・セーフ

FUNCTION MYFUNC(ARG) ! MYPTR is thread-specific.INTEGER, POINTER :: MYPTR ! every thread that invokes

! 'MYFUNC' will allocate aALLOCATE(MYPTR) ! new piece of storage thatMYPTR = ARG ! is only accessible within

! that thread.ANYVAR = MYPTREND FUNCTION

関連情報v 144ページの『データ・ポインターの代入』

v 520ページの『TARGET』

v 637ページの『ALLOCATED(X)』

v 367ページの『DEALLOCATE』

v 178ページの『ポインター関連付け』

第 11 章 ステートメントおよび属性 473

Page 500: IBM XL Fortran for Linux, V15.1

v 91ページの『据え置き形状配列』

v 940ページの『プロシージャーの相互運用性』

POINTER (integer) (IBM 拡張)目的

整数 POINTER ステートメントによって、変数 int_pointer の値を、ポインティング先 への参照用アドレスとして使用することを指定します。

Fortran 90 POINTER ステートメントと区別するために、このステートメントの名前は、POINTER から整数 POINTER に変更されました。

構文

int_pointer

整数ポインター変数の名前です。

pointee 変数名または配列宣言子です。

規則

コンパイラーは、ポインティング先にストレージを割り振りません。ストレージは、ポインターへのストレージのブロックのアドレスの割り当てによって、実行時にポインティング先と関連付けられます。ポインティング先は、静的ストレージまたは動的ストレージのいずれかと関連付けることができます。ポインティング先の参照には、関連付けられるポインターが定義されていることが必要です。

整数ポインターは、型を明示的に代入することができない 、および のINTEGER(8) 型のスカラー変数です。整数ポインターと同じ型の変数が使用できる式またはステートメントで、整数ポインターを使用できます。ポインティング先には、すべてのデータ型を代入することができます。ただし、ポインティング先への記憶クラスまたは初期値は代入することができません。

整数 POINTER ステートメントにポインティング先として指定される実配列を、ポインティング先配列と呼びます。型宣言ステートメント、DIMENSION ステートメント、または整数 POINTER ステートメントそれ自体に、ポインティング先配列の次元を指定できます。

-qddim コンパイラー・オプションを指定した場合、メインプログラムに現れるポインティング先配列は、調整可能な配列仕様を持つこともできます。メインプログラムとサブプログラムで、次元サイズは、ポインティング先が参照される際に評価されます (動的次元設定)。

�� �

,

POINTER ( int_pointer , pointee ) ��

474 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 501: IBM XL Fortran for Linux, V15.1

-qddim コンパイラー・オプションを指定しない場合、サブプログラムに現れるポインティング先配列は、調整可能な配列仕様を持つことができ、次元サイズは、ポインティング先が評価される時ではなく、サブプログラムへの入口で評価されます。

以下の制約が、ポインティング先と整数ポインターの定義と使用に適用されます。

v ポインティング先は、サイズをゼロにできません。

v ポインティング先は、スカラー、想定済みサイズ配列、または明示的形状配列にできます。

v ポインティング先は、COMMON、DATA、NAMELIST、またはEQUIVALENCE ステートメントには指定できません。

v ポインティング先は、以下の属性を持つことができません。EXTERNAL、ALLOCATABLE、POINTER、TARGET、INTRINSIC、INTENT、OPTIONAL、SAVE、STATIC、AUTOMATIC、または PARAMETER。

v ポインティング先は、仮引数にすることはできません。そのため、FUNCTION、SUBROUTINE、または ENTRY ステートメントに指定することはできません。

v ポインティング先は、定数以外の範囲または長さを持つことはできますが、自動オブジェクトにすることはできません。

v ポインティング先は、一般インターフェース・ブロック名にすることはできません。

v 派生型から成っているポインティング先は、順序派生型にする必要があります。

v 関数値は、ポインティング先にすることはできません。

v 整数ポインターは、別のポインターによって指示することはできません。(ポインターは、ポインティング先にすることはできません。)

v 整数ポインターは、以下の属性を持つことはできません。

– ALLOCATABLE

– DIMENSION

– EXTERNAL

– INTRINSIC

– PARAMETER

– POINTER

– TARGET

v 整数ポインターを、NAMELIST グループ名として指定できません。

v 整数ポインターを、プロシージャーにすることはできません。

例INTEGER A,BPOINTER (P,I)IF (A<>0) THEN

P=LOC(A)ELSE

P=LOC(B)ENDIFI=0 ! Assigns 0 to either A or B, depending on A's valueEND

第 11 章 ステートメントおよび属性 475

Page 502: IBM XL Fortran for Linux, V15.1

関連情報v 180ページの『整数ポインター関連付け (IBM 拡張)』

v 709ページの『LOC(X) (IBM 拡張)』

v 「XL Fortran コンパイラー・リファレンス」の『-qddim オプション』

PRINT目的

PRINT ステートメントは、データ転送出力ステートメントです。

構文

name 名前リストのグループ名です。

output_item

出力リスト項目です。出力リストは、転送されるデータを指定します。出力リスト項目は、以下のとおりです。

v 変数。配列は、そのエレメントのすべてがストレージに配置されている順序で指定されたように処理されます。

ポインターを、ターゲットと関連付けて、割り振り可能オブジェクトを割り振る必要があります。派生型オブジェクトは、このステートメントにアクセス不能な最終コンポーネントを持つことができません。 output_item

の評価の結果は、ポインターを含む派生型オブジェクトにはできません。定形式ステートメント内の構造体の構造体コンポーネントは、派生型定義で指定された順序で処理されます。不定形式ステートメントでは、構造体コンポーネントは、内部表記 (埋め込みを含む) 内の単一値として処理されます。

v 式。

v 477ページの『暗黙 DO リスト』で説明している、暗黙 DO リスト。

プロシージャー・ポインターである値を持てない output_item である式。

format 出力操作で使用される形式を指定する形式指定子です。format は、以下のような形式識別子です。v FORMAT ステートメントのステートメント・ラベルです。FORMAT ステートメントは、同じ有効範囲単位に置く必要があります。

v FORMAT ステートメントのステートメント・ラベルを代入した、スカラー INTEGER(4) または INTEGER(8) の変数の名前です。FORMAT ステートメントは、同じ有効範囲単位に置く必要があります。

Fortran 95 は、ステートメント・ラベルの代入ができません。

�� PRINT nameformat

, output_item_list

��

476 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 503: IBM XL Fortran for Linux, V15.1

v 文字定数です。ホレリス定数にすることはできません。左括弧で始まり、右括弧で終わるようにする必要があります。括弧の間に使用できるのは、FORMAT ステートメント内で説明されている形式コードのみです。ブランク文字は、左括弧の前、または右括弧の後に置くことができます。

v 左端の文字位置が有効な形式を構成している文字データを含む文字変数です。有効な形式は、左括弧で始まり、右括弧で終わります。括弧の間に使用できるのは、 417ページの『FORMAT』にリストされている形式コードのみです。ブランク文字は、左括弧の前、または右括弧の後に置くことができます。

v 非文字組み込み型の配列です。v 文字式です。オペランドが定数の名前でないかぎり、継承された長さを指定するオペランドの連結を含んだ文字式は除きます。

v リスト指示形式設定で指定するアスタリスクです。v 前に定義された名前リストを指定する名前リスト指定子です。

-qport=typestmt コンパイラー・オプションを指定すると、機能が PRINT ステートメントに似ている TYPE ステートメントを使用できるようになります。

例PRINT 10, A,B,C

10 FORMAT (E4.2,G3.2E1,B3)

関連情報v 241ページの『第 9 章 XL Fortran の入出力』

v 267ページの『第 10 章 入出力の形式設定』

v -qport=typestmt について詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

v 1117ページの『削除されたフィーチャー』

暗黙 DO リスト

do_object

出力リスト項目です。

do_variable

型整数または実数の名前付きスカラー変数です。

arith_expr1、arith_expr2、および arith_expr3

スカラー数式です。

暗黙 DO リストの範囲は、リスト do_object_list です。DO 変数の反復カウントおよび値は、DO ステートメントの場合と同様に、arith_expr1、arith_expr2、および

�� ( do_object_list , do_variable = arith_expr1, arith_expr2 �

� ), arith_expr3

��

第 11 章 ステートメントおよび属性 477

Page 504: IBM XL Fortran for Linux, V15.1

arith_expr3 から設定されます。暗黙 DO リストが実行される際、DO 変数の出現に対する適切な代替値で、do_object_list 内の項目が、暗黙 DO リストの反復のたびに1 回指定されます。

PRIVATE目的

PRIVATE 属性によって、使用関連付けを介して、モジュール・エンティティーが、モジュールの外側にアクセスできないことを指定します。

構文

access_id

一般仕様、あるいは、変数、プロシージャー、派生型、定数、または名前リストのグループの名前です。

規則

PRIVATE 属性は、モジュールの有効範囲内にのみ現れることができます。

モジュールには、複数の PRIVATE ステートメントを指定できますが、組み込むことができるのは、access_id_list を省略する 1 つのステートメントのみです。access_id_list を指定しない PRIVATE ステートメントは、モジュール内の潜在的にアクセス可能なすべてのエンティティーに対して、デフォルトのアクセス可能性をプライベートに設定します。モジュールにこのようなステートメントが含まれている場合、access_id_list を指定しない PUBLIC ステートメントを含めないでください。モジュールに、access_id_list を指定しない PRIVATE ステートメントが含まれていない場合は、デフォルトのアクセス可能性はパブリックになります。アクセス可能性が明示的に指定されていないエンティティーは、デフォルトのアクセス可能性を持ちます。

パブリックである一般識別子を持つプロシージャーは、固有の識別子がプライベートだとしても、一般識別子によってアクセス可能です。モジュール・プロシージャーに、型がプライベート・アクセス可能性を持つプライベート仮引数か、関数結果が含まれている場合、そのモジュール・プロシージャーは、プライベートなアクセス可能性を持つように宣言される必要があり、パブリックなアクセス可能性を持つ一般識別子を持たないようにする必要があります。派生型のアクセス可能性は、コンポーネントまたはプロシージャーのアクセス可能性に影響を与えることもないし、影響を受けることもありません。

名前リストのグループは、プライベートであるオブジェクトか、プライベート・コンポーネントを含んでいる場合、プライベートにする必要があります。サブプログラムは、その引数のいずれかが、プライベートである派生型のものである場合、プ

�� PRIVATEaccess_id_list

::

��

478 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 505: IBM XL Fortran for Linux, V15.1

ライベートにする必要があります。関数は、その結果変数が、プライベートである派生型から成っている場合、プライベートにする必要があります。

表 48. PRIVATE 属性と互換性のある属性

ALLOCATABLE �1� INTRINSIC SAVE

ASYNCHRONOUS PARAMETER STATIC �3�

CONTIGUOUS �2� POINTER TARGET

DIMENSION PROTECTED �1� VOLATILE

EXTERNAL

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張

例MODULE MC

PUBLIC ! Default accessibility declared as publicINTERFACE GEN

MODULE PROCEDURE SUB1, SUB2END INTERFACEPRIVATE SUB1 ! SUB1 declared as privateCONTAINS

SUBROUTINE SUB1(I)INTEGER II = I + 1

END SUBROUTINE SUB1SUBROUTINE SUB2(I,J)

I = I + JEND SUBROUTINE

END MODULE MC

PROGRAM ABCUSE MCK = 5CALL GEN(K) ! SUB1 referenced because GEN has public

! accessibility and appropriate argument! is passed

CALL SUB2(K,4)PRINT *, K ! Value printed is 10

END PROGRAM

関連情報v 55ページの『第 4 章 派生型』

v 199ページの『モジュール』

v 485ページの『PROTECTED (Fortran 2003)』

v 486ページの『PUBLIC』

PROCEDURE目的

汎用インターフェース内に出現する PROCEDURE ステートメントは、指定されたプロシージャーをその汎用インターフェースに追加します。

第 11 章 ステートメントおよび属性 479

Page 506: IBM XL Fortran for Linux, V15.1

構文

規則

MODULE PROCEDURE ステートメントは、一般仕様を持つインターフェース・ブロック内のインターフェース本体の中のどこにでも指定できます。

PROCEDURE ステートメントは、一般仕様を持つインターフェース・ブロック内にのみ指定できます。

MODULE が指定されていない場合、procedure_name_list は、明示的インターフェースを持つアクセス可能なプロシージャー・ポインター、外部プロシージャー、ダミー・プロシージャー、またはモジュール・プロシージャーを参照する必要があります。MODULE が PROCEDURE に対して指定されている場合、procedure_name_list は、現在の範囲内でアクセス可能なモジュール・プロシージャーを参照する必要があります。

procedure_name には、同じ一般識別子を持つアクセス可能なインターフェースにある PROCEDURE ステートメント内で前に指定されたプロシージャーを指定しないでください。

次の例では、汎用インターフェース内で PROCEDURE ステートメントを宣言して使用する方法を示しています。:

MODULE mCONTAINSSUBROUTINE s1(iarg)

iarg=1PRINT *, "In s1"

END SUBROUTINESUBROUTINE s2(rarg)

rarg=1.1END SUBROUTINE

END MODULE

USE mINTERFACE ss

SUBROUTINE ss1(iarg,jarg)END SUBROUTINEMODULE PROCEDURE s1, s2

END INTERFACECALL ss(n) ! Calls subroutine s1 from m

�� PROCEDUREMODULE (1)

::

procedure_name_list ��

注:

1 Fortran 2008

480 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 507: IBM XL Fortran for Linux, V15.1

CALL ss(i,j) ! Calls subroutine ss1ENDSUBROUTINE SS1(iarg,jarg)

PRINT *, "In ss1"END SUBROUTINE ss1

関連情報v 185ページの『インターフェース・ブロック』

v 448ページの『INTERFACE』

v 199ページの『モジュール』

PROCEDURE 宣言 (Fortran 2003)目的

PROCEDURE 宣言ステートメントによって、ダミー・プロシージャー、外部プロシージャー、またはプロシージャー・ポインターを宣言します。これらのエンティティーに EXTERNAL 属性を指定します。

構文

procedure_interface

宣言型仕様または明示的インターフェースを持つプロシージャーの名前です。

procedure_attribute_list

以下のリストからの属性のリストです。

v BIND

v INTENT(intent_spec)

v OPTIONAL

v POINTER

v PRIVATE

v PUBLIC

v SAVE

procedure_entity_name

宣言されるプロシージャーまたはプロシージャー・ポインターの名前です。

null_init

NULL 組み込み関数への参照です。

�� PROCEDURE ( )procedure_interface ::

, procedure_attribute_list ::

� procedure_entity_name=> null_init

��

第 11 章 ステートメントおよび属性 481

Page 508: IBM XL Fortran for Linux, V15.1

規則

procedure_interface が、明示的インターフェースを持つプロシージャーかプロシージャー・ポインターの名前の場合、宣言済みプロシージャーまたはプロシージャー・ポインターは、明示的インターフェースを持ちます。procedure_interface は既に宣言されている必要があります。procedure_interface の名前は、組み込み型を指定するキーワードと同じにすることはできません。procedure_interface は、組み込みプロシージャーが実引数として渡されるかぎり、組み込みプロシージャーにすることができます。procedure_interface が、エレメント型プロシージャーの場合、プロシージャー・エンティティー名は、外部プロシージャーから構成されている必要があります。

procedure_interface が宣言型仕様の場合、宣言されるプロシージャーまたはプロシージャー・ポインターは、暗黙的インターフェースおよび指定した結果型を持つ関数です。これらの関数が外部関数である場合、関数定義は、同じ結果型と型パラメーターを指定する必要があります。

procedure_interface が指定されない場合、PROCEDURE 宣言ステートメントは、宣言されるプロシージャーまたはプロシージャー・ポインターが、サブルーチンか関数であることを指定します。それらが関数の場合、暗黙の型の規則が関数の型に適用されます。

BIND 属性を使用してプロシージャー型言語結合を指定する場合、procedure_interface は、プロシージャー型言語結合で宣言されたプロシージャーかプロシージャー・ポインターの名前にする必要があります。

NAME= を持つプロシージャー型言語結合を指定する場合、プロシージャー・エンティティー名は 1 つのプロシージャー・エンティティー名のみで構成されている必要があります。このプロシージャーを、ダミー・ポインターにしないでください。また、POINTER 属性を持たせないでください。

OPTIONAL を指定する場合、宣言されるプロシージャーやプロシージャー・ポインターを、ダミー・プロシージャーまたはプロシージャー・ポインターにする必要があります。

ステートメントが、モジュールの仕様部分にある場合、指定できるのは PUBLIC または PRIVATE のみです。

INTENT、SAVE、または null_init が指定される場合、宣言されるエンティティーは、POINTER 属性を持つ必要があります。

null_init が指定される場合、対応するプロシージャー・ポインターの初期関連付け状況が関連付け解除されることを示します。これは、また SAVE 属性をも意味します。これは、プロシージャー宣言ステートメント内の SAVE 属性を明示的に使用して、あるいは SAVE ステートメントによって再び確約できます。

プロシージャー・ポインター宣言の場合、POINTER 属性を指定する必要があります。

482 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 509: IBM XL Fortran for Linux, V15.1

例 1

以下の例は、外部プロシージャー宣言を示しています。

CONTAINSSUBROUTINE XXX(PSI)

PROCEDURE (REAL) :: PSIREAL Y1Y1 = PSI()

END SUBROUTINEEND

例 2

以下の例は、プロシージャー・ポインター宣言とその使用を示しています。

PROGRAM PROC_PTR_EXAMPLEREAL :: R1INTEGER :: I1INTERFACE

SUBROUTINE SUB(X)REAL, INTENT(IN) :: X

END SUBROUTINE SUBFUNCTION REAL_FUNC(Y)

REAL, INTENT(IN) :: YREAL, REAL_FUNC

END FUNCTION REAL_FUNCEND INTERFACE! with explicit interfacePROCEDURE(SUB), POINTER :: PTR_TO_SUB! with explicit interfacePROCEDURE(REAL_FUNC), POINTER :: PTR_TO_REAL_FUNC => NULL()! with implicit interfacePROCEDURE(INTEGER), POINTER :: PTR_TO_INTPTR_TO_SUB => SUBPTR_TO_REAL_FUNC => REAL_FUNCCALL PTR_TO_SUB(1.0)R1 = PTR_TO_REAL_FUNC(2.0)I1 = PTR_TO_INT(M, N)

END PROGRAM PROC_PTR_EXAMPLE

関連情報v 331ページの『BIND (Fortran 2003)』

v 623ページの『第 14 章 組み込みプロシージャー』

v 789ページの『第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張)』

v 181ページの『プログラム単位、プロシージャー、およびサブプログラム』

v 216ページの『組み込みプロシージャー』

v 448ページの『INTERFACE』

v 147ページの『プロシージャー・ポインターの代入 (Fortran 2003)』

第 11 章 ステートメントおよび属性 483

Page 510: IBM XL Fortran for Linux, V15.1

PROGRAM目的

PROGRAM ステートメントによって、1 つのプログラム単位がメインプログラムであり、それが、実行時に実行可能プログラムが呼び出された時に、システムから制御を受け取るプログラム単位であることを指定します。

構文

name このステートメントが指定されているメインプログラムの名前です。

規則

PROGRAM ステートメントはオプションです。

指定する場合、その PROGRAM ステートメントが、メインプログラムの最初のステートメントになるようにしてください。

対応する END ステートメントにプログラム名を指定する場合、name に一致させる必要があります。

プログラム名は、実行可能プログラムに対して包括的です。この名前は、実行可能プログラム内の共通ブロック、外部プロシージャー、または他のプログラム単位、あるいはメインプログラムにローカルないずれかの名前と同じにしないでください。

名前には型がないので、型宣言または仕様ステートメントには指定しないでください。サブプログラムまたはメインプログラム自身からメインプログラムを参照できません。

例PROGRAM DISPLAY_NUMBER_2

INTEGER AA = 2PRINT *, A

END PROGRAM DISPLAY_NUMBER_2

関連情報v 387ページの『END』

v 198ページの『メインプログラム』

�� PROGRAM name ��

484 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 511: IBM XL Fortran for Linux, V15.1

PROTECTED (Fortran 2003)目的

PROTECTED 属性によって、モジュール・エンティティーの変更を、より大きく制御できます。同じモジュールが、プロシージャーとエンティティーの両方を定義する場合、モジュール・プロシージャーは、保護されたモジュール・エンティティーまたはそのサブオブジェクトの変更のみ可能です。

構文

PROTECTED 属性は、モジュールの仕様部分にのみ指定する必要があります。

エンティティー (entity)

共通ブロック内にない名前付き変数です。

規則

EQUIVALENCE ステートメントによって宣言されたオブジェクトに、PROTECTED 属性を持たせるように指定した場合、EQUIVALENCE ステートメントで指定されたすべてのオブジェクトが PROTECTED 属性を持つようにする必要があります。

使用関連付けを介してアクセスされる PROTECTED 属性を持つ非ポインター・オブジェクトは、定義できません。

PROTECTED 属性を 整数ポインターに指定しないでください。

使用関連付けを介してアクセスされる PROTECTED 属性を持つポインター・オブジェクトは、以下のいずれかとして指定しないでください。

v NULLIFY ステートメントまたは POINTER 代入ステートメント内のポインター・オブジェクトとして

v ALLOCATE または DEALLOCATE ステートメント内の割り振り可能オブジェクトとして

v 関連仮引数が、INTENT(INOUT) または INTENT(OUT) 属性を持つポインターである場合、プロシージャーへの参照内の実引数として

表 49. PROTECTED 属性と互換性のある属性

ALLOCATABLE �1� INTENT SAVE

ASYNCHRONOUS OPTIONAL STATIC �3�

AUTOMATIC �3� POINTER TARGET

CONTIGUOUS �2� PRIVATE VOLATILE

DIMENSION PUBLIC

�� PROTECTED entity_declaration_list::

��

第 11 章 ステートメントおよび属性 485

Page 512: IBM XL Fortran for Linux, V15.1

表 49. PROTECTED 属性と互換性のある属性 (続き)

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張

以下の例では、age と val の両方の値は、それらが宣言されているモジュール内のサブルーチンによってのみ変更ができます。

module mod1integer, protected :: valinteger :: ageprotected :: agecontains

subroutine set_val(arg)integer argval = arg

end subroutinesubroutine set_age(arg)

integer argage = arg

end subroutineend moduleprogram dt_init01

use mod1implicit noneinteger :: value, his_agecall set_val(88)call set_age(38)value = valhis_age = ageprint *, value, his_age

end program

関連情報v 199ページの『モジュール』

v 478ページの『PRIVATE』

v 『PUBLIC』

PUBLIC目的

PUBLIC 属性によって、モジュール・エンティティーが、使用関連付けを介して他のプログラム単位によってアクセスできることを指定します。

構文

486 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 513: IBM XL Fortran for Linux, V15.1

access_id

一般仕様、あるいは、変数、プロシージャー、派生型、定数、または名前リストのグループの名前です。

規則

PUBLIC 属性は、モジュールの有効範囲内にのみ指定できます。

モジュールには、複数の PUBLIC ステートメントを指定できますが、使用できるのは access_id_list を省略する 1 つのステートメントのみです。access_id_list を指定しない PUBLIC ステートメントは、モジュール内の潜在的にアクセス可能なすべてのエンティティーに対して、デフォルトのアクセス可能性をパブリックに設定します。モジュールにこのようなステートメントが含まれている場合、access_id_list を指定しない PRIVATE ステートメントを含めることはできません。モジュールに、access_id_list を指定しない PRIVATE ステートメントが含まれていない場合は、デフォルトのアクセス可能性はパブリックになります。アクセス可能性が明示的に指定されていないエンティティーは、デフォルトのアクセス可能性を持ちます。

パブリックである一般識別子を持つプロシージャーは、固有の識別子がプライベートだとしても、一般識別子によってアクセス可能です。モジュール・プロシージャーに、型がプライベート・アクセス可能性を持つプライベート仮引数か、関数結果が含まれている場合、そのモジュール・プロシージャーは、プライベートなアクセス可能性を持つように宣言される必要があり、パブリックなアクセス可能性を持つ一般識別子を持たないようにする必要があります。

パブリックなアクセス可能性を持つエンティティーは、STATIC 属性を持つことができませんが、モジュール内のパブリック・エンティティーは、モジュール内の IMPLICIT STATIC ステートメントの影響を受けません。

表 50. PUBLIC 属性と互換性のある属性

ALLOCATABLE �1� EXTERNAL PROTECTED �1�

ASYNCHRONOUS INTRINSIC SAVE

CONTIGUOUS �2� PARAMETER TARGET

DIMENSION POINTER VOLATILE

注:�1� Fortran 2003

�2� Fortran 2008

例MODULE MC

PRIVATE ! Default accessibility declared as privatePUBLIC GEN ! GEN declared as publicINTERFACE GEN

MODULE PROCEDURE SUB1

�� PUBLICaccess_id_list

::

��

第 11 章 ステートメントおよび属性 487

Page 514: IBM XL Fortran for Linux, V15.1

END INTERFACECONTAINS

SUBROUTINE SUB1(I)INTEGER II = I + 1

END SUBROUTINE SUB1END MODULE MCPROGRAM ABC

USE MCK = 5CALL GEN(K) ! SUB1 referenced because GEN has public

! accessibility and appropriate argument! is passed

PRINT *, K ! Value printed is 6END PROGRAM

関連情報v 478ページの『PRIVATE』

v 485ページの『PROTECTED (Fortran 2003)』

v 199ページの『モジュール』

READ目的

READ ステートメントは、データ転送入力ステートメントです。

構文

format ホレリス定数にしてはいけない形式識別子です。詳しくは、FMT=format を参照してください。

name 名前リストのグループ名です。

input_item

入力リスト項目です。入力リストには、転送されるデータを指定します。入力リスト項目は、以下のとおりです。

v 変数名。ただし想定サイズ配列用ではありません。配列は、そのエレメントのすべてがストレージに配置されている順序で指定されたように処理されます。

ポインターを、定義可能なターゲットと関連付けて、割り振り可能オブジェクトを割り振る必要があります。派生型オブジェクトは、このステートメントの有効範囲単位の外側にある最終コンポーネントを持つことができません。input_item の評価の結果は、ポインターを含む派生型オブジェクトにはできません。定形式ステートメント内の構造体の構造体コンポーネ

�� READ nameformat

, input_item_list( io_control_list )

input_item_list

��

488 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 515: IBM XL Fortran for Linux, V15.1

ントは、派生型定義で指定された順序で処理されます。不定形式ステートメントでは、構造体コンポーネントは、内部表記 (埋め込みを含む) 内の単一値として処理されます。

v 496ページの『暗黙 DO リスト』で説明している、暗黙 DO リスト。

input_item は、プロシージャー・ポインターにしないでください。

io_control

必ず 1 つの装置指定子 (UNIT=) を含み、他の有効な指示子のそれぞれのうちの 1 つを含めることのできるリストです。

[UNIT=] u

入力操作で使用される装置を指定する装置指定子です。u は、外部装置識別子または内部ファイル識別子です。

外部装置識別子は、外部ファイルを参照します。これは、以下のいずれかになります。

v 値の範囲が 1 から 2147483647 である整数式。

v 外部装置 5 を識別して、標準入力に事前に関連付けられているアスタリスク

v F2008 A NEWUNIT 値 F2008

内部ファイル識別子は、内部ファイルを参照します。これは、ベクトル添え字を持つ配列セクションにできない文字変数の名前です。

オプション文字 UNIT= を省略する場合、u を、io_control_list の最初の項目にする必要があります。オプション文字 UNIT= を指定する場合、オプション文字 FMT= または NML= も指定する必要があります。

[FMT=] format

入力操作で使用される形式を指定する形式指定子です。format は、以下のような形式識別子です。

v FORMAT ステートメントのステートメント・ラベルです。FORMAT ステートメントは、同じ有効範囲単位に置く必要があります。

v FORMAT ステートメントのステートメント・ラベルを代入した、スカラー INTEGER(4) または INTEGER(8) の変数の名前です。FORMAT ステートメントは、同じ有効範囲単位に置く必要があります。

Fortran 95 は、ステートメント・ラベルの代入ができません。

v 文字定数です。左括弧で始まり、右括弧で終わるようにする必要があります。括弧の間に使用できるのは、FORMAT ステートメント内で説明されている形式コードのみです。ブランク文字は、左括弧の前、または右括弧の後に置くことができます。

v 左端の文字位置が有効な形式を構成している文字データを含む文字変数です。有効な形式は、左括弧で始まり、右括弧で終わります。括弧の間に使用できるのは、 417ページの『FORMAT』にリストされている形式コードのみです。ブランク文字は、左括弧の前または右括弧の後に置くことができます。format が配列エレメントの場合、形式識別子が、配列エレメントの長さを超えないようにする必要があります。

第 11 章 ステートメントおよび属性 489

Page 516: IBM XL Fortran for Linux, V15.1

v 非文字組み込み型の配列です。データは、文字配列で説明されている有効な形式識別子にする必要があります。

v 文字式です。オペランドが定数の名前でないかぎり、継承された長さを指定するオペランドの連結を含んだ文字式は除きます。

v リスト指示形式設定で指定するアスタリスクです。

v 前に定義された名前リストを指定する名前リスト指定子です。

オプション文字 FMT= を省略する場合、format を io_control_list の 2 番目の項目にして、最初の項目をオプション文字 UNIT= を省略した装置指定子にする必要があります。NML= と FMT= 両方を、同じ入力ステートメントに指定することはできません。

ADVANCE= char_expr

このステートメントに対して、非事前入力が発生するかどうかを決定する事前指定子です。char_expr は、YES または NO として評価されるスカラー文字式です。NO を指定した場合、事前入力は行われません。 YES が指定された場合、事前定様式順次入力または事前定様式ストリーム入力が起きます。デフォルト値は YES です。ADVANCE= は、内部ファイル装置指定子を指定しない、明示的形式仕様を持つ、定様式順次か定様式ストリームのREAD ステートメントにのみ指定できます。

ASYNCH= char_expr (IBM 拡張)明示的に関連付けられた装置が、非同期入出力に使用されるかどうかを示す、非同期入出力指定子です。

char_expr はスカラー文字式で、その値は YES または NO のいずれかです。YES は、非同期データ転送ステートメントを、この関連付けに使用できることを指定します。NO は、非同期データ転送ステートメントを、この関連付けに使用できないことを指定します。指定された値は、ファイルに使用できる転送方式のセットに入ります。この指定子が省略された場合、デフォルト値は NO です。

事前に関連付けられた値は、ASYNCH= の値 NO で関連付けられます。

暗黙的に関連付けられた ASYNCH= 値は、装置で実行される最初のデータ転送ステートメントによって決定されます。最初のステートメントが非同期データ転送を実行して、暗黙的に関連付けられるファイルが非同期データ転送を使用できる場合、ASYNCH= の値は YES になります。それ以外では、ASYNCH= の値は NO になります。

ASYNCHRONOUS=char_expr (Fortran 2003)データ転送が完了するのを待たずに、実行を継続できます。char_expr は、YES または NO として評価されるスカラー文字式です。UNIT= でファイル装置番号を指定しない限り、ASYNCHRONOUS=YES は指定できません。ID= を指定する場合、ASYNCHRONOUS=YES も指定する必要があります。

ASYNCHRONOUS=NO または、ASYNCHRONOUS= と ID= 両方がない場合、ステートメントおよび入出力操作は同期です。ASYNCHRONOUS=YES の場合、あるいは、ID= が現れる場合は、非同期入出力が許可されるのは、OPEN ステートメント内のASYNCHRONOUS=YES で開いた外部ファイルに対してのみです。

490 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 517: IBM XL Fortran for Linux, V15.1

変数が、入出力リスト内の項目、名前リスト内のグループ・オブジェクトまたは、SIZE= 指定子として、非同期データ転送ステートメント内で使用される場合、data_ref の基本オブジェクトには、データ転送ステートメントの有効範囲単位内の ASYNCHRONOUS 属性が、暗黙的に指定されます。非同期の非事前入力の場合、SIZE= 指定子に指定された記憶単位は、対応する待機命令が実行される時に転送される文字の数で定義されます。非同期出力の場合、処理中の I/O ストレージ・シーケンス・アフェクターは、再定義されないか、未定義状態になるか、そのポインター関連付け状況が変更されます。非同期入力の場合、処理中の I/O ストレージ・シーケンス・アフェクターは、参照されないか、定義されるか、未定義状態になるか、VALUE 属性を持つ仮引数と関連付けられるか、ポインター関連付け状況が変更されます。

前に実行した非同期データ転送ステートメントに対して、エラー条件、ファイル終了条件、またはレコード終了条件が生じた場合、待機命令は、その装置にあるすべての保留データ転送操作に対して実行されます。後続のステートメント中に、条件が発生した場合、そのステートメントの IOSTAT=、IOMSG=、ERR=、END=、および EOR= 指定子が使用されます。

待機命令は、WAIT、CLOSE またはファイル位置決めステートメントによって実行されます。

END= stmt_label

ファイル終了レコードが検出されて、エラーが発生しない場合に、プログラムが続行されるステートメント・ラベルを指定するファイル終了指定子です。外部ファイルは、ファイル終了レコードの後に置かれます。IOSTAT=指定子がある場合、これには負の値が割り当てられ、NUM= 指定子がある場合、これには整数値が割り当てられます。エラーが発生して、ステートメントに SIZE= 指定子が含まれている場合、指定した変数は、整数値で定義されます。END= 指定子のコーディングによって、ファイルの終わりのエラー・メッセージを抑制します。この指定子は、順次アクセスまたは直接アクセスのいずれかに関連付けられた装置に対して指定できます。

EOR= stmt_label

レコード終了指定子です。指定子がある場合、レコード終了条件が生じて、ステートメントの実行中にエラー条件が発生しません。 PAD= が存在する場合、以下も発生します。

1. PAD= 指定子の値が YES の場合、レコードが含むより多くの文字が必要な入力リスト項目およびそれに対応するデータ編集記述子を充足するために、レコードはブランクで埋め込まれます。

2. READ ステートメントの実行が終了します。

3. READ ステートメント内に指定したファイルが、現行レコードの後に置かれます。

4. IOSTAT= 指定子がある場合、指定した変数は、ファイル終了値とは異なる負の値で定義されます。

5. SIZE= 指定子がある場合、指定した変数は、整数値で定義されます。

6. EOR= 指定子で指定されたステートメント・ラベルを含むステートメントで実行が継続されます。

7. レコード終了メッセージは抑制されます。

第 11 章 ステートメントおよび属性 491

Page 518: IBM XL Fortran for Linux, V15.1

BLANK= char_expr (Fortran 2003)形式仕様を使用する際、ブランクのデフォルト変換処理を制御します。char_expr は、末尾ブランクが除去された時に、値が NULL か ZERO のいずれかであるスカラー文字式です。BLANK= が指定された場合、FORM='FORMATTED' を使用する必要があります。BLANK= が指定されず、FORM='FORMATTED' を指定した場合、NULL がデフォルトになります。

DECIMAL= char_expr (Fortran 2003)入出力ステートメントの継続中、デフォルトの 10 進数編集モードを一時的に変更します。char_expr は、値が POINT または COMMA のいずれかに評価されるスカラー文字式です。それぞれの READ ステートメントの後、モードは、デフォルトで、その装置に対して OPEN ステートメントで指定された (前提とされた) 10 進数モードになります。

ERR= stmt_label

エラー指定子です。これは、エラーが発生した場合に、制御の転送先の実行可能ステートメントのステートメント・ラベルを指定します。ERR= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

ID= integer_variable (IBM 拡張)データ転送が非同期に行われるように示します。integer_variable は、整変数です。エラーが発生しない場合、integer_variable は、非同期データ転送ステートメントの実行後の値で定義されます。この値は、対の WAIT ステートメントで使用される必要があります。

子データ転送ステートメントには、ID= 指定子を入れないでください。

非同期データ転送は、直接の不定形式、順次不定形式、ストリーム不定形式のいずれかにする必要があります。内部ファイルへの非同期入出力は禁止されています。未加工キャラクター型デバイス (例えば、テープや未加工論理ボリューム) への非同期入出力は禁止されています。 integer_variable を、データ転送入出力リスト内のエンティティー、またはデータ転送入出力リスト内の io_implied_do の do_variable と関連付けないでください。integer_variable が配列エレメント参照の場合、その添え字値が、データ転送、io_implied_do 処理、あるいは io_control_spec 内の他の指定子の定義や評価の影響を受けないようにしてください。

IOMSG= iomsg_variable (Fortran 2003)入出力状況指定子です。これは、入出力操作によって戻されるメッセージを指定します。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

v エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

v このような条件が発生しない場合は、変数の値は変更されません。

IOSTAT= ios

入出力状況指定子です。これは、入出力操作の状況を指定します。ios は、

492 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 519: IBM XL Fortran for Linux, V15.1

整変数です。IOSTAT= 指定子をコーディングすることによって、エラー・メッセージを抑制します。ステートメントが実行を終了すると、ios は、以下の値で定義されます。

v エラー条件、ファイル終了条件、レコード終了条件が発生しない場合はゼロ値

v エラーが発生した場合は正の値

v ファイル終了条件が検出されて、エラーが発生しない場合は負の値

v レコード終了条件が起こり、エラー条件やファイル終了条件がおきない場合は、ファイル終了値と異なる負の値

PAD= char_expr (Fortran 2003)入力レコードをブランクで埋め込むかどうかを指定します。char_expr は、YES または NO として評価されるスカラー文字式です。値が YES の場合、入力リストが指定されて、形式仕様が、レコードに含まれるより多くのデータをレコードから必要とすると、定様式入力レコードはブランクで埋め込まれます。 NO が指定される場合、入力リストおよび形式仕様に、レコードから、レコードが含むよりも多くの文字を必要としないようにしてください。デフォルト値は YES です。 PAD= 指定子は、定様式レコードの出力中に無視されますが、定様式入出力に関連付けられるファイルにのみ使用できます。

-qxlf77 コンパイラー・オプションで、noblankpad サブオプションを指定し、ファイルが定様式の直接入出力に関連付けられている場合、PAD= 指定子が省略されると、デフォルト値は NO になります。

[NML=] name

前に定義された名前リストを指定する名前リスト指定子です。オプション文字 NML= を指定しない場合、名前リストの名前を、リスト内の 2 番目のパラメーターとして、最初の項目を UNIT= を省略した装置指定子にする必要があります。 NML= と UNIT= 両方を指定する場合、すべてのパラメーターは、任意の順序で現れます。NML= 指定子を FMT= の代わりとする場合、NML= と FMT= 両方を、同じ入力ステートメントに指定することはできません。

NUM= integer_variable (IBM 拡張)入出力リストとファイル間で伝送されるデータのバイト数を指定する数値指定子です。integer_variable は、整変数です。NUM= 指定子は、不定様式出力に対してのみ使用できます。NUM パラメーターのコーディングによって、出力リストによって示されるバイト数が、レコードに書き込めるバイト数よりも大きい場合に起こるエラーの表示を抑制します。この場合、integer_variable は、書き込めるレコード最大長の値に設定されます。残りの出力リスト項目からのデータは、後続のレコードに書き込まれません。

POS=integer_expr (Fortarn 2003)は、0 より大きい整数式です。POS= は、ストリーム・アクセスに関連付けられたファイル内で、読み取られるファイル記憶単位のファイル位置を指定します。位置付けができないファイル、または、子データ転送ステートメント内のファイルに対して、この指定子は使用しないでください。

REC= integer_expr

読み取られるレコードの数を指定するレコード指定子です。 制御情

第 11 章 ステートメントおよび属性 493

Page 520: IBM XL Fortran for Linux, V15.1

報に、REC= 指定子が含まれている場合、ステートメントは、直接アクセス入出力ステートメントになります。この指定子を、子データ転送ステートメント内で使用しないでください。

integer_expr は、値が正の整数式です。レコード指定子は、リスト指示形式設定または名前リスト形式設定が使用されていて、装置指定子が、内部ファイルを指定している場合、無効です。 END= 指定子を、同時に指定できます。 レコード指定子は、ファイル内のレコードの相対位置を表します。最初のレコードの相対位置数は 1 です。ストリーム・アクセスに関連付けられた装置を指定するデータ転送ステートメント内に REC= を指定しないでください。または POS= 指定子を使用しないでください。

ROUND= char-expr (Fortran 2003)

この入出力ステートメントの継続中、入出力丸めモードの現行値を一時的に変更します。省略された場合、丸めモードは変更されません。char-expr

は、UP、DOWN、ZERO、NEAREST、COMPATIBLE またはPROCESSOR_DEFINED のいずれかとして評価されます。

丸めモード・ヘルプによって、定様式入出力中に 10 進数を文字表記から内部表記 (すなわち、2 進数) に変換する方法、またはその逆にする方法を指定します。丸めモードには、以下の関数があります。

v UP 丸めモードでは、変換による値は、元の値以上の最小値になります。

v DOWN 丸めモードでは、変換による値は、元の値以下の最大値になります。

v ZERO 丸めモードでは、変換による値は、元の値に最も近く、絶対値ではより大きくない値になります。

v NEAREST 丸めモードでは、変換による値は、表記可能な、最も隣接した 2 つの値のより近い方になります。両方の値が同じように近い場合、偶数値が選択されます。IEEE 丸め変換で、NEAREST は、IEEE 標準で指定される ieee_nearest 丸めモードに相当します。

v COMPATIBLE 丸めモードでは、変換による値は、表記可能な、最も隣接した 2 つの値の内、最も近い値か、中間である場合はよりゼロから離れた値になります。

v PROCESSOR_DEFINED 丸めモードでは、変換による値は、プロセッサー従属となり、他のモードに対応することがあります。XL Fortran では、PROCESSOR_DEFINED 丸めモードは、浮動小数点制御レジスターで選択する丸めモードとなります。浮動小数点制御レジスターを明示的に設定していない場合、デフォルトの丸めモードは NEAREST です。

SIZE= count

現行入力ステートメントの実行中に、データ編集記述子によって転送される文字数を決定する文字カウント指定子です。count は、整変数です。埋め込みとして挿入されるブランクは、数に含まれません。

規則

ERR=、EOR= および END= 指定子で指定されたステートメント・ラベルは、READ ステートメントと同じ有効範囲単位に現れる分岐ターゲット・ステートメントを参照する必要があります。

494 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 521: IBM XL Fortran for Linux, V15.1

EOR= 指定子または SIZE= 指定子のいずれかがある場合、値が NO のADVANCE= 指定子が必要です。

NUM= 指定子がある場合、形式指定子または名前リスト指定子は指定できません。

IOSTAT=、SIZE= および NUM= 指定子に指定された変数は、入力リスト項目、名前リストのリスト項目、または、暗黙 DO リストの DO 変数と関連付けないでください。このような指定子変数が配列エレメントの場合、添え字値が、データ転送、暗黙 DO 処理、またはその他の指定子の定義や評価の影響を受けないようにしてください。

io_control_list を指定しない READ ステートメントは、外部装置識別子がアスタリスクの io_control_list を指定した READ ステートメントと同じ単位を指定します。

ERR= および IOSTAT= 指定子が設定され、同期データ転送中にエラーが検出された場合、ERR= 指定子によって指定されたステートメントに転送され、正整数値がios に割り当てられます。

ERR= または IOSTAT= 指定子が設定され、非同期データ転送中にエラーが検出された場合、対応する WAIT ステートメントの実行は必要ありません。

END= または IOSTAT= 指定子が設定され、非同期データ転送中にファイル終了条件が検出された場合、対の WAIT ステートメントの実行は必要ありません。

変換エラーが検出されて、CNVERR 実行時オプションが NO に設定されている場合、ERR= は、IOSTAT= が設定されていたとしても分岐しません。

IOSTAT= および ERR= が指定されない場合、以下のようになります。

v 重大エラーが検出された場合、プログラムは停止します。

v リカバリー可能エラーが検出され、ERR_RECOVERY 実行時オプションが YESに設定されている場合は、プログラムは継続されて次のステートメントに進みます。オプションが NO に設定されている場合は、プログラムは停止します。

v ERR_RECOVERY 実行時オプションが YES に設定されている場合、変換エラーが検出されると、プログラムは続行されて次のステートメントに進みます。CNVERR 実行時オプションが YES に設定されている場合、変換エラーは、リカバリー可能エラーとして処理されます。CNVERR=NO の場合は、変換エラーとして処理されます。

例INTEGER A(100)CHARACTER*4 BREAD *, A(LBOUND(A,1):UBOUND(A,1))READ (7,FMT='(A3)',ADVANCE='NO',EOR=100) B

...100 PRINT *, 'end of record reached'END

第 11 章 ステートメントおよび属性 495

Page 522: IBM XL Fortran for Linux, V15.1

関連情報v 248ページの『非同期入出力』

v 「XL Fortran 最適化およびプログラミング・ガイド」に記載される『XL Fortran

入出力の実装詳細』

v 254ページの『条件および IOSTAT 値』

v 547ページの『WRITE』

v 542ページの『WAIT (Fortran 2003)』

v 241ページの『第 9 章 XL Fortran の入出力』

v 「XL Fortran コンパイラー・リファレンス」に記載される『実行時オプションの設定』

v 1117ページの『削除されたフィーチャー』

暗黙 DO リスト

do_object

出力リスト項目です。

do_variable

型整数または実数の名前付きスカラー変数です。

arith_expr1、arith_expr2、および arith_expr3

スカラー数式です。

暗黙 DO リストの範囲は、リスト do_object_list です。DO 変数の反復カウントおよび値は、DO ステートメントの場合と同様に、arith_expr1、arith_expr2、およびarith_expr3 から設定されます。暗黙 DO リストが実行される際、DO 変数の出現に対する適切な代替値で、do_object_list 内の項目が、暗黙 DO リストの反復のたびに1 回指定されます。

DO 変数または関連データ項目は、do_object_list 内の入力リスト項目として現れないようにする必要がありますが、暗黙 DO リストの外側の READ ステートメントでは読み取れます。

REAL目的

REAL 型宣言ステートメントによって、実数型のオブジェクトと関数の長さと属性を指定します。初期値はオブジェクトに代入することができます。

�� ( do_object_list , do_variable = arith_expr1, arith_expr2 �

� ), arith_expr3

��

496 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 523: IBM XL Fortran for Linux, V15.1

構文

ここで、

attr_spec

以下のいずれかです。

ALLOCATABLE �1� INTRINSIC PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PARAMETER STATIC �2�

BIND �1� POINTER TARGET

DIMENSION (array_spec) PRIVATE VALUE �1�

EXTERNAL PROTECTED �1� VOLATILE

INTENT (intent_spec)

注:�1� Fortran 2003

�2� IBM 拡張

kind_selector

実エンティティーの長さ 4、8 または 16 を指定します。int_literal_constant は kind 型パラメーターを指定できません。

attr_spec

個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

intent_spec

IN、OUT、または INOUT のいずれかになります。

:: 二重コロン区切り文字です。属性、=constant_expr、または => NULL() を指定する場合は、二重コロン区切り文字を使用します。

array_spec

次元範囲のリストです。

�� REALkind_selector ::

, attr_spec_list ::

entity_decl_list ��

�� ( int_constant_expr )KIND =

(1)* int_literal_constant

��

注:

1 IBM 拡張.

第 11 章 ステートメントおよび属性 497

Page 524: IBM XL Fortran for Linux, V15.1

entity_decl

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数名には指定できません。

len (IBM 拡張)kind_selector に指定されたように長さをオーバーライドします。kind 型パラメーターは指定できません。エンティティーの長さは、許される長さ指定の 1 つを表す、整数のリテラル定数にする必要があります。

initial_value (IBM 拡張)すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。

constant_expr

直前の名前によって指定されるエンティティーの定数式を指定します。

=> NULL()ポインター・オブジェクトの初期値を指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

�� a(1) (2) ( array_spec )

* len(3) (4)

( array_spec ) * len

�(5)

/ initial_value_list /= constant_expr=> NULL()

��

注:

1 IBM 拡張.

2 IBM 拡張.

3 IBM 拡張.

4 IBM 拡張.

5 IBM 拡張.

498 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 525: IBM XL Fortran for Linux, V15.1

v コンパイラーは、型定義の有効範囲単位内の constant_expr を評価します。

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

変数に constant_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。組み込み関数の型を確認する型宣言ステートメントを使用できます。一般または特定の組み込み関数の名前が型宣言ステートメント内に現れても、名前がその組み込みプロパティーを失うことはありません。

オブジェクトが、仮引数、割り振り可能オブジェクト、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内では初期化できません。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通域ブロックに現れる場合、オブジェクトを初期化できます。

オブジェクトが、モジュール内またはサブモジュール内の名前付き共通ブロックに現れる場合も、初期化が可能です。

Fortran 95 では、ポインターを初期化できます。ポインターは、=> NULL() の使用によってのみ初期化できます。

array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

ステートメントに PARAMETER 属性が含まれている場合は、constant_expr を指定する必要があります。宣言するエンティティーが変数で、constant_expr またはNULL() が指定された場合、変数は最初に定義されます。

宣言するエンティティーが派生型コンポーネントで、constant_expr または NULL()が指定された場合、派生型はデフォルトの初期化値を持ちます。

a は、組み込み代入の規則に応じて、constant_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、constant_expr または NULL() の存在は、a が、名前付き共通域ブロック内の

第 11 章 ステートメントおよび属性 499

Page 526: IBM XL Fortran for Linux, V15.1

オブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。

ALLOCATABLE または POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

例REAL(8), POINTER :: RPTRREAL(8), TARGET :: RTAR

関連情報v 42ページの『実数』

v 114ページの『定数式』

v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』

v 86ページの『配列宣言子』

v 21ページの『自動オブジェクト』

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

v 初期値に関しての詳細は、 363ページの『DATA』

RECORD (IBM 拡張)目的

RECORD ステートメントは、型宣言ステートメントの特別な形式です。他の型宣言ステートメントと違って、RECORD ステートメントで宣言されたエンティティーの属性は、そのステートメント自身では指定できません。

500 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 527: IBM XL Fortran for Linux, V15.1

構文

record_stmt:

record_obj_dcl:

ここで、type_name は、有効範囲単位内でアクセス可能な派生型の名前にする必要があります。

規則

エンティティーは、RECORD ステートメント内では初期化できません。

record_stmt は、直前に来る type_name によって指定された派生型になるエンティティーを宣言します。

RECORD キーワードを、IMPLICIT および FUNCTION ステートメントのtype_spec として、指定しないでください。

BIND 属性を持つ派生型は、RECORD ステートメントで指定しないでください。

次の例で、RECORD ステートメントは、派生型変数を宣言するのに使用されています。

STRUCTURE /S/INTEGER I

END STRUCTURE

�� �

,

RECORD / type_name / record_obj_dcl_list::

��

record_obj_dcl:

�� record_object_name(-array_spec-)

��

�� �

,

RECORD / type_name / record_obj_dcl_list::

��

�� record_object_name(-array_spec-)

��

第 11 章 ステートメントおよび属性 501

Page 528: IBM XL Fortran for Linux, V15.1

STRUCTURE /DT/INTEGER I

END STRUCTURERECORD/DT/REC1,REC2,/S/REC3,REC4

関連情報v レコード構造および派生型について詳しくは、 55ページの『第 4 章 派生型』を参照してください。

RETURN目的

RETURN ステートメントは、

v 関数サブプログラム内で、サブプログラムの実行を終了し、制御を参照ステートメントに戻します。関数の値は、参照プロシージャーに使用できます。

v サブルーチン・サブプログラム内で、サブプログラムを終了し、制御を、プロシージャー参照、または、指定されていれば、代替戻り点の後の最初の実行可能ステートメントに戻します。

v メインプログラム内で、実行可能プログラムの実行を終了します。

構文

arith_expr

スカラー整数、実数、複素数の式です。式の値が非整数の場合、使用される前に INTEGER(4) に変換されます。arith_expr は、ホレリス定数にしないでください。

規則

arith_expr は、サブルーチン・サブプログラムでのみ指定でき、代替戻り点を指定します。m を arith_expr の値として、1 ≤ m ≤ SUBROUTINE または ENTRY ステートメント内のアスタリスクの数の場合、仮引数リスト内の m 個のアスタリスクが選択されます。ステートメント・ラベルが、CALL ステートメント内で m 個の代替戻り指定子として指定されているステートメントで呼び込まれたプロシージャーに制御が返されます。例えば、m の値が 5 の場合、ステートメント・ラベルが、CALL ステートメント内で 5 番目の代替戻り指定子として指定されているステートメントに制御が返されます。

�� RETURN(1)

arith_expr

��

注:

1 実数式または複素数式は、IBM 拡張です。

502 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 529: IBM XL Fortran for Linux, V15.1

arith_expr が省略されるか、値 (m) が、1 から SUBROUTINE または ENTRY ステートメント内のアスタリスクの数の間の範囲にない場合、通常の戻りが実行されます。制御は、CALL ステートメントに続くステートメントで呼び込まれたプロシージャーに返されます。

RETURN ステートメントの実行によって、サブプログラムの仮引数と、サブプログラムのインスタンスに指定された実引数の間の関連が終了されます。サブプログラムに対してローカルなすべてのエンティティーは、 27ページの『未定義を発生させるイベント』 に記載されているものを除いて未定義になります。

サブプログラムには、複数の RETURN ステートメントを含めることができますが、なくても構いません。関数サブルーチン・サブプログラムまたはサブルーチン・サブプログラム内の END ステートメントは、RETURN ステートメントと同じ効果を持ちます。

例CALL SUB(A,B)CONTAINS

SUBROUTINE SUB(A,B)INTEGER :: A,BIF (A.LT.B)

RETURN ! Control returns to the calling procedureELSE

...END IF

END SUBROUTINEEND

関連情報v 231ページの『仮引数がアスタリスクの場合』

v 代替戻り点の説明については、 217ページの『実引数の指定』

v 27ページの『未定義を発生させるイベント』

REWIND目的

REWIND ステートメントによって、順次アクセスに関連付けられた外部ファイルを、ファイルの最初のレコードの先頭に置きます。 ストリーム・アクセスの場合、REWIND ステートメントはファイルの初期点に置きます。

REWIND ステートメントの実行により、指定した装置の保留非同期データ転送処理のために待機命令を実行します。

構文

u アスタリスクまたはホレリス定数にしてはいけない外部装置識別子です。

�� REWIND u( position_list )

��

第 11 章 ステートメントおよび属性 503

Page 530: IBM XL Fortran for Linux, V15.1

position_list

必ず 1 つの装置指定子 ([UNIT=]u) を含み、他の有効な指示子のそれぞれのうちの 1 つを含めることのできるリストです。有効な指定子は、次のとおりです。

[UNIT=] u

u を、値がアスタリスクではない外部装置識別子にする必要がある装置指定子です。外部装置識別子とは、整数式によって表される外部ファイルのことです。整数式の値は、以下のいずれかです。

v 1 から 2147483647 の範囲内の値

v F2008 A NEWUNIT 値 F2008

オプション文字 UNIT= を省略する場合、u を、position_list の最初の項目にする必要があります。

ERR= stmt_label

エラーが発生した場合に、制御の転送先と同じ有効範囲単位内にある実行可能ステートメントのステートメント・ラベルを指定するエラー指定子。ERR= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

IOMSG= iomsg_variable (Fortran 2003)入出力操作によって戻されるメッセージを指定する入出力状況指定子です。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

v エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

v このような条件が発生しない場合は、変数の値は変更されません。

IOSTAT= ios

入出力操作の状況のための入出力状況指定子です。ios は、スカラー整変数です。REWIND ステートメントが実行を終了すると、ios は、以下の値で定義されます。v エラー条件が発生しない場合はゼロ値v エラーが発生した場合は正の値

規則

装置が関連付けられていない場合、順次アクセスを指定する暗黙 OPEN が、fort.nという名前のデフォルト・ファイルに対して実行されます。n は先行ゼロを除去した u の値です。指定した装置に関連付けられている外部ファイルが存在しない場合、REWIND ステートメントは何の影響も与えません。存在している場合、必要に応じて、ファイル終了マーカーが作成され、ファイルは、最初のレコードの先頭に置かれます。ファイルが既に初期点に置かれている場合、REWIND ステートメントは何の影響も与えません。REWIND ステートメントは、u を参照する、後続のREAD または WRITE ステートメントが、u に関連付けられている外部ファイルの最初のレコードの、データの読み取りあるいはデータの書き込みを行うようにします。

504 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 531: IBM XL Fortran for Linux, V15.1

ERR= および IOSTAT= 指定子が設定され、エラーが検出された場合、ERR= 指定子によって指定されたステートメントに転送され、正整数値が ios に割り当てられます。

IOSTAT= および ERR= が指定されない場合、以下のようになります。

v 重大エラーが検出された場合、プログラムは停止します。

v リカバリー可能エラーが検出され、ERR_RECOVERY 実行時オプションが YESに設定されている場合は、プログラムは継続されて次のステートメントに進みます。オプションが NO に設定されている場合は、プログラムは停止します。

例REWIND (9, IOSTAT=IOSS)

関連情報v 254ページの『条件および IOSTAT 値』

v 241ページの『第 9 章 XL Fortran の入出力』

v 「XL Fortran コンパイラー・リファレンス」に記載される『実行時オプションの設定』

SAVE目的

SAVE 属性によって、変数と名前付き共通域ブロックを定義するサブプログラムから制御が戻った後、定義状況を保存する必要がある、オブジェクトの名前および名前付き共通域ブロックを指定します。

構文

規則

リストのない SAVE ステートメントは、有効範囲単位内のすべての共通項目とローカル変数の名前が指定されたかのように処理されます。SAVE 属性を持つ共通ブロック名は、名前付き共通域ブロック内のすべてのエンティティーを指定するという効果を持ちます。

関数サブプログラムまたはサブルーチン・サブプログラム内で、名前が SAVE 属性で指定された変数は、サブプログラム内の RETURN または END ステートメントの結果として未定義にはなりません。

��

SAVE,

object_name:: / common_block_name /

��

第 11 章 ステートメントおよび属性 505

Page 532: IBM XL Fortran for Linux, V15.1

object_name は、仮引数、ポインティング先、プロシージャー、自動オブジェクト、または共通ブロック・エンティティーの名前にできません。

サブプログラム内で RETURN または END ステートメントが検出される時に、SAVE 属性で指定されたローカル・エンティティー (共通ブロック以外で) が定義済み状態にある場合、エンティティーは、そのサブプログラムが次に参照される時に同じ値で定義されます。保存オブジェクトは、サブプログラムのすべてのインスタンスによって共有されます。

F2008 SAVE 属性を BLOCK 構文内で指定することもできます。 F2008

IBM 拡張

XL Fortran は、関数結果が SAVE 属性を持つことを許可します。関数結果がSAVE 属性を持つように指示するには、SAVE 属性を使用して、関数結果名を明示的に指定する必要があります。すなわち、リストなしの SAVE ステートメントは、関数結果に対して SAVE 属性を提供しません。

SAVE として宣言された変数は、スレッド間で共有されます。共用変数を含むアプリケーションをスレッド・セーフにするには、ロックを使用して静的データへのアクセスをシリアライズするか、データをスレッド固有にする必要があります。静的データを、THREADLOCAL が宣言された名前付き COMMON ブロックに移動するのは、データをスレッド固有にする 1 つの方式です。 Pthreads ライブラリー・モジュールには、ロックを使用してデータへのアクセスをシリアライズできるようにする mutex が提供されています。詳しくは、 「XL Fortran 最適化およびプログラミング・ガイド」に記載される『Pthreads ライブラリー・モジュール』を参照してください。CRITICAL ディレクティブの lock_name 属性にも、データへのアクセスをシリアライズする機能があります。詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」に記載される『CRITICAL/END CRITICAL』を参照してください。THREADLOCAL ディレクティブは、共通ブロックがそれぞれのスレッドに対してローカルであることを確実にします。詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」の 『THREADLOCAL』を参照してください。

IBM 拡張 の終り

表 51. SAVE 属性と互換性のある属性

ALLOCATABLE �1� POINTER STATIC �3�

ASYNCHRONOUS PRIVATE TARGET

CONTIGUOUS �2� PROTECTED �1� VOLATILE

DIMENSION PUBLIC

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張

例LOGICAL :: CALLED=.FALSE.CALL SUB(CALLED)CALLED=.TRUE.CALL SUB(CALLED)

506 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 533: IBM XL Fortran for Linux, V15.1

CONTAINSSUBROUTINE SUB(CALLED)

INTEGER, SAVE :: JLOGICAL :: CALLEDIF (CALLED.EQV..FALSE.) THEN

J=2ELSE

J=J+1ENDIFPRINT *, J ! Output on first call is 2

! Output on second call is 3END SUBROUTINE

END

関連情報v 350ページの『COMMON』v 「XL Fortran 最適化およびプログラミング・ガイド」に記載される『THREADLOCAL』

v 23ページの『変数の定義状況』v 31ページの『変数のストレージ・クラス (IBM 拡張)』v 付録 A の 1113ページの『標準間の互換性』に記載される項目 2

SELECT CASE目的

SELECT CASE ステートメントは、CASE 構文の最初のステートメントです。これには、実行のための多くのステートメント・ブロックの中から多くて 1 つを選択するための簡潔な構文が含まれています。

構文

case_construct_name

CASE 構文を識別する名前です。

case_expr

整数型、文字型、または論理型のスカラー式です。

規則

SELECT CASE ステートメントが実行される場合、case_expr が評価されます。結果値は、ケース・インデックスと呼ばれ、ケース構文内の制御フローを評価するために使用されます。

case_construct_name を指定する場合、END CASE ステートメント内に指定する必要があります。また、オプションで、構文内の CASE ステートメントにも指定してください。

�� SELECT CASE ( case_expr )case_construct_name :

��

第 11 章 ステートメントおよび属性 507

Page 534: IBM XL Fortran for Linux, V15.1

case_expr は、型なし定数や BYTE データ・オブジェクトにしないでください。

例ZERO: SELECT CASE(N) ! start of CASE construct ZERO

CASE DEFAULT ZEROOTHER: SELECT CASE(N) ! start of CASE construct OTHER

CASE(:-1)SIGNUM = -1

CASE(1:) OTHERSIGNUM = 1

END SELECT OTHERCASE (0)

SIGNUM = 0

END SELECT ZERO

関連情報v 160ページの『CASE 構文』v 339ページの『CASE』v END SELECT ステートメントに関しての詳細は、 389ページの『END (構文)』

SELECT TYPE (Fortran 2003)目的

SELECT TYPE ステートメントは、SELECT TYPE 構文内の最初のステートメントです。構文には、ステートメント・ブロックをいくつでも入れることができますが、実行には、その中の 1 つが選択されます。選択は、セレクター 内でユーザーが選択する式の動的型および KIND TYPE パラメーター、それぞれの型保護ステートメントの型および対応する KIND TYPE パラメーターに基づいています。

構文

select_construct_name

SELECT TYPE 構文を識別する名前です。

associate_name

SELECT TYPE ステートメントの実行時に、selector と関連付けられる名前です。

セレクター (selector)

SELECT TYPE ステートメントの実行時に評価される式です。結果は、ポリモアフィックにする必要があります。

�� SELECT TYPE ( selector )select_construct_name : associate_name =>

��

508 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 535: IBM XL Fortran for Linux, V15.1

規則

selector が名前付き変数でない場合、associate_name を指定する必要があります。selector が、定義可能な変数でない場合、あるいは、ベクトル添え字を持つ変数の場合、associate_name を、変数定義コンテキストに指定しないでください。

セレクターは、ポリモアフィックにする必要があります。

select_construct_name を指定する場合、END SELECT ステートメントに指定してください。また、オプションで、構文内の型保護ステートメントに指定してください。

関連情報v 163ページの『SELECT TYPE 構文 (Fortran 2003)』v 533ページの『保護型 (Fortran 2003)』v END SELECT ステートメントに関しての詳細は、 389ページの『END (構文)』

SEQUENCE目的

SEQUENCE ステートメントによって、派生型定義内のコンポーネントの順序が、その型のオブジェクトの保管順序を設定します。このような型は、順序派生型 になります。

構文

規則

SEQUENCE ステートメントは、派生型定義内で 1 回のみ指定できます。

順序派生型のコンポーネントが派生型から成っている場合、その派生型も順序派生型にする必要があります。

順序派生型のサイズは、その派生型のコンポーネントのすべてを保持するのに必要なストレージのバイト数と同じです。

順序派生型の使用は、データを誤って並べる可能性があります。これによって、プログラムの実行に不都合な影響を与える可能性があります。

派生型定義にプロシージャーまたは BIND 属性がある場合、SEQUENCEステートメントは指定できません。また、SEQUENCE は、拡張型には指定できません。

�� SEQUENCE ��

第 11 章 ステートメントおよび属性 509

Page 536: IBM XL Fortran for Linux, V15.1

例TYPE PERSON

SEQUENCECHARACTER*1 GENDER ! Offset 0INTEGER(4) AGE ! Offset 1CHARACTER(30) NAME ! Offset 5

END TYPE PERSON

関連情報v 55ページの『第 4 章 派生型』

v 369ページの『派生型』

v 394ページの『END TYPE』

ステートメント関数目的

ステートメント関数によって、単一ステートメント内の関数を定義します。

構文

name ステートメント関数の名前です。これは、プロシージャー引数として指定しないでください。また、プロシージャー・ポインターのターゲットにはできません。

dummy_argument

ステートメント関数の仮引数リスト内に 1 回のみ指定できます。仮引数には、ステートメント関数ステートメントの有効範囲、および、ステートメント関数を含む有効範囲単位内の同じ名前を持つエンティティーと同じ型および型パラメーターがあります。

規則

ステートメント関数は、それが定義される有効範囲装置に対してローカルです。これは、モジュール F2008 またはサブモジュール F2008 の有効範囲内で定義しないでください。

name は、ステートメント関数からの戻り値のデータ型を決定します。name のデータ型が、スカラー式のデータ型に一致しない場合、スカラー式の値は、代入ステートメントの規則に応じて、name の型に変換されます。

関数の名前とすべての仮引数を、明示的あるいは暗黙的に、スカラー・データ・オブジェクトに指定する必要があります。

スカラー式は、定数、変数への参照、関数と関数ダミー・プロシージャーへの参照、および組み込み操作によって構成されます。式に、関数または関数ダミー・プ

�� name ( ) = scalar_expressiondummy_argument_list

��

510 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 537: IBM XL Fortran for Linux, V15.1

ロシージャーへの参照が含まれている場合、その参照や関数に明示的インターフェースが必要ないようにしてください。また関数を、変形の組み込みにしないでください。結果はスカラーにする必要があります。関数または関数ダミー・プロシージャーへの引数が値を与えられた配列である場合、それを配列名としてください。

XL Fortran を使用すると、スカラー式で、構造体コンストラクターを参照することもできます。

スカラー式は、以下のいずれかである他のステートメント関数を参照できます。v 同じ有効範囲単位内で前に宣言された、またはv ホストの有効範囲単位で宣言された

エレメントが式内で参照される名前付き定数および配列は、有効範囲単位内で前に宣言されるか、使用関連付けまたはホスト関連付けによってアクセス可能にしておく必要があります。

式内で参照される変数は、以下のいずれかにする必要があります。

v ステートメント関数の仮引数、または

v 有効範囲単位内でアクセス可能

式内のエンティティーが、暗黙的な型の決定の規則によって型が決められている場合、その型は、後続の型宣言ステートメント内に指定されている型および型パラメーターと一致している必要があります。

スカラー式内の外部関数参照は、ステートメント関数の仮引数が未定義になったり、再定義されたりしないようにする必要があります。

ステートメント関数が、内部サブプログラム内で定義されて、ホストからのアクセス可能なエンティティーと同じ名前を持つ場合、ステートメント関数定義を、ステートメント関数名の明示宣言で始めてください。例えば、型宣言ステートメントを使用します。

文字型のステートメント関数または文字型のステートメント関数の仮引数の長さ指定は、定数宣言式にする必要があります。

例PARAMETER (PI = 3.14159)REAL AREA,CIRCUM,R,RADIUSAREA(R) = PI * (R**2) ! Define statement functionsCIRCUM(R) = 2 * PI * R ! AREA and CIRCUM

! Reference the statement functionsPRINT *,'The area is: ',AREA(RADIUS)PRINT *,'The circumference is: ',CIRCUM(RADIUS)

関連情報v 218ページの『仮引数』

v 209ページの『関数参照』

v ステートメント関数の型の判別方法については、 20ページの『型の決定』

第 11 章 ステートメントおよび属性 511

Page 538: IBM XL Fortran for Linux, V15.1

STATIC (IBM 拡張)目的

STATIC 属性によって、変数が静的ストレージ・クラスを持つよう指定します。すなわち、プログラムの継続中、変数はメモリー内に残り、その値はプロシージャーの呼び出しと呼び出しの間保存されます。

構文

stat_variable

explicit_shape_spec_list または deferred_shape_spec_list を指定できる変数名または配列宣言子です。

initial_value

すぐ前に来る名前によって指定された変数の初期値を指定します。 363ページの『DATA』で、説明されるように初期化が起こります。

規則

stat_variable が結果変数である場合、文字型または派生型からなるものにしないでください。仮引数、自動オブジェクト、およびポインティング先に、STATIC 属性を指定しないでください。STATIC 属性を使用して明示的に宣言された変数は、共通ブロック項目にすることはできません。

同じ有効範囲内で、1 つの変数に、複数の STATIC 属性を指定しないでください。

ローカル変数は、デフォルトの自動ストレージ・クラスを持ちます。呼び出しコマンドに関するデフォルトの設定値については、「XL Fortran コンパイラー・リファレンス」に記載される『-qsave オプション』を参照してください。

STATIC として宣言された変数は、スレッド間で共有されます。共用変数を含むアプリケーションをスレッド・セーフにするには、ロックを使用して静的データへのアクセスをシリアライズするか、データをスレッド固有にする必要があります。静的データを、THREADLOCAL が宣言された COMMON ブロックに移動するのは、データをスレッド固有にする 1 つの方式です。 Pthreads ライブラリー・モジュールには、ロックを使用してデータへのアクセスをシリアライズできるようにする mutex が提供されています。詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」に記載される『Pthreads ライブラリー・モジュール』を参照してください。CRITICAL ディレクティブの lock_name 属性にも、データへのアクセスをシリアライズする機能があります。詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」に記載される『CRITICAL/END CRITICAL』を参照してください。THREADLOCAL ディレクティブは、共通ブロックがそれぞれのスレッドに

�� �

,

STATIC stat_variable:: / initial_value_list /

��

512 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 539: IBM XL Fortran for Linux, V15.1

対してローカルであることを確実にします。詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」の 『THREADLOCAL』を参照してください。

表 52. STATIC 属性と互換性のある属性

ALLOCATABLE �1� POINTER SAVE

ASYNCHRONOUS PRIVATE TARGET

CONTIGUOUS �2� PROTECTED �1� VOLATILE

DIMENSION

注:�1� Fortran 2003

�2� Fortran 2008

例LOGICAL :: CALLED=.FALSE.CALL SUB(CALLED)CALLED=.TRUE.CALL SUB(CALLED)CONTAINS

SUBROUTINE SUB(CALLED)INTEGER, STATIC :: JLOGICAL :: CALLEDIF (CALLED.EQV..FALSE.) THEN

J=2ELSE

J=J+1ENDIFPRINT *, J ! Output on first call is 2

! Output on second call is 3END SUBROUTINE

END

関連情報v 31ページの『変数のストレージ・クラス (IBM 拡張)』v 350ページの『COMMON』v 「XL Fortran 最適化およびプログラミング・ガイド」に記載される『THREADLOCAL』

STOP目的

STOP ステートメントは、正常終了を開始し、それによってプログラムの実行が終了されます。stop_code が指定された場合、キーワード「STOP」の後に stop_code

が付いたものが ERROR_UNIT に出力されます。

第 11 章 ステートメントおよび属性 513

Page 540: IBM XL Fortran for Linux, V15.1

構文

F2008

scalar_char_constant_expr

スカラー文字定数式です。

scalar_int_constant_expr

スカラー整数定数式です。

F2008

規則

STOP ステートメントが実行されると、システム戻りコードが返され、ERROR_UNIT にメッセージが出力されます。その内容は、stop_code が指定されているかどうかに応じて、以下のようになります。

v stop_code が scalar_char_constant_expr である場合、システム戻りコードは 0 です。キーワード「STOP」の後に stop_code が付いたものが出力されます。

v stop_code が scalar_int_constant_expr である場合、XL Fortran によってシステム戻りコードが MOD (stop_code, 256) に設定されます。キーワード「STOP」の後に stop_code が付いたものが出力されます。

v 何も指定されていない場合、システム戻りコードは 0 です。エラー・メッセージは出力されません。

システム戻りコードは、Korn シェルのコマンド変数 $? で使用できます。

-qxlf2003=stopexcept を使用してプログラムをコンパイルした場合、STOPステートメントに到達したときに、シグナル通知されている浮動小数点例外が表示されます。

STOP ステートメントは、DO または DO WHILE 構文の範囲を終了できません。

�� STOPstop_code

��

ここで、stop_code は、次のようになります。

��(1)

scalar_char_constant_expr(2)

scalar_int_constant_expr

��

注:

1 Fortran 2008

2 Fortran 2008

514 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 541: IBM XL Fortran for Linux, V15.1

以下の例では、さまざまな種類の stop_code を指定したときの STOP ステートメントの動作を示します。

INTEGER :: matrix(10, 10)INTEGER :: opINTEGER :: result_matrix(10, 10)INTEGER, PARAMETER :: init_error = 10INTEGER, PARAMETER :: process = 20CHARACTER(LEN = 10), PARAMETER :: message = "Terminated"

matrix = 10result_matrix = 10

! If the initialization is wrong, the message "STOP 11" is printed.! The system return code is 11.

IF (ANY(result_matrix .NE. 10)) STOP init_error + 1

! If the initialization is wrong, the message "STOP 12" is printed.! The system return code is 12.

IF (ANY(matrix .NE. 10)) STOP 12

op = WHICH_OP()

IF (op .LT. 1) THEN! If OP is less than 1, the message "STOP Program Terminated" is printed.! The system return code is 0.STOP "Program " // message

ELSE IF (OP .EQ. 1) THENresult_matrix = result_matrix + matrix

! The message "STOP 21" is printed.! The system return code is 21.

STOP PROCESS + 1ELSE IF (OP .EQ. 2) THEN

result_matrix = result_matrix - matrix

! The message "STOP 22" is printed.! The system return code is 22.

STOP process + 2ELSE

! No message is printed.! The system return code is 0.STOP

END IF

関連情報v F2008 ERROR STOP F2008

SUBMODULE (Fortran 2008)目的

SUBMODULE ステートメントは、サブモジュール・プログラム単位の最初のステートメントです。

第 11 章 ステートメントおよび属性 515

Page 542: IBM XL Fortran for Linux, V15.1

構文

submodule_name

サブモジュールの名前。

ancestor_module_name

非組み込みモジュールの名前。

parent_submodule_name

ancestor_module の下位サブモジュールの名前。

規則

サブモジュール名は、参照結合によってアクセスすることはできません。つまり、USE ステートメントによって参照することはできません。

サブモジュールは、他のプログラム単位、外部プロシージャー、共通ブロック、またはプログラム内のバインディング・ラベルを持つエンティティーと同じ名前にすることはできません。さらに、サブモジュール名は、サブモジュール内のどのローカル名とも同じにすることはできません。サブモジュールの名前は、同じ上位モジュールを持っていない場合、別のサブモジュールと同じ名前にすることができます。

サブモジュールを完了させる END ステートメントがサブモジュール名を指定する場合、名前は SUBMODULE ステートメントが指定するものと同じでなければなりません。

例MODULE mod

...END MODULE

SUBMODULE (mod) mod1 ! parent_submodule_name is not specified...

END SUBMODULE

SUBMODULE (mod) mod2 ! parent_submodule_name is not specified...

END SUBMODULE

SUBMODULE (mod:mod1) mod3 ! parent_submodule_name is specified...

END SUBMODULE

�� SUBMODULE ( parent_identifier ) submodule_name ��

parent_identifier

�� ancestor_module_name: parent_submodule_name

��

516 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 543: IBM XL Fortran for Linux, V15.1

関連ステートメントv 387ページの『END』

v 456ページの『MODULE』

v 534ページの『USE』

v 478ページの『PRIVATE』

v 485ページの『PROTECTED (Fortran 2003)』

v 486ページの『PUBLIC』

関連情報v 199ページの『モジュール』

v 203ページの『サブモジュール (Fortran 2008)』

v 177ページの『使用関連付け』

SUBROUTINE目的

SUBROUTINE ステートメントは、サブルーチン・サブプログラムの最初のステートメントです。

構文

prefix 次のいずれかになります。

v ELEMENTAL

v F2008 IMPURE F2008

v F2008 MODULE F2008

v PURE

v RECURSIVE

注: type_spec は、サブルーチン内で接頭部として使用できません。

�� � SUBROUTINE nameprefix ( )

dummy_argument_list

�(1)

BIND ( C ), NAME = binding_label

��

注:

1 Fortran 2003

第 11 章 ステートメントおよび属性 517

Page 544: IBM XL Fortran for Linux, V15.1

name サブルーチン・サブプログラムの名前です。

binding_label スカラー文字定数式です。

規則

指定できるのは、多くても、それぞれの種類の prefix を 1 つです。RECURSIVEおよび ELEMENTAL の両方のプレフィックス指定子を指定することはできません。 F2008 PURE および IMPURE の両方のプレフィックス指定子を指定することはできません。 F2008

サブルーチン名は、再帰が指定されていないかぎり、サブルーチンの有効範囲内の他のステートメントに指定できません。

RECURSIVE キーワードは、以下の場合、直接に、または間接的に指定する必要があります。

v サブルーチンがそれ自身を呼び出す。

v サブルーチンが、同じサブプログラム内の ENTRY ステートメントによって定義されたプロシージャーを呼び出す。

v 同じサブプログラム内の入口プロシージャーが、それ自身を呼び出す。

v 同じサブプログラム内の入口プロシージャーが、同じサブプログラム内の他の入口プロシージャーを呼び出す。

v 同じサブプログラム内の入口プロシージャーが SUBROUTINE ステートメントによって定義されたサブプログラムを呼び出す。

RECURSIVE キーワードを指定する場合、プロシージャー・インターフェースは、サブプログラム内で明示的です。

PURE または ELEMENTAL プレフィックスを使用することは、副次作用がないためにサブルーチンをコンパイラーにより任意の順序で呼び出せることを示します。エレメント型プロシージャーの場合、キーワード ELEMENTAL を指定する必要があります。ELEMENTAL キーワードを指定した場合、RECURSIVE キーワードは指定できません。

SUBROUTINE ステートメントで RECURSIVE キーワードが指定されている場合、XL Fortran は -qrecur コンパイラー・オプションを無視しますが、このオプションを指定すると、外部プロシージャーを再帰的に呼び出せます。

BIND キーワードは、C プログラミング言語からプロシージャーにアクセスするのに使用される結合ラベルを暗黙的または明示的に定義します。仮引数は、サイズをゼロにできません。BIND 属性を持つプロシージャーの仮引数には、相互使用可能型および型パラメーターを指定する必要があります。ALLOCATABLE または POINTER 属性を指定することはできません。

SUBROUTINE ステートメントが、ダミー・プロシージャーを記述するインターフェース本体の一部である場合、NAME= 指定子があってはなりません。エレメント型プロシージャーには、BIND 属性を指定できません。

518 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 545: IBM XL Fortran for Linux, V15.1

F2008

モジュールまたはサブモジュールの有効範囲単位内で宣言された、モジュール・サブプログラムまたは非抽象インターフェース本体の SUBROUTINE ステートメントに対して、MODULE プレフィックス指定子を指定できます。 例 2 を参照してください。

v モジュール・サブプログラムの SUBROUTINE ステートメントに対してMODULE プレフィックス指定子を指定した場合、モジュール・サブプログラムは分離モジュール・プロシージャーです。

v 非抽象インターフェース本体の SUBROUTINE ステートメントに対してMODULE プレフィックス指定子を指定した場合、インターフェース本体はモジュール・プロシージャー・インターフェース本体です。

NAME= 指定子を持つ BIND 属性は、内部プロシージャーでは許可されません。

F2008

例 1RECURSIVE SUBROUTINE SUB(X,Y)

INTEGER X,YIF (X.LT.Y) THEN

RETURNELSE

CALL SUB(X,Y+1)END IF

END SUBROUTINE SUB

例 2 (Fortran 2008)MODULE m

! The MODULE prefix specifier is specified for the SUBROUTINE! statement of a module procedure interface body.INTERFACE

MODULE SUBROUTINE sub(arg)INTEGER :: arg

END SUBROUTINEEND INTERFACE

END MODULE

SUBMODULE (m) n

CONTAINS! The MODULE prefix specifier is specified for the SUBROUTINE! statement of a separate module procedure.MODULE SUBROUTINE sub(arg)

INTEGER :: argarg = 1

END SUBROUTINEEND SUBMODULE

関連情報v 206ページの『関数サブプログラムとサブルーチン・サブプログラム』

v 218ページの『仮引数』

v 233ページの『再帰』

v 336ページの『CALL』

v 397ページの『ENTRY』

第 11 章 ステートメントおよび属性 519

Page 546: IBM XL Fortran for Linux, V15.1

v 510ページの『ステートメント関数』

v 331ページの『BIND (Fortran 2003)』

v 502ページの『RETURN』

v 23ページの『変数の定義状況』

v 234ページの『純粋プロシージャー』

v 「XL Fortran コンパイラー・リファレンス」の『-qrecur オプション』

v 940ページの『プロシージャーの相互運用性』

v 199ページの『モジュール』

v 203ページの『サブモジュール (Fortran 2008)』

v 211ページの『分離モジュール・プロシージャー (Fortran 2008)』

TARGET目的

TARGET ステートメントによって、エンティティーの TARGET 属性を指定します。TARGET 属性を持つオブジェクトは、そのオブジェクトに関連付けられたポインターを持つことができます。

構文

規則v データ・オブジェクトが TARGET 属性を持つ場合、そのデータ・オブジェクトの非ポインター・サブオブジェクトのすべても TARGET 属性を持ちます。

v TARGET 属性を持たないデータ・オブジェクトは、アクセス可能なポインターに関連付けることができません。

v ターゲットは、EQUIVALENCE ステートメントに指定できません。

v ターゲットを、整数ポインターかポインティング先にすることはできません。

表 53. TARGET 属性と互換性のある属性

ALLOCATABLE �1� INTENT SAVE

ASYNCHRONOUS OPTIONAL STATIC �3�

AUTOMATIC �3� PRIVATE VALUE �1�

DIMENSION PROTECTED �1� VOLATILE

CONTIGUOUS �2� PUBLIC

�� �

,

TARGET variable_name:: ( array_spec )

��

520 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 547: IBM XL Fortran for Linux, V15.1

表 53. TARGET 属性と互換性のある属性 (続き)

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張

例REAL, POINTER :: A,BREAL, TARGET :: C = 3.14B => CA => B ! A points to C

関連情報v 472ページの『POINTER (Fortran 90)』v 637ページの『ALLOCATED(X)』v 367ページの『DEALLOCATE』v 144ページの『データ・ポインターの代入』v 178ページの『ポインター関連付け』

TYPE目的

TYPE 型宣言ステートメントによって、派生型のオブジェクトと関数の型、型パラメーター、および属性を指定します。初期値はオブジェクトに代入することができます。

F2008 TYPE 型宣言ステートメントでは、派生型と組み込み型の両方のエンティティーを宣言できます。 F2008

構文

ここで、

F2008 intrinsic_type_spec F2008

組み込みデータ型の名前です。詳しくは、 41ページの『第 3 章 組み込みデータ型』を参照してください。

��(1)

TYPE ( intrinsic_type_spec )derived_type_spec ::

, attr_spec_list ::

� entity_decl_list ��

注:

1 Fortran 2008

第 11 章 ステートメントおよび属性 521

Page 548: IBM XL Fortran for Linux, V15.1

derived_type_spec

拡張可能な派生型の名前です。詳しくは、 526ページの『型宣言』を参照してください。

派生型は、抽象にしないでください。

:: 二重コロン区切り文字です。属性が指定される場合、= constant_expr が使用される場合、または =>NULL() が entity_decl の一部として使用される場合は必須です。

attr_spec

以下のいずれかの属性になります。個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

ALLOCATABLE �1� INTRINSIC PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �2� PARAMETER STATIC �2�

BIND �1� POINTER TARGET

DIMENSION (array_spec) PRIVATE VALUE �1�

EXTERNAL PROTECTED �1� VOLATILE

INTENT (intent_spec)

注:�1� Fortran 2003

�2� IBM 拡張

ここで、

array_spec

次元範囲のリストです。

intent_spec

IN、OUT、または INOUT のいずれかになります。

entity_decl

ここで、

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数には指定できません。

�� a( array_spec ) (1)

/ initial_value_list /= constant_expr=> NULL()

��

注:

1 IBM 拡張.

522 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 549: IBM XL Fortran for Linux, V15.1

initial_value

すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。 363ページの『DATA』で、説明されるように初期化が起こります。

constant_expr

直前の名前によって指定されるエンティティーの定数式を指定します。

=> NULL()ポインター・オブジェクトの初期値を指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

v コンパイラーは、型定義の有効範囲単位内の constant_expr を評価します。

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

変数に constant_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。

派生型が定義されると、TYPE 型宣言ステートメントを使用して、データ項目を定義するために使用できます。エンティティーが、派生型から成ると明示的に宣言される場合、その派生型は、有効範囲単位で前に宣言されているか、使用関連付けまたはホスト関連付けによってアクセス可能になっている必要があります。

データ・オブジェクトは、派生型のオブジェクト か構造体 になります。それぞれの構造体コンポーネント は、派生型のオブジェクトのサブオブジェクトになります。

DIMENSION 属性を指定する場合、エレメントがその派生型のデータ型を持つ配列を作成します。

仕様ステートメント以外で、派生型のオブジェクトを実引数および仮引数として使用できます。また、それらは、入出力リスト (オブジェクトに POINTER 属性を持つコンストラクターがない場合)、代入ステートメント、構造体コンストラクター内の項目、およびステートメント関数定義の右側の部分として出現することもできます。構造体コンポーネントがアクセス可能でない場合、派生型オブジェクトを、入出力リスト内で、または構造体コンストラクターとして使用できません。

第 11 章 ステートメントおよび属性 523

Page 550: IBM XL Fortran for Linux, V15.1

非順序派生型のオブジェクトは、EQUIVALENCE および COMMON ステートメント内のデータ項目として使用できません。非順序データ型のオブジェクトは、整数ポインティング先にはできません。

非順序派生型の仮引数は、使用関連付けまたはホスト関連付けを介してアクセス可能な派生型を指定して、同じ派生型定義が実引数と仮引数の両方を定義していることを確認する必要があります。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。

オブジェクトが、仮引数、割り振り可能オブジェクト、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内では初期化できません。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通ブロックに現れる場合、 またはモジュール内あるいはサブモジュール内の名前付き共通ブロックに現れる場合は、オブジェクトを初期化できます 。

Fortran 95 では、ポインターを初期化できます。ポインターは、=> NULL() の使用によってのみ初期化できます。

array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

ステートメントに PARAMETER 属性が含まれている場合は、constant_expr を指定する必要があります。宣言するエンティティーが変数で、constant_expr またはNULL() が指定された場合、変数は最初に定義されます。

宣言するエンティティーが派生型コンポーネントで、constant_expr または NULL()が指定された場合、派生型はデフォルトの初期化値を持ちます。

a は、組み込み代入の規則に応じて、constant_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、constant_expr または NULL() の存在は、a が、名前付き共通域ブロック内のオブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。

ALLOCTABLE または POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

524 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 551: IBM XL Fortran for Linux, V15.1

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。派生型が関数の本体内で定義されているか、ホスト関連付けまたは使用関連付けを介してアクセス可能である場合、その派生型は、FUNCTION ステートメントに指定できます。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

例 1

以下のコードでは、TYPE 型宣言ステートメントを使用して、派生型 people を宣言します。

TYPE peopleINTEGER ageCHARACTER*20 name

END TYPE people

以下のステートメントでは、派生型 people の smith という名前のエンティティーを宣言します。

TYPE(people) :: smith = people(25,'John Smith')

F2008

例 2

この例では、TYPE() 型指定子を使用して、組み込み型のエンティティーを宣言する方法を示します。

TYPE(INTEGER) :: iTYPE(INTEGER(KIND=2)) :: i2TYPE(INTEGER(4)) :: i4

TYPE(CHARACTER(*)) :: cstarTYPE(CHARACTER*2) :: c2TYPE(CHARACTER(LEN=4,KIND=1)) :: c4TYPE(CHARACTER(7)) :: c7

TYPE derived(l)TYPE(INTEGER), LEN :: lTYPE(CHARACTER*l) :: clTYPE(COMPLEX), DIMENSION (l) :: cp

END TYPE derived

F2008

関連情報v 41ページの『第 3 章 組み込みデータ型』

v 55ページの『第 4 章 派生型』

v 369ページの『派生型』

v 114ページの『定数式』

v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』

v 86ページの『配列宣言子』

v 21ページの『自動オブジェクト』

第 11 章 ステートメントおよび属性 525

Page 552: IBM XL Fortran for Linux, V15.1

v 31ページの『変数のストレージ・クラス (IBM 拡張)』

型宣言目的

型宣言ステートメントによって、オブジェクトと関数の型、長さ、および属性を指定します。初期値はオブジェクトに代入することができます。

宣言タイプ仕様 (declaration_type_spec) は、実行不能ステートメント内で使用されます。

構文

パラメーターv intrinsic_type_spec は、以下のいずれかの型になります。

BYTE �1� INTEGER [kind_selector]

CHARACTER [char_selector] LOGICAL [kind_selector]

COMPLEX [kind_selector] REAL [kind_selector]

DOUBLE COMPLEX VECTOR (vector_type_spec) �1�

DOUBLE PRECISION

�1� IBM 拡張

型宣言ステートメント ( type_declaration_stmt )

�� declaration_type_spec::, attr_spec_list ::

entity_decl_list ��

ここで、declaration_type_spec は、以下のとおりです。

�� intrinsic_type_spec(1)

TYPE ( intrinsic_type_spec )TYPE ( derived_type_spec )

(2)TYPE ( * )

(3)CLASS ( derived_type_spec )

(4)CLASS ( * )

��

注:

1 Fortran 2008

2 TS 29113

3 Fortran 2003

4 Fortran 2003

526 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 553: IBM XL Fortran for Linux, V15.1

kind_selector

関連付けられた型の許される長さ指定の 1 つを表します。int_literal_constant は kind 型パラメーターを指定できません。

vector_type_spec

must specify PIXEL、kind 4 または 8 の REAL、または kind 1、2、4、または 8 の INTEGER または UNSIGNED を指定します。

char_selector

文字長を指定します。 XL Fortran で、これは、0 から 256 MB の間の文字数になります。256 MB を超える値は、256 MB に設定されます。一方、負の値は長さゼロとなります。指定しない場合、デフォルトの長さは1 です。指定した場合、kind 型パラメーターは 1 にする必要があります。これは、ASCII 文字表記を指定します。

int_constant_expr

1 に評価される必要があるスカラー整数定数式です。

char_length

スカラー整数リテラル定数 (これは、kind 型パラメーターを指定できません) または括弧で囲まれた type_param_value のいずれかになります。

v derived_type_spec は、特定の派生型パラメーターおよび型パラメーターの指定に使用します。

�� ( int_constant_expr )KIND =

(1)* int_literal_constant

��

注:

1 IBM 拡張.

�� ( LEN = type_param_value , KIND = int_constant_expr )type_param_value , int_constant_expr

KIND =KIND = int_constant_expr

, LEN = type_param_valuetype_param_value

LEN =* char_length

,

��

第 11 章 ステートメントおよび属性 527

Page 554: IBM XL Fortran for Linux, V15.1

type_param_specは、derived_type_spec 内の型パラメーター値のリスト出力に使用します。

キーワード (keyword)派生型定義ステートメントにリストされる派生型のパラメーターの名前です。各パラメーターの名前を type_param_spec_list に複数回指定することはできません。 CLASS キーワードと一緒に使用する場合、型は拡張可能にしておく必要があります。TYPE キーワードを一緒に使用する場合は、型を抽象にしないでください。

type_param_valueコロン (:)、アスタリスク (*)、または整数スカラー式です。kind 型パラメーターの場合は、対応する type_param_value が整数定数式でなければなりません。

derived_type_spec 内では、length 型パラメーター用の整数式のtype_param_value は、宣言式でなければなりません。据え置き length 型パラメーターを示すコロンは、POINTER または ALLOCATABLE 属性のいずれかを持つエンティティーの length パラメーターにのみ使用できます。この場合、据え置き型パラメーターの値は、ALLOCATE ステートメント、組み込みの代入ステートメント、またはポインター代入ステートメントによって、プログラムの実行中に決定されます。type_param_value としてアスタリスクを指定する場合、想定される length 型パラメーターを示します。想定される length 型パラメーターを持つ derived_type_spec は、仮引数を示し、想定される型パラメーターの値は、対応する実引数の値になります。

注: また、type_param_value は、SELECT TYPE 構文、ALLOCATE ステートメント、または配列コンストラクター内に設定された type_spec 内でも使用されます。type_spec では、length 型パラメーターの値を示すtype_param_value を宣言式にする必要はありません。

v attr_spec は、以下のいずれかの属性になります。個々の属性に関する規則について詳しくは、同じ名前のステートメントを参照してください。

ALLOCATABLE �1� PARAMETER

ASYNCHRONOUS POINTER

AUTOMATIC �2� PRIVATE

BIND (C[, NAME=binding_label]) �1� PROTECTED �1�

CONTIGUOUS �3� PUBLIC

DIMENSION (array_spec) SAVE

EXTERNAL STATIC �2�

�� type_name( type_param_spec_list )

��

ここで、type_param_spec は、次のようになります。

��keyword =

type_param_value ��

528 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 555: IBM XL Fortran for Linux, V15.1

INTENT (intent_spec) TARGET

INTRINSIC VALUE �1�

OPTIONAL VOLATILE

注:�1� Fortran 2003

�2� IBM 拡張�3� Fortran 2008

intent_spec

IN、OUT、または INOUT のいずれかになります。

* アスタリスク標識です。 TS 29113 TYPE (*) TS 29113 または CLASS(*)

で宣言されたエンティティーは、無制限ポリモアフィックです。制約のないポリモアフィック・エンティティーは、型を持つように宣言されません。また、制約のない別のポリモアフィック・エンティティーを含む、他のエンテ

ィティーと同じ宣言済み型を持つと考えられません。 TS 29113 TYPE (*)

は、C 関数と相互運用するための、想定型オブジェクトの宣言に使用されま

す。 TS 29113

:: 二重コロン区切り文字です。属性、=constant_expr、または => NULL() を指定する場合は、二重コロン区切り文字を使用します。

array_spec

次元範囲のリストです。

entity_decl

a オブジェクト名または関数名です。array_spec は、暗黙的インターフェースを持つ関数には指定できません。

char_length (IBM 拡張)kind_selector および char_selector で指定されたように長さをオーバーライドして、長さを初期キーワードで指定できるステートメント内でのみ使用できます。文字エンティティーは、上記に定義されるように char_length を指定できます。非文字エンティティーは、関連型の許される長さ指定の 1 つを表す整数リテラル定数を指定できます。

�� a* char_length ( array_spec )

( array_spec ) * char_length

�(1)

/ initial_value_list /= constant_expr=> NULL()

��

注:

1 IBM 拡張

第 11 章 ステートメントおよび属性 529

Page 556: IBM XL Fortran for Linux, V15.1

initial_value (IBM 拡張)すぐ前に来る名前によって指定されるエンティティーの初期値を指定します。

constant_expr

直前の名前によって指定されるエンティティーの定数式を指定します。

=> NULL()ポインター・オブジェクトの初期値を指定します。

規則

派生型定義のコンテキスト内で、

v => がコンポーネント初期化で現れる場合、POINTER 属性は attr_spec_list に指定する必要があります。

v = が、コンポーネント初期化で現れる場合、POINTER 属性は、コンポーネントattr_spec_list に指定できません。

v コンパイラーは、型定義の有効範囲単位内の constant_expr を評価します。

変数に => が現れる場合、オブジェクトに POINTER 属性を指定する必要があります。

変数に constant_expr が現れる場合、オブジェクトには POINTER 属性を指定できません。

型宣言ステートメント内のエンティティーは、対応する属性ステートメントで説明されているように、エンティティーに指定された任意の属性の規則によって制約されます。

型宣言ステートメントは、暗黙的な型の規則を実質上オーバーライドします。組み込み関数の型を確認する型宣言ステートメントを使用できます。一般または特定の組み込み関数の名前が型宣言ステートメント内に現れても、名前がその組み込みプロパティーを失うことはありません。

オブジェクトが、仮引数、割り振り可能オブジェクト、関数結果、無名共通ブロック内のオブジェクト、整数ポインター、外部名、組み込み名、または自動オブジェクトの場合、そのオブジェクトを型宣言ステートメント内では初期化できません。AUTOMATIC 属性がある場合も、オブジェクトは初期化できません。オブジェクトが、ブロック・データ・プログラム単位内の名前付き共通ブロックに現れる場合、 またはモジュール内あるいはサブモジュール内の名前付き共通ブロックに現れる場合は、オブジェクトを初期化できます 。

Fortran 95 では、ポインターを初期化できます。ポインターは、=> NULL() の使用によってのみ初期化できます。

type_param_value または array_spec の宣言式は、宣言式がインターフェース本体またはサブプログラムの仕様部分に現れる場合、定数以外の式にできます。この定数以外の式を使用し、仮引数またはポインティング先でない宣言済みオブジェクトを、自動オブジェクトと呼びます。

属性は、任意の型宣言ステートメント内で繰り返せません。また、1 つの有効範囲単位内で、エンティティーに同じ属性を明示的に複数指定できません。

530 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 557: IBM XL Fortran for Linux, V15.1

ステートメントに PARAMETER 属性が含まれている場合は、constant_expr を指定する必要があります。宣言するエンティティーが変数で、constant_expr またはNULL() が指定された場合、変数は最初に定義されます。

宣言するエンティティーが派生型コンポーネントで、constant_expr または NULL()が指定された場合、派生型はデフォルトの初期化値を持ちます。

a は、組み込み代入の規則に応じて、constant_expr で判別された値で定義されます。エンティティーが配列の場合、その形状を、同じ有効範囲単位にある型宣言ステートメント、または前の仕様ステートメントのいずれかに指定する必要があります。変数または変数サブオブジェクトは、一度しか初期化できません。a が変数の場合、constant_expr または NULL() の存在は、a が、名前付き共通域ブロック内のオブジェクト以外の保存オブジェクトだということを意味します。オブジェクトの初期化は、オブジェクトの基本的なストレージ・クラスに影響を与えることがあります。

entity_decl に指定された array_spec は、DIMENSION 属性の array_spec より優先されます。

ALLOCATABLE または POINTER 属性を持たない配列関数結果には、明示的形状配列仕様が必要です。

宣言されたエンティティーが関数の場合、組み込み関数でないかぎり、アクセス可能な明示的インターフェースを持たせないでください。

定数の名前として前に定義された T または F が型宣言ステートメントに現れる場合、それは、省略された論理定数ではなく、名前付き定数の名前になります。

ステートメント内に二重コロン区切り文字 (::) がない場合にのみ、CHARACTER型宣言ステートメント内の char_length の後に、オプションのコンマを入れることができます。

CHARACTER 型宣言ステートメントが、コロンの長さを指定する場合、length 型パラメーターは、据え置き型パラメーター です。据え置き型パラメーターを持つエンティティーまたはコンポーネントには、ALLOCATABLE またはPOINTER 属性を指定する必要があります。据え置き型パラメーターは、プログラムの実行中に値を変更できる長さ (length) 型パラメーターです。

CHARACTER 型宣言ステートメントが、モジュール、 F2008 サブモジュールF2008 、ブロック・データ・プログラム単位、またはメインプログラムの有効範囲単位内にあって、エンティティーの長さを継承された長さで指定する場合、エンティティーは、名前付き文字定数の名前にする必要があります。文字定数には、それに対応する PARAMETER 属性で定義された式の長さが取られます。

CHARACTER 型宣言ステートメントが、プロシージャーの有効範囲にあり、エンティティーの長さが継承されている場合、エンティティー名は、仮引数か名前付き文字定数の名前にする必要があります。ステートメントが、外部関数の有効範囲にある場合、そのステートメントを、同じプログラム単位内の FUNCTION またはENTRY ステートメント内の関数または入口名にすることもできます。エンティティー名が、仮引数の名前の場合、仮引数には、プロシージャーの個々の参照のため

第 11 章 ステートメントおよび属性 531

Page 558: IBM XL Fortran for Linux, V15.1

に、関連する実引数の長さが取られます。エンティティー名が文字定数の名前の場合は、文字定数には、PARAMETER 属性によって定義された対応する式の長さが取られます。エンティティー名が関数または入口名の場合、エンティティーには、呼び出し側の有効範囲単位に指定された長さが取られます。

文字関数の長さは、宣言式にできます (これは、関数型がインターフェース・ブロックで宣言されていない場合、定数式にする必要があります。) あるいは、ダミー・プロシージャー名の長さを示すコロンかアスタリスクになります。関数が内部関数またはモジュール関数の場合、再帰的な場合、または配列かポインター値を返す場合は、長さにアスタリスクを使用することはできません。

例CHARACTER(KIND=1,LEN=6) APPLES /'APPLES'/CHARACTER*7, TARGET :: ORANGES = 'ORANGES'CALL TEST(APPLES)

SUBROUTINE TEST(VARBL)CHARACTER*(*), OPTIONAL :: VARBL ! VARBL inherits a length of 6

COMPLEX, DIMENSION (2,3) :: ABC(3) ! ABC has 3 (not 6) array elementsREAL, POINTER :: XCONST

TYPE PEOPLE ! Defining derived type PEOPLEINTEGER AGECHARACTER*20 NAME

END TYPE PEOPLETYPE(PEOPLE) :: SMITH = PEOPLE(25,'John Smith')

END SUBROUTINE

以下の例は、派生型を使用した宣言内の派生型パラメーターの使用法を示しています。型定義自体については、 369ページの『派生型』の例を参照してください。

! Use of the types declared in the example in section Derived type.TYPE(MULTIDIM(8,3)) :: LOCATION = MULTIDIM(8,3)([1.1_8,2.2_8,3.3_8])TYPE(NAMED_MULTI(8,3,12)) :: MY_SPOT

= NAMED_MULTI(8,3,12)([REAL(8):: 1.1,2.2,3.3],"You are here")

! "PEOPLE" can be defined using type parameters:TYPE PEOPLE (AGE_KIND, NAME_LEN)

INTEGER, KIND :: AGE_KINDINTEGER, LEN :: NAME_LENINTEGER(AGE_KIND) :: AGECHARACTER(NAME_LEN) :: NAME

END TYPE PEOPLE

! Use integer(2) for age, character(20) for name:TYPE (PEOPLE(2,20)) :: SMITH = PEOPLE(2,20)(25,'John Smith')

! Use integer(1) for age, deferred length for name:TYPE (PEOPLE(1,:)), ALLOCATABLE :: JDOE! Actually allocate JDOE with a name of length 8 using implicit allocation:JDOE = PEOPLE(1,8)(22, "John Doe")! Explicitly deallocate and reallocate JDOE with a different length:DEALLOCATE(JDOE)ALLOCATE(PEOPLE(1,15) :: JDOE)

以下の例では、ベクトルの宣言を示します。

VECTOR (REAL(4)) :: vector_object

532 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 559: IBM XL Fortran for Linux, V15.1

関連情報v 114ページの『定数式』v TYPE

v 暗黙的な型の決定の規則に関しての詳細は、 20ページの『型の決定』v 86ページの『配列宣言子』v 21ページの『自動オブジェクト』v 31ページの『変数のストレージ・クラス (IBM 拡張)』v 初期値に関しての詳細は、 363ページの『DATA』v 22ページの『ポリモアフィック・エンティティー (Fortran 2003)』v 346ページの『CLASS (Fortran 2003)』

保護型 (Fortran 2003)目的

型保護ステートメントによって、SELECT TYPE 構文内の型保護ステートメント・ブロックを開始します。SELECT TYPE 構文には、ステートメント・ブロックをいくつでも入れることができますが、実行には、その中の 1 つが選択されます。選択は、SELECT TYPE ステートメント内の式 - セレクター - の動的型および kind

型パラメーター、各型保護ステートメントの型および対応する kind 型パラメーターに基づいています。

構文

type_spec

拡張可能な派生型、または組み込み型にする必要があります。length 型パラメーターを想定する必要があります。

select_construct_name

SELECT TYPE 構文を識別する名前です。

規則

SELECT TYPE ステートメントのセレクターが制限のないポリモアフィックでない場合、type_spec は、セレクターの宣言された型の拡張を指定する必要があります。

単一の SELECT TYPE 構文の場合、同じ型および kind 型パラメーター値をTYPE IS 型保護ステートメントに複数指定したり、CLASS IS 型保護ステートメントに複数指定する必要はありません。

CLASS DEFAULT 型保護ステートメントは、SELECT TYPE 構成内に一度のみ指定できます。

select_construct_name を指定する場合、SELECT TYPE および END SELECT ステートメントで指定された名前に一致させる必要があります。

�� TYPE IS ( type_spec )CLASS IS ( type_spec )CLASS DEFAULT

select_construct_name��

第 11 章 ステートメントおよび属性 533

Page 560: IBM XL Fortran for Linux, V15.1

関連情報

v 163ページの『SELECT TYPE 構文 (Fortran 2003)』

v 508ページの『SELECT TYPE (Fortran 2003)』

v END SELECT ステートメントに関しての詳細は、 389ページの『END (構文)』

USE目的

USE ステートメントは、モジュールのパブリック・エンティティーへのローカル・アクセスを提供するモジュール参照です。

構文

rename 以下の通りです。

v ローカル名をアクセス可能データ・エンティティーに割り当てます。local-name => use-name

v 使用で定義された演算子をローカルで定義された演算子に名前変更します。OPERATOR(local-defined-operator) =>

OPERATOR(use-defined-operator)

only rename、一般仕様、あるいは、変数、プロシージャー、派生型、名前付き定数、または名前リストの名前です。

規則

USE ステートメントは、specification_part 内で他のステートメントすべての前にのみ指定できます。複数の USE ステートメントを、1 つの有効範囲単位内に指定できます。

USE ステートメントを含むファイルがコンパイルされる時点で、指定されたモジュールがそのファイル内の USE ステートメントの前に置かれているか、またはそのモジュールが他のファイルで既にコンパイルされている必要があります。各参照エンティティーは、モジュール内でパブリック・エンティティーにする必要があります。

有効範囲単位内のエンティティーは、モジュール・エンティティーに使用で関連付けられて、ローカル・エンティティーは、対応するモジュール・エンティティーの属性を持ちます。

�� USE module_name(1) , rename_list

:: , ONLY :, INTRINSIC only_list

NON_INTRINSIC

��

注:

1 Fortran 2003 標準

534 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 561: IBM XL Fortran for Linux, V15.1

Fortran 2003

デフォルトで、指定した名前を持つ組み込みモジュールまたは非組み込みモジュールがアクセスされます。組み込みモジュールおよび非組み込みモジュールの両方がこの名前を持つ場合、非組み込みモジュールがアクセスされます。INTRINSIC または NON_INTRINSIC を指定する場合、組み込みモジュールのみ、または非組み込みモジュールのみにアクセスできます。

rename-list または only-list で演算子の名前変更を行う場合、use-defined-operator

は、USE ステートメントを含む有効範囲単位の local-defined-operator によって識別されます。その演算子は、USE ステートメントで指定したモジュール内の一般結合でないパブリック・エンティティーにする必要があります。

Fortran 2003 の終り

PRIVATE 属性に加えて、USE ステートメントの ONLY 節によって、モジュール・エンティティーにアクセスできる詳細制約を指定します。ONLY 節を指定する場合、only_list 内で指定されたエンティティーのみがアクセス可能です。キーワードの後にリストが続かない場合、モジュール・エンティティーにアクセスできません。 ONLY 節がない場合、すべてのパブリック・エンティティーにアクセスできます。

有効範囲単位に、すべてが同じモジュールを指定する複数の USE ステートメントが含まれていて、ステートメントの 1 つに、ONLY 節が含まれていない場合、すべてのパブリック・エンティティーにアクセスできます。各 USE ステートメントに ONLY 節が含まれている場合、1 つ以上の only_lists で指定されたエンティティーのみにアクセスできます。

ローカル使用のためにアクセス可能なエンティティーを名前変更できます。モジュール・エンティティーは、複数のローカル名によってアクセスできます。名前変更が指定されない場合、使用で関連付けられたエンティティーの名前は、ローカル名になります。使用で関連付けられたエンティティーのローカル名は、再宣言できません。しかし、USE 使用を、モジュールの有効範囲単位内に指定する場合、ローカル名を PUBLIC または PRIVATE ステートメントで指定できます。

有効範囲単位にアクセス可能な、複数の一般インターフェースが、同じローカル名、演算子、または割り当てを持つ場合、単一の一般インターフェースとして処理されます。このような場合、一般インターフェースの 1 つに、同じ名前を持つアクセス可能なプロシージャーへのインターフェース本体を入れることができます。それ以外では、使用で関連付けられた 2 つの異なるエンティティーは、名前が有効範囲単位内のエンティティーを参照するのに使用されない場合にかぎり、同じ名前を持つことができます。使用で関連付けられたエンティティーおよびホスト・エンティティーが同じ名前を共用している場合、ホスト・エンティティーは、その名前によるホスト関連付けを介してアクセス不能になります。

アクセスされるエンティティーは、モジュール内に指定された属性を持ちます。例外は、関連モジュール・エンティティーが持っていなくても、エンティティーが異なるアクセス可能性属性を持っているか、ローカルの有効範囲単位内に VOLATILE属性を持っている可能性があるということです。

第 11 章 ステートメントおよび属性 535

Page 562: IBM XL Fortran for Linux, V15.1

モジュールが、それ自身を、直接にまたは間接的に参照しないようにしてください。例えば、モジュール X は、モジュール Y がモジュール X を参照する場合、モジュール Y を参照できません。

モジュール (例えば、モジュール B) が、他のモジュール (例えば、A) のパブリック・エンティティーに、使用関連付けを介してアクセスがある状態を考えます。モジュール B のローカル・エンティティー (これには、モジュール A からのエンティティーに、使用で関連付けられたエンティティーが含まれています) から他のプログラム単位へのアクセス可能性は、PRIVATE および PUBLIC 属性によって決定されます。あるいはこれらがない場合、モジュール B のデフォルトのアクセス可能性を介して判別されます。もちろん、他のプログラム単位は、モジュール A のパブリック・エンティティーに直接にアクセスできます。

例MODULE A

REAL :: X=5.0END MODULE AMODULE B

USE APRIVATE :: X ! X cannot be accessed through module BREAL :: C=80, D=50

END MODULE BPROGRAM TEST

INTEGER :: TX=7CALL SUBCONTAINS

SUBROUTINE SUBUSE B, ONLY : CUSE B, T1 => CUSE B, TX => C ! C is given another local nameUSE APRINT *, TX ! Value written is 80 because use-associated

! entity overrides host entityEND SUBROUTINE

END

例: 定義済み演算子の名前変更 (Fortran 2003)

module temptype real_numreal :: xend type

interface operator (.add.)module procedure real_addend interface

containsfuntion real_add(a,b)type(real_num) :: real_addtype(real_num), intent(in) :: a,breal_add%x = a%x+b%xend function real_add

end module

program mainuse temp , operator(.plus.) => operator(.add.)type(real_num) :: a,b,cc=a.plus.bend program

536 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 563: IBM XL Fortran for Linux, V15.1

例: 演算子にプライベート属性があるので無効

module temptype real_numreal :: xend type

interface operator (.add.)module procedure real_addend interface

private :: operator(.add.) !operator is given the private attribute

containsfunction real_add(a,b)type(real_num) :: real_addtype(real_num), intent(in) :: a,breal_add%x = a%x+b%xend function real_add

contains

end module

program main!operator cannot be renamed because it has a private attribute.use temp , operator(.plus.) => operator(.add.)type(real_num) :: a,b,cc=a.plus.bend program

次の例は無効です。

Module mod1use, intrinsic :: ieee_exceptions

end Module

Module mod2use, non_intrinsic :: ieee_exceptions

end Module

Program invalid_exampleuse mod1use mod2

! ERROR: a scoping unit must not access an! intrinsic module and a non-intrinsic module! with the same name.

end program

関連情報v 199ページの『モジュール』

v 478ページの『PRIVATE』

v 540ページの『VOLATILE』

v 486ページの『PUBLIC』

v 17ページの『ステートメントの順序および実行シーケンス』

第 11 章 ステートメントおよび属性 537

Page 564: IBM XL Fortran for Linux, V15.1

VALUE (Fortran 2003)目的

VALUE 属性によって、仮引数と実引数間の引数関連を指定します。この関連によって、仮引数に実引数の値を渡すことができます。この Fortran 2003 の値による受け渡しインプリメンテーションによって、%VAL 組み込み関数への標準準拠オプションを指定します。

実引数および関連仮引数は、独自に変更できます。仮引数の値または定義状況への変更は、実引数に影響を与えません。VALUE 属性を持つ仮引数は、実引数の値に等しい初期値を持つ一時変数に関連付けられます。

構文

規則

仮引数に対してのみ VALUE 属性を指定する必要があります。

%VAL または %REF 組み込み関数を使用して、VALUE 属性を持つ仮引数、および関連実引数を参照しないでください。

VALUE 属性を持つ仮引数がある参照プロシージャーには、明示的インターフェースが必要です。

VALUE 属性を持つ仮引数は、文字型から成っている可能性があります。

VALUE 属性は、以下のアイテムに対して指定してはいけません。:

v ダミー・プロシージャー

v ポリモアフィック項目

vTS 29113 想定ランクオブジェクト TS 29113

F2008 VALUE 属性は、想定形状または明示形状を持つ配列仮引数で指定できます。ただし、据え置き形状、想定形状、または暗黙形状を持つ配列仮引数でVALUE 属性を指定することはできません。 F2008

表 54. VALUE 属性と互換性のある属性

INTENT(IN) OPTIONAL TARGET

仮引数に VALUE と TARGET 属性の両方がある場合、その仮引数に関連付けられたポインターは、プロシージャーの実行後、未定義になります。

�� VALUE dummy_argument_name_list::

��

538 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 565: IBM XL Fortran for Linux, V15.1

例Program validexm1

integer :: x = 10, y = 20print *, 'before calling: ', x, ycall intersub(x, y)print *, 'after calling: ', x, y

containssubroutine intersub(x,y)

integer, value :: xinteger yx = x + yy = x*yprint *, 'in subroutine after changing: ', x, y

end subroutineend program validexm1

予期される出力は、次のとおりです。

before calling: 10 20in subroutine after changing: 30 600after calling: 10 600

関連情報

90ページの『想定形状配列』

87ページの『明示的形状配列』

%VAL

VECTOR (IBM 拡張)目的

VECTOR 型宣言ステートメントによって、1 つ以上のエンティティーがベクトル型を持つことを指定します。

構文

型宣言ステートメントの一部として、VECTOR(type_spec) を使用することでベクトルを宣言できます。型宣言ステートメントには、ベクトル・データ型を宣言するための完全な構文が含まれています。 VECTOR(type_spec) の type_spec には、PIXEL、kind 4 または 8 の REAL、もしくは kind 1、2、4、または 8 のINTEGER または UNSIGNED を指定する必要があります。

VIRTUAL (IBM 拡張)目的

VIRTUAL ステートメントによって、配列の名前と次元を指定します。これは、VIRTUAL 属性はないけれども、DIMENSION ステートメントの代替形式です。

構文

第 11 章 ステートメントおよび属性 539

Page 566: IBM XL Fortran for Linux, V15.1

array_declarator_list

配列のランクを指定するか、配列のランクと形状を指定する、配列宣言子のリストです。

規則

配列は、最大 20 次元まで指定できます。

配列名に対して、1 つの配列仕様のみを、有効範囲単位に指定できます。

例VIRTUAL A(10), ARRAY(5,5,5), LIST(10,100)VIRTUAL ARRAY2(1:5,1:5,1:5), LIST2(I,M) ! adjustable arrayVIRTUAL B(0:24), C(-4:2), DATA(0:9,-5:4,10)VIRTUAL ARRAY (M*N*J,*) ! assumed-size array

関連情報v 85ページの『第 5 章 配列の概念』v 371ページの『DIMENSION』

VOLATILE目的

VOLATILE 属性は、独立した入出力処理、および、独立した非同期割り込み処理によってアクセスできるメモリーにマップされるデータ・オブジェクトを指定するのに使用されます。VOLATILE データ・オブジェクトを取り扱うコードは最適化されません。

構文

規則

配列名が VOLATILE と宣言される場合、配列の各エレメントは VOLATILE とみなされます。共通ブロックが VOLATILE と宣言されると、共通ブロック内の変数が VOLATILE とみなされます。共通ブロックのエレメントは、共通ブロック内の他のエレメントの状況に影響を与えずに VOLATILE と宣言できます。

�� VIRTUAL array_declarator_list ��

�� �

,

VOLATILE variable_name:: / common_block_name /

derived_type_name

��

540 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 567: IBM XL Fortran for Linux, V15.1

複数の有効範囲で共通ブロックが宣言され、その共通ブロック (または 1 つ以上のそのエレメント) がそれらの有効範囲の 1 つで VOLATILE と宣言される場合、VOLATILE とみなされる共通ブロック (または 1 つ以上のそのエレメント) を必要とする有効範囲それぞれに VOLATILE 属性を指定する必要があります。

派生型名が VOLATILE と宣言される場合、その型を使用して宣言されるすべての変数は、VOLATILE とみなされます。派生型のオブジェクトが VOLATILE と宣言される場合、そのコンポーネントのすべてのが VOLATILE とみなされます。派生型のコンポーネント、それ自身が派生された場合、そのコンポーネントは、型からの VOLATILE 属性は継承しません。VOLATILE と宣言された派生型名は、型宣言ステートメント内の型名の使用の前に、VOLATILE 属性を持つ必要があります。

ポインターが VOLATILE と宣言される場合、ポインターのストレージ、それ自身が VOLATILE とみなされます。VOLATILE 属性は、関連ポインター・ターゲットに影響を与えません。

オブジェクトを VOLATILE と宣言し、そのオブジェクトを EQUIVALENCE ステートメントで使用する場合、等価関連を介して、VOLATILE オブジェクトに関連付けられたオブジェクトのすべてのが VOLATILE とみなされます。

スレッド間で共有され、複数のスレッドにより保存され読み取られるデータ・オブジェクトは VOLATILE として宣言する必要があります。しかし、プログラムが、コンパイラーの自動またはディレクティブ・ベースの並列化機能のみを使用する場合、SHARED 属性を持つ変数は、VOLATILE と宣言される必要はありません。

仮引数に関連付けられた実引数が、VOLATILE と宣言された変数の場合、仮引数をVOLATILE とみなす必要があれば、仮引数を VOLATILE と宣言する必要があります。仮引数が VOLATILE と宣言され、関連実引数を VOLATILE とみなす必要がある場合、実引数を VOLATILE として宣言する必要があります。

ステートメント関数を VOLATILE として宣言しても、ステートメント関数には何の影響もありません。

関数サブプログラム内で、関数結果変数は VOLATILE と宣言できます。入口結果変数は VOLATILE とみなされます。ENTRY 名は、VOLATILE 属性を使用して指定しないでください。

F2008 BLOCK 構文内のオブジェクトには、そのオブジェクトに BLOCK 構文外で VOLATILE 属性が設定されているかどうかにかかわらず、VOLATILE 属性を設定できます。 F2008

Fortran 2003

-qxlf2003=volatile の使用

実引数が、配列セクションか想定形状配列で、対応する仮引数に VOLATILE 属性がある場合、その仮引数は、想定形状配列になります。

実引数が、ポインター配列で、対応する仮引数に VOLATILE 属性がある場合、その仮引数は、想定形状配列かポインター配列になります。

第 11 章 ステートメントおよび属性 541

Page 568: IBM XL Fortran for Linux, V15.1

実引数が、ベクトル添え字を持つ配列セクションの場合、仮引数は、定義不可能で、VOLATILE 属性を持ちません。

ホストで関連付けられたエンティティーは、同じ名前で知られていて、ホストでの場合と同じ属性を持ちます。例外は、ホスト・エンティティーが VOLATILE 属性を持っていなくても、アクセスされるエンティティーは、持っている可能性があるということです。

内部プロシージャーまたはモジュール・プロシージャーで、ホスト関連付けを介してアクセス可能な変数が、VOLATILE ステートメント内に指定された場合、そのホスト変数には、ローカルの有効範囲内の VOLATILE 属性が与えられます。

使用で関連付けられたエンティティーは、関連モジュール・エンティティーが持っていなくても、ローカルの有効範囲単位内に、VOLATILE 属性を持っている可能性があります。

Fortran 2003 の終り

表 55. VOLATILE 属性と互換性のある属性

ALLOCATABLE �1� INTENT PUBLIC

ASYNCHRONOUS OPTIONAL SAVE

AUTOMATIC �3� POINTER STATIC �3�

CONTIGUOUS �2� PRIVATE TARGET

DIMENSION PROTECTED �1�

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張

例FUNCTION TEST ()

REAL ONE, TWO, THREECOMMON /BLOCK1/A, B, C...VOLATILE /BLOCK1/, ONE, TEST

! Common block elements A, B and C are considered volatile! since common block BLOCK1 is declared volatile.

...EQUIVALENCE (ONE, TWO), (TWO, THREE)

! Variables TWO and THREE are volatile as they are equivalenced! with variable ONE which is declared volatile.

END FUNCTION

関連情報v 243ページの『直接アクセス』

WAIT (Fortran 2003)目的

WAIT ステートメントを使用して、非同期データ転送が完了するのを待機するか、非同期データ転送ステートメントの完了状況を検出できます。

542 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 569: IBM XL Fortran for Linux, V15.1

構文

wait_list

1 つの ID= 指定子と、他の有効な指定子の、多くて、それぞれのうちの 1

つを含める必要があるリストです。有効な指定子は、次のとおりです。

ASYNCHRONOUS=char_expr (Fortran 2003)データ転送が完了するのを待たずに、実行を継続できます。char_expr は、YES または NO として評価されるスカラー文字式です。

DONE= 指定子を指定した場合、ID= 指定子も指定する必要があります。ID= 指定子を指定した場合、指定したデータ転送処理の待機命令が実行されます。 ID= 指定子がない場合、指定した装置に対して、すべての保留データ転送の待機命令が実行されます。ファイル位置決めステートメントの実行により、指定した装置のすべての保留非同期データ転送処理のために待機命令を実行します。

DONE= logical_variable

非同期入出力ステートメントが完了したかどうかを指定します。 DONE=指定子がある場合、非同期入出力が完了すると logical_variable は真に設定され、完了しないと偽が設定されます。戻り値が偽の場合、1 つ以上のWAIT ステートメントを、DONE= 指定子がなくなるか、戻り値が真になるまで、実行する必要があります。DONE= 指定子がない WAIT ステートメント、または logical_variable 値を真に設定した WAIT ステートメントは、同じ ID= 値によって識別されるデータ転送ステートメントに一致するWAIT ステートメントです。

END= stmt_label

ファイル終了レコードが検出されて、エラーが発生しない場合に、プログラムが続行されるステートメント・ラベルを指定するファイル終了指定子です。外部ファイルが、ファイル終了レコードの後に置かれる場合、IOSTAT= 指定子があれば、負の値が割り当てられ、NUM= 指定子があれば、整数値が割り当てられます。END= 指定子のコーディングによって、ファイルの終わりのエラー・メッセージを抑制します。この指定子は、順次アクセスまたは直接アクセスのいずれかに関連付けられた装置に対して指定できます。

非同期データ転送ステートメントの END= 指定子に定義された stmt_label

は、対の WAIT ステートメントの END= 指定子に定義された stmt_label

と同じである必要はありません。

ERR= stmt_label

エラー指定子です。これは、エラーが発生した場合に、制御の転送先と同じ有効範囲単位内にある実行可能ステートメントのステートメント・ラベルを指定します。ERR= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

�� WAIT ( wait_list ) ��

第 11 章 ステートメントおよび属性 543

Page 570: IBM XL Fortran for Linux, V15.1

非同期データ転送ステートメントの ERR= 指定子に定義された stmt_label

は、対の WAIT ステートメントの ERR= 指定子に定義された stmt_label

と同じである必要はありません。

ID= integer_expr

この WAIT ステートメントを識別するデータ転送を示します。integer_expr

は、INTEGER(4) 型かデフォルトの整数型の整数式です。非同期データ転送を開始するには、ID= 指定子を、READ または WRITE ステートメントで使用します。

IOMSG= iomsg_variable

入出力状況指定子です。これは、入出力操作によって戻されるメッセージを指定します。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

v エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

v このような条件が発生しない場合は、変数の値は変更されません。

IOSTAT= ios

入出力状況指定子です。これは、入出力操作の状況を指定します。ios は、整変数です。この指定子を含む入出力ステートメントが実行を終了する時、ios は、以下の値で定義されます。

v エラー条件が発生しない場合はゼロ値

v エラーが発生した場合は正の値

v ファイル終了条件が検出されて、エラーが発生しない場合は負の値

非同期データ転送ステートメントの IOSTAT= 指定子に定義された ios

は、WAIT ステートメントの IOSTAT= 指定子に定義された ios と同じである必要はありません。

規則

対の WAIT ステートメントは、対応する非同期データ転送ステートメントと同じ有効範囲単位内に置く必要があります。その有効範囲単位のインスタンス内で、対のWAIT ステートメントが実行される前に、プログラムが、RETURN、END またはSTOP ステートメントを実行しないようにしてください。

関連情報v 248ページの『非同期入出力』

v 「XL Fortran 最適化およびプログラミング・ガイド」に記載される『XL Fortran

入出力の実装詳細』

544 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 571: IBM XL Fortran for Linux, V15.1

WHERE目的

WHERE ステートメントによって、配列代入ステートメント内の式および値の代入の評価をマスクします。論理配列式の値に従ってこれは行われます。WHERE ステートメントは、WHERE 構文の初期ステートメントにできます。

構文

mask_expr

論理配列式です。

where_construct_name

WHERE 構文を識別する名前です。

規則

where_assignment_statement がある場合、WHERE ステートメントは、WHERE 構文の最初のステートメントではありません。where_assignment_statement がない場合、WHERE ステートメントは、WHERE 構文の最初のステートメントで、WHERE 構文ステートメントとして参照されます。END WHERE ステートメントを続ける必要があります。詳しくは、 133ページの『WHERE 構文』を参照してください。

WHERE ステートメントが、WHERE 構文の最初のステートメントでない場合、DO または DO WHILE 構文の終端ステートメントとしてそれを使用できます。

WHERE ステートメントを WHERE 構文内にネストできます。定義済み代入である where_assignment_statement は、エレメント型定義済み代入にする必要があります。

各 where_assignment_statement では、mask_expr と、定義される変数 variable は、同じ形状の配列でなければなりません。WHERE 構文内の各 mask_expr は、同型を持つ必要があります。

where_body_construct に含まれる WHERE ステートメントは、分岐ターゲット・ステートメントにすることはできません。

WHERE ステートメントの mask_expr 内の関数参照の実行は、where_assignment_statement 内のエンティティーに影響を与えることがあります。

マスク式の解釈については、 136ページの『マスクされた配列代入の解釈』を参照してください。

�� WHERE ( mask_expr )where_construct_name : where_assignment_statement

��

第 11 章 ステートメントおよび属性 545

Page 572: IBM XL Fortran for Linux, V15.1

where_construct_name を、WHERE 構文ステートメントに指定する場合、対応するEND WHERE ステートメントにも指定する必要があります。構文名は、WHERE構文の いずれかのマスクをした ELSEWHERE および ELSEWHERE ステートメントにおいてオプションです。

where_construct_name は、WHERE 構文ステートメントにのみ指定できます。

例REAL, DIMENSION(10) :: A,B,C

! In the following WHERE statement, the LOG of an element of A! is assigned to the corresponding element of B only if that! element of A is a positive value.

WHERE (A>0.0) B = LOG(A)

...END

次の例は、WHERE ステートメント内のエレメント型定義済み代入を示しています。

INTERFACE ASSIGNMENT(=)ELEMENTAL SUBROUTINE MY_ASSIGNMENT(X, Y)

LOGICAL, INTENT(OUT) :: XREAL, INTENT(IN) :: Y

END SUBROUTINE MY_ASSIGNMENTEND INTERFACE

INTEGER A(10)REAL C(10)LOGICAL L_ARR(10)

C = (/ -10., 15.2, 25.5, -37.8, 274.8, 1.1, -37.8, -36.2, 140.1, 127.4 /)A = (/ 1, 2, 7, 8, 3, 4, 9, 10, 5, 6 /)L_ARR = .FALSE.

WHERE (A < 5) L_ARR = C

! DATA IN ARRAY L_ARR AT THIS POINT:!! L_ARR = F, T, F, F, T, T, F, F, F, F

END

ELEMENTAL SUBROUTINE MY_ASSIGNMENT(X, Y)LOGICAL, INTENT(OUT) :: XREAL, INTENT(IN) :: Y

IF (Y < 0.0) THENX = .FALSE.

ELSEX = .TRUE.

ENDIFEND SUBROUTINE MY_ASSIGNMENT

関連情報v 133ページの『WHERE 構文』

v 386ページの『ELSEWHERE』

v END WHERE ステートメントに関しての詳細は、 389ページの『END (構文)』

546 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 573: IBM XL Fortran for Linux, V15.1

WRITE目的

WRITE ステートメントは、データ転送出力ステートメントです。

構文

output_item

出力リスト項目です。出力リストは、転送されるデータを指定します。出力リスト項目は、以下のとおりです。

v 変数名。配列は、そのエレメントのすべてがストレージに配置されている順序で指定されたように処理されます。

ポインターを、ターゲットと関連付けて、割り振り可能オブジェクトを割り振る必要があります。派生型オブジェクトは、このステートメントの有効範囲単位の外側にある最終コンポーネントを持つことができません。output_item の評価の結果は、ポインターを含む派生型オブジェクトにはできません。定形式ステートメント内の構造体の構造体コンポーネントは、派生型定義で指定された順序で処理されます。不定形式ステートメントでは、構造体コンポーネントは、内部表記 (埋め込みを含む) 内の単一値として処理されます。

v 式

v 553ページの『暗黙 DO リスト』で説明している、暗黙 DO リスト

output_item は、プロシージャー・ポインターにしないでください。

io_control

1 つの装置指定子 (UNIT=) を含める必要があり、それぞれ他の有効な指定子を 1 つ含めることもできるリストです。

[UNIT=] u

出力操作で使用される装置を指定する装置指定子です。u は、外部装置識別子または内部ファイル識別子です。

外部装置識別子は、外部ファイルを参照します。これは、以下のいずれかになります。

v 値の範囲が 1 から 2147483647 である整数式。

v 外部装置 6 を識別して、標準出力に事前に関連付けられているアスタリスク

v F2008 A NEWUNIT 値 F2008

内部ファイル識別子は、内部ファイルを参照します。文字変数の名前です。これは、ベクトル添え字を持つ配列セクションにできません。

�� WRITE ( io_control_list )output_item_list

��

第 11 章 ステートメントおよび属性 547

Page 574: IBM XL Fortran for Linux, V15.1

オプション文字 UNIT= を省略する場合、u を、io_control_list の最初の項目にする必要があります。UNIT= を指定する場合、FMT= も指定する必要があります。

[FMT=] format

出力操作で使用される形式を指定する形式指定子です。format は、以下のような形式識別子です。

v FORMAT ステートメントのステートメント・ラベルです。FORMAT ステートメントは、同じ有効範囲単位に置く必要があります。

v FORMAT ステートメントのステートメント・ラベルを代入した、スカラー INTEGER(4) または INTEGER(8) の変数の名前です。FORMAT ステートメントは、同じ有効範囲単位に置く必要があります。

Fortran 95 は、ステートメント・ラベルの代入ができません。

v 括弧で囲まれた文字定数。括弧の間に使用できるのは、 417ページの『FORMAT』にリストされている形式コードのみです。ブランク文字は、左括弧の前または右括弧の後に置くことができます。

v 左端の文字位置が有効な形式を構成している文字データを含む文字変数です。有効な形式は、左括弧で始まり、右括弧で終わります。括弧の間に使用できるのは、FORMAT ステートメント内で説明されている形式コードのみです。ブランク文字は、左括弧の前または右括弧の後に置くことができます。format が配列エレメントの場合、形式識別子が、配列エレメントの長さを超えないようにする必要があります。

v 非文字組み込み型の配列です。データは、文字配列で説明されている有効な形式識別子にする必要があります。

v 文字式です。オペランドが定数の名前でないかぎり、継承された長さを指定するオペランドの連結を含んだ文字式は除きます。

v リスト指示形式設定で指定するアスタリスクです。

v 前に定義された名前リストのリスト名を指定する 名前リスト指定子です。

オプション文字 FMT= を省略する場合、format を io_control_list の 2 番目の項目にして、最初の項目を UNIT= を省略した装置指定子にする必要があります。NML= と FMT= の両方を、同じ出力ステートメントに指定できません。

ASYNCH= char_expr (IBM 拡張)明示的に関連付けられた装置が、非同期入出力に使用されるかどうかを示す、非同期入出力指定子です。

char_expr はスカラー文字式で、その値は YES または NO のいずれかです。YES は、非同期データ転送ステートメントを、この関連付けに使用できることを指定します。NO は、非同期データ転送ステートメントを、この関連付けに使用できないことを指定します。指定された値は、ファイルに使用できる転送方式のセットに入ります。この指定子が省略された場合、デフォルト値は NO です。

事前に関連付けられた値は、ASYNCH= の値 NO で関連付けられます。

548 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 575: IBM XL Fortran for Linux, V15.1

暗黙的に関連付けられた ASYNCH= 値は、装置で実行される最初のデータ転送ステートメントによって決定されます。最初のステートメントが非同期データ転送を実行して、暗黙的に関連付けられるファイルが非同期データ転送を使用できる場合、ASYNCH= の値は YES になります。それ以外では、ASYNCH= の値は NO になります。

ASYNCHRONOUS=char_expr (Fortran 2003)データ転送が完了するのを待たずに、実行を継続できます。char_expr は、YES または NO として評価されるスカラー文字式です。UNIT= でファイル装置番号を指定しない限り、ASYNCHRONOUS=YES は指定できません。ID= を指定する場合、ASYNCHRONOUS=YES も指定する必要があります。

ASYNCHRONOUS=NO または、ASYNCHRONOUS= と ID= 両方がない場合、ステートメントおよび入出力操作は同期です。ASYNCHRONOUS=YES の場合、あるいは、ID= が現れる場合は、非同期入出力が許可されるのは、OPEN ステートメント内のASYNCHRONOUS=YES で開いた外部ファイルに対してのみです。

変数が、入出力リスト内の項目、名前リスト内のグループ・オブジェクトまたは、SIZE= 指定子として、非同期データ転送ステートメント内で使用される場合、data_ref の基本オブジェクトには、データ転送ステートメントの有効範囲単位内の ASYNCHRONOUS 属性が、暗黙的に指定されます。非同期の非事前入力の場合、SIZE= 指定子に指定された記憶単位は、対応する待機命令が実行される時に転送される文字の数で定義されます。非同期出力の場合、処理中の I/O ストレージ・シーケンス・アフェクターは、再定義されないか、未定義状態になるか、そのポインター関連付け状況が変更されます。非同期入力の場合、処理中の I/O ストレージ・シーケンス・アフェクターは、参照されないか、定義されるか、未定義状態になるか、VALUE 属性を持つ仮引数と関連付けられるか、ポインター関連付け状況が変更されます。

前に実行した非同期データ転送ステートメントに対して、エラー条件、ファイル終了条件、またはレコード終了条件が生じた場合、待機命令は、その装置にあるすべての保留データ転送操作に対して実行されます。後続のステートメント中に、条件が発生した場合、そのステートメントの IOSTAT=、IOMSG=、ERR=、END=、および EOR= 指定子が使用されます。

待機命令は、WAIT、CLOSE またはファイル位置決めステートメントによって実行されます。

DECIMAL= char_expr (Fortran 2003)入出力ステートメントの継続中、デフォルトの 10 進数編集モード を一時的に変更します。char_expr は、値が POINT または COMMA のいずれかに評価されるスカラー文字式です。それぞれの WRITE ステートメントの後、モードは、デフォルトで、その装置に対して OPEN ステートメントで指定された (前提とされた) 10 進数モードになります。

POS=integer_expr (Fortran 2003)integer_expr は、0 より大きい整数式です。POS= は、ストリーム・アクセスに関連付けられたファイル内に書き込まれたファイル記憶単位のファイル位置を指定します。位置付けができないファイルに対して POS= を使用しないでください。

第 11 章 ステートメントおよび属性 549

Page 576: IBM XL Fortran for Linux, V15.1

REC= integer_expr

直接アクセスに関連付けられたファイル内に書き込まれるレコードの数を指定するレコード指定子です。REC= 指定子は、直接の出力に対してのみ使用できます。integer_expr は、値が正の整数式です。レコード指定子は、形式設定がリスト指示であるか、装置指定子が内部ファイルを指定している場合は、無効です。レコード指定子は、ファイル内のレコードの相対位置を表します。最初のレコードの相対位置数は 1 です。ストリーム・アクセスに関連付けられた装置を指定するデータ転送ステートメント内に REC= を指定しないでください。または POS= 指定子を使用しないでください。

ROUND= char-expr (Fortran 2003)

この入出力ステートメントの継続中、入出力丸めモードの現行値を一時的に変更します。省略された場合、丸めモードは変更されません。char-expr

は、UP、DOWN、ZERO、NEAREST、COMPATIBLE またはPROCESSOR_DEFINED のいずれかとして評価されます。

丸めモード・ヘルプによって、定様式入出力中に 10 進数を文字表記から内部表記 (すなわち、2 進数) に変換する方法、またはその逆にする方法を指定します。丸めモードには、以下の関数があります。

v UP 丸めモードでは、変換による値は、元の値以上の最小値になります。

v DOWN 丸めモードでは、変換による値は、元の値以下の最大値になります。

v ZERO 丸めモードでは、変換による値は、元の値に最も近く、絶対値ではより大きくない値になります。

v NEAREST 丸めモードでは、変換による値は、表記可能な、最も隣接した 2 つの値のより近い方になります。両方の値が同じように近い場合、偶数値が選択されます。IEEE 丸め変換で、NEAREST は、IEEE 標準で指定される ieee_nearest 丸めモードに相当します。

v COMPATIBLE 丸めモードでは、変換による値は、表記可能な、最も隣接した 2 つの値の内、最も近い値か、中間である場合はよりゼロから離れた値になります。

v PROCESSOR_DEFINED 丸めモードでは、変換による値は、プロセッサー従属となり、他のモードに対応することがあります。PROCESSOR_DEFINED 丸めモードでは、変換による値は、プロセッサー従属となり、他のモードに対応することがあります。XL Fortran では、PROCESSOR_DEFINED 丸めモードは、浮動小数点制御レジスターで選択する丸めモードとなります。浮動小数点制御レジスターを明示的に設定していない場合、デフォルトの丸めモードは NEAREST です。

SIGN= char_expr (Fortran 2003)定様式入出力の関連付けに効力のある符号モードを示します。 char_expr

に、値 PLUS が割り当てられている場合、プロセッサーは、通常オプションの正符号が含まれているすべての位置に、正符号を出し、char_expr に、値 SUPPRESS が割り当てられている場合は、これらの位置で正符号を抑制します。char_expr には、値 PROCESSOR_DEFINED を割り当てることもできます。これは、デフォルトの符号モードで、SUPPRESS と同じ働きをします。関連付けがない場合、あるいは、定様式入出力の関連付けではない場合、char_expr には、値 UNDEFINED を割り当てます。

550 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 577: IBM XL Fortran for Linux, V15.1

IOMSG= iomsg_variable (Fortran 2003)入出力状況指定子です。これは、入出力操作によって戻されるメッセージを指定します。iomsg_variable は、デフォルトのスカラー文字変数です。これを、使用で関連付けられた非ポインターで保護された変数にしないでください。この指定子を含む入出力ステートメントが実行を終了する時、iomsg_variable は、以下のように定義されます。

v エラー条件、ファイル終了条件、レコード終了条件が発生した場合、代入による場合と同じように、変数に説明的なメッセージが割り当てられます。

v このような条件が発生しない場合は、変数の値は変更されません。

IOSTAT= ios

入出力状況指定子です。これは、入出力操作の状況を指定します。ios は、整変数です。IOSTAT= 指定子をコーディングすることによって、エラー・メッセージを抑制します。ステートメントが実行を終了すると、ios は、以下の値で定義されます。

v エラー条件が発生しない場合はゼロ値

v エラーが発生した場合は正の値

ID= integer_variable(IBM 拡張)データ転送が非同期に行われるように示します。integer_variable は、整変数です。エラーが発生しない場合、integer_variable は、非同期データ転送ステートメントの実行後の値で定義されます。この値は、対の WAIT ステートメントで使用される必要があります。

非同期データ転送は、直接不定形式、順次不定形式、ストリーム不定形式のいずれかにする必要があります。内部ファイルへの非同期入出力は禁止されています。未加工キャラクター型デバイス (例えば、テープや未加工論理ボリューム) への非同期入出力は禁止されています。integer_variable を、データ転送入出力リスト内のエンティティー、またはデータ転送入出力リスト内の io_implied_do の do_variable と関連付けないでください。integer_variable が配列エレメント参照の場合、その添え字値が、データ転送、io_implied_do 処理、あるいは io_control_spec 内の他の指定子の定義や評価の影響を受けないようにしてください。

DELIM= char_expr (Fortran 2003)区切り文字がある場合は、リスト指示または名前リスト形式設定によって書き込まれる文字定数を区切るのに使用される区切り文字を指定します。char_expr は、値が APOSTROPHE、QUOTE、または NONE として評価されるスカラー文字式です。値が APOSTROPHE である場合、アポストロフィ区切り文字定数および文字定数内のすべてのアポストロフィは二重にされます。値が QUOTE である場合、二重引用符区切り文字定数および文字定数内のすべての二重引用符は二重にされます。値が NONE である場合、文字定数は区切り文字で区切られず、文字は二重になりません。デフォルト値は NONE です。DELIM= 指定子は、定様式レコードの入力中に無視されますが、定様式入出力に関連付けられるファイルにのみ使用できます。

ERR= stmt_label

エラー指定子です。これは、エラーが発生した場合に、制御の転送先と同じ

第 11 章 ステートメントおよび属性 551

Page 578: IBM XL Fortran for Linux, V15.1

有効範囲単位内にある実行可能ステートメントのステートメント・ラベルを指定します。ERR= 指定子をコーディングすることによって、エラー・メッセージを抑制します。

NUM= integer_variable(IBM 拡張)入出力リストとファイル間で伝送されるデータのバイト数を指定する数値指定子です。integer_variable は、整変数です。NUM= 指定子は、不定様式出力に対してのみ使用できます。NUM パラメーターのコーディングによって、出力リストによって示されるバイト数が、レコードに書き込めるバイト数よりも大きい場合に起こるエラーの表示を抑制します。この場合、integer_variable は、書き込めるレコード最大長の値に設定されます。残りの出力リスト項目からのデータは、後続のレコードに書き込まれません。 非同期データ転送ステートメントと、対応する WAIT ステートメントとの間で非同期データ転送ステートメントを実行するプログラムの一部では、NUM= 指定子の integer_variable またはそれに関連するすべての変数を、参照したり、定義したり、定義を削除したりしてはなりません。

[NML=] name

前に定義された名前リストのリスト名を指定する名前リスト指定子です。オプション文字 NML= を指定しない場合、名前リストの名前を、リスト内の2 番目のパラメーターとして、最初の項目を UNIT= を省略した装置指定子にする必要があります。NML= と UNIT= 両方を指定する場合、すべてのパラメーターは、任意の順序で現れます。NML= 指定子は、FMT= の代替です。NML= と FMT= 両方を、同じ出力ステートメントに指定することはできません。

ADVANCE= char_expr

このステートメントに対して、非事前出力が発生するかどうかを決定する事前指定子です。char_expr は、YES または NO として評価される文字式です。NO を指定した場合、事前出力は行われません。YES が指定された場合、事前の定様式順次出力または定様式ストリーム出力が起きます。デフォルト値は YES です。ADVANCE= は、内部ファイル装置指定子を指定しない、明示的形式仕様を持つ、定様式順次 WRITE ステートメントにのみ指定できます。

規則

NUM= 指定子がある場合、形式指定子または名前リスト指定子は指定できません。

IOSTAT= および NUM= 指定子に指定された変数は、出力リスト項目、名前リストのリスト項目、または暗黙 DO リストの DO 変数と関連付けないでください。このような指定子変数が配列エレメントの場合、添え字値が、データ転送、暗黙DO 処理、またはその他の指定子の定義や評価の影響を受けないようにしてください。

ERR= および IOSTAT= 指定子が設定され、同期データ転送中にエラーが検出された場合、ERR= 指定子によって指定されたステートメントに転送され、正整数値がios に割り当てられます。

552 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 579: IBM XL Fortran for Linux, V15.1

IBM 拡張

ERR= または IOSTAT= 指定子が設定され、非同期データ転送中にエラーが検出された場合、対応する WAIT ステートメントの実行は必要ありません。

変換エラーが検出されて、CNVERR 実行時オプションが NO に設定されている場合、ERR= は、IOSTAT= が設定されていたとしても分岐しません。

IOSTAT= および ERR= が指定されない場合、以下のようになります。

v 重大エラーが検出された場合、プログラムは停止します。

v リカバリー可能エラーが検出され、ERR_RECOVERY 実行時オプションが YESに設定されている場合は、プログラムは継続されて次のステートメントに進みます。オプションが NO に設定されている場合は、プログラムは停止します。

v ERR_RECOVERY 実行時オプションが YES に設定されている場合、変換エラーが検出されると、プログラムは続行されて次のステートメントに進みます。CNVERR 実行時オプションが YES に設定されている場合、変換エラーは、リカバリー可能エラーとして処理されます。CNVERR=NO の時は、変換エラーとして処理されます。

IBM 拡張 の終り

PRINT 形式 は、WRITE(*,format) と同じ効果があります。

例WRITE (6,FMT='(10F8.2)') (LOG(A(I)),I=1,N+9,K),G

関連情報v 248ページの『非同期入出力』

v 「XL Fortran 最適化およびプログラミング・ガイド」に記載される『XL Fortran

入出力の実装詳細』

v 254ページの『条件および IOSTAT 値』

v 241ページの『第 9 章 XL Fortran の入出力』

v 488ページの『READ』

v 542ページの『WAIT (Fortran 2003)』

v 「XL Fortran コンパイラー・リファレンス」に記載される『実行時オプションの設定』

v 1117ページの『削除されたフィーチャー』

暗黙 DO リスト

�� ( do_object_list , do_variable = arith_expr1, arith_expr2 �

� ), arith_expr3

��

第 11 章 ステートメントおよび属性 553

Page 580: IBM XL Fortran for Linux, V15.1

do_object

出力リスト項目です。

do_variable

型整数または実数の名前付きスカラー変数です。

arith_expr1、arith_expr2、および arith_expr3

スカラー数式です。

暗黙 DO リストの範囲は、リスト do_object_list です。DO 変数の反復カウントおよび値は、DO ステートメントの場合と同様に、arith_expr1、arith_expr2、およびarith_expr3 から設定されます。暗黙 DO リストが実行される際、DO 変数の出現に対する適切な代替値で、do_object_list 内の項目が、暗黙 DO リストの反復のたびに1 回指定されます。

554 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 581: IBM XL Fortran for Linux, V15.1

第 12 章 ディレクティブ (IBM 拡張)

このセクションには、すべてのプラットフォームに適用される非 SMP ディレクティブがアルファベット順に記載されています。SMP ディレクティブおよびスレッド・セーフなディレクティブの完全な一覧および説明については、「XL Fortran 最適化およびプログラミング・ガイド」のディレクティブの詳細説明を参照してください。PowerPC® プラットフォームだけに限定されているディレクティブの詳しい説明については、 599ページの『第 13 章 ハードウェア固有のディレクティブ』を参照してください。このセクションの内容は次のとおりです。

コメント形式および非コメント形式のディレクティブXL Fortran ディレクティブは、コメント形式ディレクティブと非コメント形式ディレクティブという 2 つのグループのどちらかに属します。

コメント形式ディレクティブここでは、コメント形式ディレクティブのフォーマットについて説明します。非SMP コメント形式ディレクティブには、以下のものがあります。

v COLLAPSE

v SNAPSHOT

v SOURCEFORM

v SUBSCRIPTORDER

その他のコメント形式ディレクティブは、 558ページの『ディレクティブと最適化』に記載されています。

フォーマット

trigger_head

固定ソース形式の場合は !、*、C、または c のいずれか 1 つであり、自由ソース形式の場合は ! です。

trigger_constant

デフォルトで IBM* です。

規則

デフォルトでは、-qsmp コンパイラー・オプションを使用する場合、-qdirective=IBM*:SMP$:$OMP:IBMP:IBMT オプションがオンになります。-qsmp=omp オプションを指定する場合、これは、オプション-qdirective=$OMP をデフォルトでオンに設定したのと同じになります。代わりまたは追加の trigger_constant を -qdirective コンパイラー・オプションで指定できま

�� trigger_head trigger_constant directive ��

© Copyright IBM Corp. 1996, 2015 555

Page 582: IBM XL Fortran for Linux, V15.1

す。詳しくは、「XL Fortran コンパイラー・リファレンス」の -qdirective コンパイラー・オプションを参照してください。

すべてのコメント形式ディレクティブは、-qdirective コンパイラー・オプションを使用して適切な trigger_constant が定義されていない場合、デフォルトのtrigger_constant を使用しているものを除いて、コンパイラーによってコメントとして扱われます。結果的に、これらのディレクティブを含んでいるコードは、非 SMP

環境へ移植可能です。

XL Fortran は、IBM の解釈で OpenMP 仕様をサポートしています。コードの移植性を最大に保つため、可能な限りこれらのディレクティブを使用することをお勧めします。それらを使用する際は、OpenMP trigger_constant である $OMP と共に使用する必要がありますが、この trigger_constant を他のディレクティブと共に使用するべきではありません。

XL Fortran には、trigger_constant として IBMP および IBMT もあります。コンパイラーは、-qsmp コンパイラー・オプションを使用したコンパイルの場合に、IBMPを認識します。IBMP は、SCHEDULE ディレクティブ、および OpenMP ディレクティブの IBM 拡張と一緒に使用してください。 コンパイラーは、-qthreaded コンパイラー・オプションを使用したコンパイルの場合に、IBMT を認識します。IBMT は、xlf_r、xlf90_r、xlf95_r、xlf2003_r、または xlf2008_r のいずれかの呼び出しコマンドのデフォルトです。THREADLOCAL ディレクティブとの併用をお勧めします。

XL Fortran ディレクティブには、他のベンダーと共通のディレクティブがあります。これらのディレクティブをコード内で使用する場合、ベンダーが選択したtrigger_constant を使用可能にできます。-qdirective コンパイラー・オプションを使用することによってトリガー定数を指定すると、ベンダーが選択したtrigger_constant が使用可能になります。代替 trigger_constant の指定について詳しくは、「XL Fortran コンパイラー・リファレンス」の -qdirective コンパイラー・オプションを参照してください。

trigger_head は、Fortran 90 自由ソース形式または固定ソース形式のどちらかのコメント行の規則に従います。trigger_head は、! の場合は 1 桁目である必要はありません。trigger_head と trigger_constant の間にブランクがあってはなりません。

directive_trigger (例えば !IBM* のように、trigger_head と trigger_constant を組み合わせたものと定義される) および任意のディレクティブ・キーワードは、大文字、小文字、大/小文字混合のいずれでも指定できます。

ディレクティブ行にインライン・コメントを指定できます。

!IBM* INDEPENDENT, NEW(i) !This is a comment

ディレクティブを、同じ行にある別のステートメントまたは別のディレクティブの後に続けることはできません。

コメント形式ディレクティブはすべて継続可能です。継続ステートメント内にディレクティブを組み込むことも、継続ディレクティブ中にステートメントを埋め込むこともできません。

556 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 583: IBM XL Fortran for Linux, V15.1

すべての継続行に directive_trigger を指定しなければなりません。ただし、継続行のdirective_trigger は、先行の継続される行で使用されている directive_trigger と同じである必要はありません。以下に例を示します。

!IBM* INDEPENDENT &!TRIGGER& , REDUCTION (X) &!IBM*& , NEW (I)

この例は、以下と等価です。

!IBM* INDEPENDENT, REDUCTION (X), NEW (I)

ただし、IBM* と TRIGGER の両方がアクティブな trigger_constant であることが前提です。

詳しくは、 10ページの『行およびソース形式』を参照してください。

現在のソース形式に基づいて、自由ソース形式または固定ソース形式のコメントとして、ディレクティブを指定できます。

固定ソース形式の規則

trigger_head は、C、c、または * のいずれかである場合は、1 桁目になければなりません。

1 行以上に継続するディレクティブの場合、固定ソース形式の trigger_constant の最大長は 4 です。この規則は、継続行にのみ適用され、最初の行には適用されません。それ以外の場合、 trigger_constant の最大長は 15 です。 最初の行のトリガーの最大長を 4 にすることをお勧めします。許容される最大長 15 は、後方互換性の目的のために許可されています。

trigger_constant の長さが 4 以下である場合、コメント・ディレクティブの先頭行の6 桁目は空白またはゼロでなければなりません。それ以外の場合、6 桁目の文字はtrigger_constant の一部です。

コメント・ディレクティブの継続行の directive_trigger は、1 から 5 桁になければなりません。継続行の 6 桁目は、空白でもゼロでもない文字でなければなりません。

詳しくは、 11ページの『固定ソース形式』を参照してください。

自由ソース形式の規則

trigger_head は ! です。 trigger_constant の最大長は 15 です。

行の最後のアンパーサンド (&) は、そのディレクティブが継続することを示します。ディレクティブ行を継続する場合は、すべての継続行に directive_trigger がなければなりません。継続行をアンパーサンドで始めたい場合、そのアンパーサンドの前に directive_trigger がなければなりません。以下に例を示します。

!IBM* INDEPENDENT &!IBM*& , REDUCTION (X) &!IBM*& , NEW (I)

詳しくは、 13ページの『自由ソース形式』を参照してください。

第 12 章 ディレクティブ (IBM 拡張) 557

Page 584: IBM XL Fortran for Linux, V15.1

非コメント形式ディレクティブここでは、非コメント形式のディレクティブのフォーマットについて説明します。これには、次のディレクティブが含まれます。

v EJECT

v INCLUDE

v #LINE

v @PROCESS

フォーマット

規則

コンパイラーは、常に非コメント形式ディレクティブを認識します。

非コメント形式ディレクティブは、継続できません。

ディレクティブと同じ行に追加のステートメントを組み込むことはできません。

空白に関するソース・フォーマットの規則が、ディレクティブ行に適用されます。

ディレクティブと最適化以下のディレクティブは、プログラムを最適化するのに有用なコメント形式ディレクティブです。「XL Fortran 最適化およびプログラミング・ガイド」の『アプリケーションの最適化』、およびパフォーマンスに影響する『コンパイラー・オプション』を参照してください。

アサーティブ・ディレクティブアサーティブ・ディレクティブは、これ以外の方法ではコンパイラーにとって利用不能な、ソース・コードに関する情報を収集します。この情報は、パフォーマンスの向上に寄与します。

ASSERT CNCALL

EXECUTION_FREQUENCY EXPECTED_VALUE

INDEPENDENT MEM_DELAY

PERMUTATION

ループ最適化のためのディレクティブ以下のディレクティブは、ループ最適化のための各種の方法を提供します。

BLOCK_LOOP LOOPID

STREAM_UNROLL UNROLL

�� directive ��

558 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 585: IBM XL Fortran for Linux, V15.1

UNROLL_AND_FUSE

ディレクティブの詳細説明

ALIGN目的

ALIGN ディレクティブを使用すると、メモリー内の変数の配置を指定できます。配置でベクトル機構の使用が許可されている場合は、これによってパフォーマンスを改善できます。

構文

alignment_boundary

バイト数で表した配置の境界。定数スカラー整数式で、値は 1 から 1, 048,

576 の範囲内にある 2 の累乗でなければなりません。

var_list

指定した境界上に配置する変数名のコンマ区切りリスト。

規則

ALIGN ディレクティブは、コンパイル単位の宣言部分でのみ使用できます。さらに、このディレクティブは、var が宣言されている同じ有効範囲単位内に置く必要があります。

ALIGN ディレクティブで指定できるのは、変数の配置だけです。このため、ALIGN ディレクティブを派生型の宣言内で指定しないでください。

複数の ALIGN ディレクティブで同じ変数名を指定することはできません。

ALIGN ディレクティブを、以下のオブジェクトに対して指定することはできません。

v サブオブジェクト

v 使用関連付けが行われた変数

v ホスト関連付けが行われた変数

v レコード構造

v 共通ブロック名およびオブジェクト

v 仮引数

v 名前付き定数

v VECTOR 型の変数

v 等価グループに属する変数

�� ALIGN ( alignment_boundary , var_list ) ��

第 12 章 ディレクティブ (IBM 拡張) 559

Page 586: IBM XL Fortran for Linux, V15.1

ALIGN ディレクティブは、-qalign オプションよりも優先されます。

例 1:

以下の例では、オプティマイザーは SIMD 命令を使用して配列追加操作を実行できます。

REAL x(4), y(4), z(4)!IBM* ALIGN(16, x, y, z)! Code to initialize x and yz = x + yEND

例 2:

以下の例では、割り当て可能変数の配置を指定することで、ターゲット・データの配置を決定します。

REAL, ALLOCATABLE :: x(:)!IBM* ALIGN(16, x)ALLOCATE(x(20))PRINT *, MOD(LOC(x(1)), 16) ! Prints 0END

関連情報v 「XL Fortran コンパイラー・リファレンス」の-qalign オプション

ASSERT目的

ASSERT ディレクティブは、DO ループの特性をコンパイラーに提供します。これは、ソース・コードの最適化に役立ちます。

構文

assertion

ITERCNT(n)、 MINITERCNT(n)、 MAXITERCNT(n)、または NODEPS。すべてのアサーションは相互に排他的ではありません。同じ DO ループに対しては、各表明を最大 1 回ずつ使用できます。 n は、正のスカラー整数定数式でなければなりません。

ITERCNT(n)

特定の DO ループの想定される反復回数 (n) を指定します。

MINITERCNT(n)

特定の DO ループの想定される最小反復回数 (n) を指定します。

MAXITERCNT(n)

特定の DO ループの想定される最大反復回数 (n) を指定します。

�� ASSERT ( assertion_list ) ��

560 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 587: IBM XL Fortran for Linux, V15.1

NODEPSDO ループ内に、ループ波及依存関係 (反復から次の反復へ及ぶ依存関係) が存在しないことを指定します。

NODEPS は、-qhot または -qsmp コンパイラー・オプションが指定されている場合にのみ有効です。

規則

ASSERT ディレクティブの後の最初の非コメント行 (他のディレクティブを含まない) は、DO ループでなければなりません。この行は、無限 DO、 F2008 DOCONCURRENT F2008 、または DO WHILE のいずれかのループにはできません。 ASSERT ディレクティブは、このディレクティブの直後の DO ループにのみ適用され、ネストされた DO ループには適用されません。

ITERCNT、MINITERCNT、および MAXITERCNT には、正確な値を指定する必要はありません。これらの値が影響するのはパフォーマンスだけであり、正確性には何も影響はありません。値は、MINITERCNT <= ITERCNT <= MAXITERCNTの規則に従って指定します。これに従わないと、値が矛盾しており、矛盾した値は無視されることを示すメッセージが表示されます。assert ディレクティブITERCNT、MINITERCNT、および MAXITERCNT は、これらのループに対して-qassert={itercnt, minitercnt, maxitercnt} を使用して指定されたオプションより優先されます。

NODEPS を指定すると、ユーザーは、DO ループ内、または DO ループ内から呼び出されたプロシージャー内に、ループ波及依存関係が存在しないことを明示的にコンパイラーに宣言したことになります。ループ波及依存関係には、1 つの DO ループ内にあって相互に妨害する 2 つの反復が関係しています。妨害は、次の状況で発生します。

v 同じアトミック・オブジェクト (サブオブジェクトがないデータ) を定義、定義解除、または再定義する 2 つの操作は互いに妨害し合います。

v アトミック・オブジェクトの定義、定義解除、または再定義は、そのオブジェクトの値の使用を妨害します。

v ポインターの関連付け状況を定義または定義解除する結果になるような操作は、そのポインターへの参照操作や、関連付け状況を定義または定義解除する結果になる他の操作を妨害します。

v DO ループの外へ制御を移したり、EXIT、STOP、または PAUSE ステートメントを実行することは、他のすべての反復を妨害します。

v 同じファイルまたは外部装置に関連する 2 つの入出力 (I/O) 操作は、相互に妨害し合います。ただし、この規則には以下のような例外があります。

– 2 つの入出力操作が 2 つの INQUIRE ステートメントである場合。

– 2 つの入出力操作が 1 つのストリーム・アクセス・ファイルの別々の領域にアクセスする場合、または、

– 2 つの入出力操作が直接アクセス・ファイルの別々のレコードにアクセスする場合。

v 反復と反復の間で割り振り可能オブジェクトの割り振り状況が変わると、妨害が発生します。

第 12 章 ディレクティブ (IBM 拡張) 561

Page 588: IBM XL Fortran for Linux, V15.1

補完的な 2 つの ASSERT ディレクティブを 1 つの DO ループに適用することができます。しかし、1 つの DO ループに対して、ASSERT ディレクティブの後に、それと矛盾する別の ASSERT ディレクティブを続けることはできません。

!IBM* ASSERT (ITERCNT(10))!IBM* INDEPENDENT, REDUCTION (A)!IBM* ASSERT (ITERCNT(20)) ! invalid

DO I = 1, NA(I) = A(I) * I

END DO

上記の例では、ASSERT(ITERCNT(20)) ディレクティブは、 ASSERT(ITERCNT(10)) ディレクティブと矛盾しているので、無効です。

ASSERT ディレクティブは、ASSERT ディレクティブが指定されている DO ループについて、-qassert コンパイラー・オプションをオーバーライドします。

例 1:

! An example of the ASSERT directive with NODEPS.PROGRAM EX1

INTEGER A(100)!IBM* ASSERT (NODEPS)

DO I = 1, 100A(I) = A(I) * FNC1(I)

END DOEND PROGRAM EX1

FUNCTION FNC1(I)FNC1 = I * I

END FUNCTION FNC1

例 2:

! An example of the ASSERT directive with NODEPS and ITERCNT.SUBROUTINE SUB2 (N)

INTEGER A(N)!IBM* ASSERT (NODEPS,ITERCNT(100))

DO I = 1, NA(I) = A(I) * FNC2(I)

END DOEND SUBROUTINE SUB2

FUNCTION FNC2 (I)FNC2 = I * I

END FUNCTION FNC2

例 3:

! An example of the ASSERT directive with ITERCNT, MINITERCNT, and MAXITERCNT.!IBM* ASSERT (ITERCNT(10), MINITERCNT(5))DO I = 1, N

A(I) = A(I) * I!IBM* ASSERT (ITERCNT(100))!IBM* ASSERT (MINITERCNT(5), MAXITERCNT(100))

DO J = 1, MB(J) = A(I) + B(J)

END DOEND DO

562 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 589: IBM XL Fortran for Linux, V15.1

関連情報v 「XL Fortran コンパイラー・リファレンス」の『-qassert オプション』v 「XL Fortran コンパイラー・リファレンス」の『-qdirective』v 414ページの『ループ並列化』

BLOCK_LOOP目的

BLOCK_LOOP ディレクティブを使用すると、ループのネスト内にある特定の DOループの最適化をより強力に制御できます。BLOCK_LOOP ディレクティブは、ブロック化と呼ばれる技法を使用して、反復回数の多い DO ループを、より小さな反復グループ群に分割します。それらの小さなグループを実行することで、キャッシュ・スペース使用の効率を高め、パフォーマンスを向上させることができます。

従属関係を持つループ、または、代替入り口点または出口点を持つループにBLOCK_LOOP を適用すると、予期しない結果になります。

BLOCK_LOOP ディレクティブが有効なのは、-qhot、-qipa、または -qsmp コンパイラー・オプションが指定されている場合に限ります。

構文

n 反復グループのサイズを表す正整数式です。

名前 LOOPID ディレクティブを使用して作成できる、BLOCK_LOOP と同じ有効範囲単位にある固有 ID です。

name が指定されていない場合、ブロック化は、BLOCK_LOOP ディレクティブの直後にある最初の DO ループに対して発生します。

規則

ループのブロック化が起こるためには、BLOCK_LOOP ディレクティブは DO ループの直前になければなりません。

BLOCK_LOOP ディレクティブを複数回指定してはなりません。

BLOCK_LOOP ディレクティブを DO WHILE ループまたは無限 DO ループに対して指定してはなりません。

例! Loop Tiling for Multi-level Memory Heirarchy

INTEGER :: M, N, i, j, kM = 1000N = 1000

!IBM* BLOCK_LOOP(L3_cache_size, L3_cache_block)do i = 1, N

�� BLOCK_LOOP ( n ), name_list

��

第 12 章 ディレクティブ (IBM 拡張) 563

Page 590: IBM XL Fortran for Linux, V15.1

!IBM* LOOPID(L3_cache_block)!IBM* BLOCK_LOOP(L2_cache_size, L2_cache_block)

do j = 1, N

!IBM* LOOPID(L2_cache_block)do k = 1, M

do l = 1, M...

end doend do

end doend do

end

! The compiler generated code would be equivalent to:

do index1 = 1, M, L3_cache_sizedo i = 1, N

do index2 = index1, min(index1 + L3_cache_size, M), L2_cache_sizedo j = 1, N

do k = index2, min(index2 + L2_cache_size, M)do l = 1, M

.

.

.end do

end doend do

end doend do

end do

関連情報v ループの最適化に関するその他の方法については、STREAM UNROLL、

UNROLL、および UNROLL_AND_FUSE ディレクティブを参照してください。

CNCALL目的

CNCALL ディレクティブを DO ループの前に置くと、ユーザーは、その DO ループから呼び出されたプロシージャー内にループ波及依存関係が存在しないことをコンパイラーに明示的に宣言したことになります。

このディレクティブが有効なのは、-qsmp または -qhot コンパイラー・オプションが指定されている場合のみです。

構文

�� CNCALL ��

564 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 591: IBM XL Fortran for Linux, V15.1

規則

CNCALL ディレクティブの後の最初の非コメント行 (他のディレクティブを含まない) は、DO ループでなければなりません。この行は、無限 DO、 F2008 DOCONCURRENT F2008 、または DO WHILE のいずれかのループにはできません。 CNCALL ディレクティブは、このディレクティブの直後の DO ループにのみ適用され、ネストされた DO ループには適用されません。

CNCALL ディレクティブを指定すると、ユーザーは、 DO ループ内で呼び出されたプロシージャーにはループ波及依存関係がないことをコンパイラーに明示的に宣言したことになります。DO ループで呼び出されるプロシージャーがある場合は、ループのそれぞれの反復がそのプロシージャーを同時に呼び出せなければなりません。 CNCALL ディレクティブは、ループ内の他の操作に依存関係がないと表明するものではなく、単にプロシージャー参照についての表明です。

ループ波及依存関係は、1 つの DO ループ内にある 2 つの反復が互いに妨害するときに発生します。妨害の定義については、ASSERT ディレクティブを参照してください。

例! An example of CNCALL where the procedure invoked has! no loop-carried dependency but the code within the! DO loop itself has a loop-carried dependency.

PROGRAM EX3INTEGER A(100)

!IBM* CNCALLDO I = 1, N

A(I) = A(I) * FNC3(I)A(I) = A(I) + A(I-1) ! This has loop-carried dependency

END DOEND PROGRAM EX3

FUNCTION FNC3 (I)FNC3 = I * I

END FUNCTION FNC3

関連情報v 574ページの『INDEPENDENT』

v 「XL Fortran コンパイラー・リファレンス」の『-qdirective』

v 「XL Fortran コンパイラー・リファレンス」の『-qhot』

v 「XL Fortran コンパイラー・リファレンス」の『-qsmp コンパイラー・オプション』

v 372ページの『DO』

v 414ページの『ループ並列化』

COLLAPSE目的

COLLAPSE ディレクティブは、配列の 1 つの次元の下限のエレメントのみがアクセス可能であると指定することによって、配列の 1 つの次元全体を単一のエレメントまでに削減します。下限を指定しない場合は、デフォルトの下限は 1 です。

第 12 章 ディレクティブ (IBM 拡張) 565

Page 592: IBM XL Fortran for Linux, V15.1

COLLAPSE ディレクティブは、慎重に使用すれば、複数次元の配列に関連した反復メモリー・アクセスを削減することによって、パフォーマンス向上に寄与します。

構文

collapse_array は次のとおりです。

expression_list は、expression のコンマ区切りのリストです。

配列名 (array name)

配列名です。

expression

定数スカラー整数式です。正整数値のみを指定できます。

規則

COLLAPSE ディレクティブは、最低でも 1 つの配列を含む必要があります。

COLLAPSE ディレクティブは、そのディレクティブの指定がある有効範囲単位に対してのみ適用されます。COLLAPSE ディレクティブに含まれる配列の宣言は、そのディレクティブと同じ有効範囲単位内にある必要があります。ある有効範囲単位内で使用関連付けまたはホスト関連付けによってアクセス可能な配列は、その有効範囲単位内にある COLLAPSE ディレクティブに指定してはなりません。

expression_list に指定できる下限の値は 1 です。上限の値は、対応する配列の次元数より大きくてはなりません。

単一の有効範囲単位が複数の COLLAPSE 宣言を含むことができますが、ある 1

つの配列を特定の 1 つの有効範囲単位に対して指定できるのは一度だけです。

1 つの配列を COLLAPSE ディレクティブと EQUIVALENCE ステートメントの両方に指定することはできません。

COLLAPSE ディレクティブを、派生型のコンポーネントである配列と一緒に使用することはできません。

1 つの配列に対して COLLAPSE ディレクティブと SUBSCRIPTORDER ディレクティブの両方を適用する場合は、最初に SUBSCRIPTORDER ディレクティブを指定する必要があります。

COLLAPSE ディレクティブは、次の配列に適用されます。

v すべての下限が定数式の想定形状配列。

�� COLLAPSE ( collapse_array_list ) ��

�� array_name ( expression_list ) ��

566 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 593: IBM XL Fortran for Linux, V15.1

v すべての下限が定数式の明示的形状配列。

例 1: 以下の例では、COLLAPSE ディレクティブは明示的形状配列 A および B

に適用されます。内部ループ内での A(m,2:100,2:100) と B(m,2:100,2:100) の参照が、A(m,1,1) と B(m,1,1) になります。

!IBM* COLLAPSE(A(2,3),B(2,3))REAL*8 A(5,100,100), B(5,100,100), c(5,100,100)

DO I=1,100DO J=1,100DO M=1,5

A(M,J,I) = SIN(C(M,J,I))B(M,J,I) = COS(C(M,J,I))

END DODO M=1,5DO N=1,M

C(M,J,I) = C(M,J,I) + A(N,J,I)*B(6-N,J,I)END DOEND DOEND DOEND DOEND

関連情報

SUBSCRIPTORDER ディレクティブの詳細については、 592ページの『SUBSCRIPTORDER』 を参照してください。

EJECT目的

EJECT は、ソース・リストの新しいフル・ページを開始するようコンパイラーに指示します。要求されているソース・リストがない場合、コンパイラーはこのディレクティブを無視します。

構文

規則

EJECT コンパイラー・ディレクティブには、インライン・コメントおよびラベルを組み込めます。しかし、ステートメント・ラベルを指定しても、コンパイラーはそれを破棄します。従って、EJECT ディレクティブ内のラベルを参照してはなりません。このディレクティブの使用例として、リスト内の複数ページに分割したくないDO ループの前に置くことなどが考えられます。ソース・リストがプリンターに送信される場合には、 EJECT ディレクティブは改ページの役目を果たします。

�� EJECT ��

第 12 章 ディレクティブ (IBM 拡張) 567

Page 594: IBM XL Fortran for Linux, V15.1

EXECUTION_FREQUENCY (IBM 拡張)目的

EXECUTION_FREQUENCY ディレクティブは、実行頻度が非常に高いか非常に低いと予期されるソース・コードにマークを付けます。

構文

規則

EXECUTION_FREQUENCY ディレクティブはオプティマイザーに対するヒントであり、最適化を選択した場合にのみ有効です。

EXECUTION_FREQUENCY は、IF、SELECT CASE、および SELECT TYPE のような実行制御構文の中の、ラベル付きの分岐ターゲット・ステートメントに対して最も有効です。

EXECUTION_FREQUENCY は、制御構文の中の最初のステートメントでなければいけません。同じ分岐に複数の EXECUTION_FREQUENCY ディレクティブがある場合、最初の EXECUTION_FREQUENCY ディレクティブだけが有効となって使用され、その他のディレクティブは無視されます。

例! An example of EXECUTION_FREQUENCY in an IF statementinteger function get_grade(student_id)

integer student_idif (is_valid(student_id)) then

! get_grade is most often called with! valid student_id's.!IBM* EXECUTION_FREQUENCY(VERY_HIGH)!...

else! We have an error.

endifend function

EXPECTED_VALUE目的

実行時に仮引数に割り当てられる可能性が最も高い値を指定します。コンパイラーは、この情報を使用して、プロシージャーのクローン作成やインライン化など、特定の最適化を実行できます。

構文

�� EXECUTION_FREQUENCY ( very_low )( very_high )

��

568 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 595: IBM XL Fortran for Linux, V15.1

argument予測値を指定する仮引数の名前。仮引数は、実数型、整数型、論理型、またはバイト型のスカラーでなければなりません。また、ALLOCATABLE 属性または POINTER 属性が設定されていてはいけません。

値 実行時に仮引数に割り当てられる可能性が最も高い値を表す定数式。

規則

EXPECTED_VALUE ディレクティブは、プロシージャーの宣言部分でのみ使用します。1 つの仮引数に対して複数の EXPECTED_VALUE ディレクティブを使用しないでください。

以下の例では、EXPECTED_VALUE ディレクティブを使用して、a の最も可能性の高い値が 1 であり、b の最も可能性の高い値が 0 であることをコンパイラーに示します。

integer function func(a, b)integer a, b!IBM* EXPECTED_VALUE(a, 1)!IBM* EXPECTED_VALUE(b, 0)...

end function func

FUNCTRACE_XLF_CATCH目的

FUNCTRACE_XLF_CATCH ディレクティブは、宣言がディレクティブの直後に続くプロシージャーが、catch トレース・サブルーチンであることを指定します。

構文

規則

catch トレース・プロシージャーは、以下のインターフェースと同じ特性を持つ必要があります。

subroutine routine_name(procedure_name, file_name, line_number, id)use, intrinsic :: iso_c_bindingcharacter(*), intent(in) :: procedure_namecharacter(*), intent(in) :: file_nameinteger(c_int), intent(in) :: line_numbertype(c_ptr), intent(inout) :: id

end subroutine

�� EXPECTED_VALUE ( argument , value ) ��

�� FUNCTRACE_XLF_CATCH ��

第 12 章 ディレクティブ (IBM 拡張) 569

Page 596: IBM XL Fortran for Linux, V15.1

関連情報

『FUNCTRACE_XLF_ENTER』

571ページの『FUNCTRACE_XLF_EXIT』

-qfunctrace_xlf_catchコンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

-qfunctraceコンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

コード内でプロシージャー・トレース・ルーチンを実装する方法と、詳細な例、およびそれらを使用するための規則のリストについて詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」の『コード内のトレース・プロシージャー』を参照してください。

FUNCTRACE_XLF_ENTER目的

FUNCTRACE_XLF_ENTER ディレクティブは、宣言がディレクティブの直後に続くプロシージャーが、入り口トレース・サブルーチンであることを指定します。

構文

規則

入り口トレース・プロシージャーは、以下のインターフェースと同じ特性を持つ必要があります。

subroutine routine_name(procedure_name, file_name, line_number, id)use, intrinsic :: iso_c_bindingcharacter(*), intent(in) :: procedure_namecharacter(*), intent(in) :: file_nameinteger(c_int), intent(in) :: line_numbertype(c_ptr), intent(inout) :: id

end subroutine

関連情報

569ページの『FUNCTRACE_XLF_CATCH』

571ページの『FUNCTRACE_XLF_EXIT』

-qfunctrace_xlf_enterコンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

-qfunctraceコンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

�� FUNCTRACE_XLF_ENTER ��

570 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 597: IBM XL Fortran for Linux, V15.1

コード内でプロシージャー・トレース・ルーチンを実装する方法と、詳細な例、およびそれらを使用するための規則のリストについて詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」の『コード内のトレース・プロシージャー』を参照してください。

FUNCTRACE_XLF_EXIT目的

FUNCTRACE_XLF_EXIT ディレクティブは、宣言がディレクティブの直後に続くプロシージャーが、出口トレース・サブルーチンであることを指定します。

構文

規則

出口トレース・プロシージャーは、以下のインターフェースと同じ特性を持つ必要があります。

subroutine routine_name(procedure_name, file_name, line_number, id)use, intrinsic :: iso_c_bindingcharacter(*), intent(in) :: procedure_namecharacter(*), intent(in) :: file_nameinteger(c_int), intent(in) :: line_numbertype(c_ptr), intent(inout) :: id

end subroutine

関連情報

569ページの『FUNCTRACE_XLF_CATCH』

570ページの『FUNCTRACE_XLF_ENTER』

-qfunctrace_xlf_exitコンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

-qfunctraceコンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

コード内でプロシージャー・トレース・ルーチンを実装する方法と、詳細な例、およびそれらを使用するための規則のリストについて詳しくは、「XL Fortran 最適化およびプログラミング・ガイド」の『コード内のトレース・プロシージャー』を参照してください。

IGNORE_TKR (IBM 拡張)目的

IGNORE_TKR ディレクティブによりコンパイラーは、特定のプロシージャー呼び出しのインターフェースを検査する際、および汎用インターフェースを検査し解決する際に、仮引数の型、種類、およびランクを無視します。

�� FUNCTRACE_XLF_EXIT ��

第 12 章 ディレクティブ (IBM 拡張) 571

Page 598: IBM XL Fortran for Linux, V15.1

IGNORE_TKR により、IGNORE_TKR ディレクティブをサポートするほかのFortran コンパイラーからコードを移植することができます。

構文

dummy_args_list は、仮引数名のコンマ区切りのリストです。

規則

割り振り可能な仮引数、Fortran 90 ポインター、想定形状配列、またはポリモアフィックは、IGNORE_TKR ディレクティブに指定しないでください。

IIGNORE_TKR は、インターフェース・ブロックの本文に表示されるだけの場合があります。また、仮引数名のみを指定する場合もあります。IGNORE_TKR は、指定される仮引数の宣言の前または後に表示される場合があります。

仮引数名が指定される場合、IGNORE_TKR は、その特定の仮引数のみに適用されます。仮引数名が指定されない場合、 IGNORE_TKRは、割り振り可能なオブジェクト、Fortran 90 ポインター、想定形状配列、またはポリモアフィック・エンティティーとなるもの以外のすべての仮引数に適用されます。

例interface

subroutine sub1(a, b)integer(4) :: ainteger(4) :: b!ibm* ignore_tkr b

end subroutineend interface

! valid callscall sub1(1, 'abc') ! type ignoredcall sub1(1, 2_8) ! kind ignoredcall sub1(1, (/ 2 /)) ! rank ignored

INCLUDE目的

INCLUDE コンパイラー・ディレクティブは、指定された 1 つのステートメントまたは一群のステートメントをプログラム単位に挿入します。

構文

�� IGNORE_TKR( dummy_args_list )

��

572 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 599: IBM XL Fortran for Linux, V15.1

name、char_literal_constant (区切り文字は任意指定)

filename (インクルード・ファイルの名前) を指定します。

希望のファイルの絶対パスを指定する必要はありませんが、ファイルの接尾部がある場合は、その接尾部を指定する必要があります。

name に含まれる文字は、XL Fortran の文字セットで許容される文字のみでなければなりません。XL Fortran でサポートされる文字セットについては、 7ページの『文字』を参照してください。

char_literal_constant は、文字リテラル定数です。

n コンパイル時にファイルを組み込むかどうかを決めるためにコンパイラーが使用する値です。1 から 255 の範囲内であればどの数でもかまいませんが、kind 型パラメーターを指定することはできません。n が指定されている場合、その数が -qci (条件付き組み込み) コンパイラー・オプションでサブオプションとして指定されている場合に限り、コンパイラーはファイルを組み込みます。n が指定されていない場合、コンパイラーは常にファイルを組み込みます。

条件付きインクルードは、コンパイル時に Fortran ソース内の INCLUDE ディレクティブを選択的にアクティブにできる方法です。組み込むファイルの指定は、-qciコンパイラー・オプションを使用して行います。

固定ソース形式では、INCLUDE コンパイラー・ディレクティブは 6 桁目より後から始まっていなければならず、ラベルを付けることができます。

INCLUDE 行にはインライン・コメントを追加することができます。

規則

インクルード・ファイルは、完全な Fortran ソース・ステートメントおよびコンパイラー・ディレクティブ (他の INCLUDE コンパイラー・ディレクティブも含めて)

を含むことができます。再帰的な INCLUDE コンパイラー・ディレクティブは許可されていません。組み込まれるグループの一部が END ステートメントであってもかまいません。最初および最後の組み込み行は、継続行であってはなりません。インクルード・ファイル内のステートメントは、組み込み先のファイルのソース形式で処理されます。

インクルード・ファイル内に SOURCEFORM ディレクティブがある場合、そのインクルード・ファイルの処理が完了した後、ソース形式は、組み込み先のファイルのソース形式に戻ります。すべてのグループを組み込んで完成した Fortran プログラムは、ステートメントの順序に関する Fortran のすべての規則に従うものでなければなりません。

左括弧と右括弧の構文規則が使われている INCLUDE コンパイラー・ディレクティブの場合、XL Fortran は、 -qmixed コンパイラー・オプションがオンになっている場合を除いて、ファイル名を小文字に変換します。

�� INCLUDE char_literal_constant( name ) n

��

第 12 章 ディレクティブ (IBM 拡張) 573

Page 600: IBM XL Fortran for Linux, V15.1

ファイル・システムは、指定された filename を次のようにして見つけます。

v filename の最初の非ブランク文字が / である場合、filename は絶対ファイル名を指定しています。

v 最初の非ブランク文字が / でない場合、オペレーティング・システムは、次のように優先順位の高い方から降順でディレクトリーを探索します。

– -I コンパイラー・オプションが指定されている場合、指定されたディレクトリー内で filename が検索されます。

– filename が見つからない場合、オペレーティング・システムは以下を探索します。

- 現行ディレクトリーでファイル filename を検索します。

- コンパイルするソース・ファイルの常駐ディレクトリーでファイル filename

を検索します。

- ディレクトリー /usr/include でファイル filename を検索します。

例INCLUDE '/u/userid/dc101' ! full absolute file name specifiedINCLUDE '/u/userid/dc102.inc' ! INCLUDE file name has an extensionINCLUDE 'userid/dc103' ! relative path name specified

INCLUDE (ABCdef) ! includes file abcdef

INCLUDE '../Abc' ! includes file Abc from parent directory! of directory being searched

関連情報「XL Fortran コンパイラー・リファレンス」の『-qci オプション』

INDEPENDENT目的

INDEPENDENT ディレクティブを使用する場合は、DO ループ、FORALL ステートメント、または FORALL 構文の前に置かなければなりません。このディレクティブは、FORALL ステートメントまたは FORALL 構文中の各演算がどのような順序で実行されてもプログラムの意味体系に影響がないことを指定します。また、このディレクティブは、DO ループの各反復を、プログラムの意味体系に影響を与えることなくどのような順序でも実行できることも指定します。

このディレクティブが有効なのは、-qsmp または -qhot コンパイラー・オプションが指定されている場合のみです。

構文

574 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 601: IBM XL Fortran for Linux, V15.1

規則

INDEPENDENT ディレクティブの後の最初の非コメント行 (他のディレクティブを含まない) は、DO ループ、FORALL ステートメントであるか、または、FORALL構文の最初のステートメントでなければなりません。その行は無限 DO または DOWHILE ループであってはなりません。INDEPENDENT ディレクティブは、このディレクティブの直後の DO ループにのみ適用され、ネストされた DO ループには適用されません。

1 つの INDEPENDENT ディレクティブには、最大 1 つの NEW 節と最大 1 つのREDUCTION 節を組み込めます。

このディレクティブが DO ループに適用される場合、そのループのどの反復も他の反復を妨害することはできません。妨害は、次の状況で発生します。

v 同じアトミック・オブジェクト (サブオブジェクトがないデータ) を定義、定義解除、または再定義する 2 つの操作は、親オブジェクトが NEW 節またはREDUCTION 節に指定されている場合を除いて、互いに妨害し合います。ネストされている DO ループのインデックス変数を NEW 節に定義する必要があります。

v アトミック・オブジェクトの定義、定義解除、または再定義は、そのオブジェクトの値の使用を妨害します。例外は、親オブジェクトが NEW 節またはREDUCTION 節にある場合です。

v ポインターの関連付け状況を定義または定義解除する結果になるような操作は、そのポインターへの参照操作や、関連付け状況を定義または定義解除する結果になる他の操作を妨害します。

v DO ループの外へ制御を移したり、EXIT、STOP、または PAUSE ステートメントを実行することは、他のすべての反復を妨害します。

v 同じファイルまたは外部装置に関連する 2 つの入出力操作は、相互に妨害し合います。ただし、この規則には以下のような例外があります。

– 2 つの入出力操作が 2 つの INQUIRE ステートメントである場合。

– 2 つの入出力操作が 1 つのストリーム・アクセス・ファイルの別々の領域にアクセスする場合、または、

– 2 つの入出力操作が直接アクセス・ファイルの別々のレコードにアクセスする場合。

v 反復と反復の間で割り振り可能オブジェクトの割り振り状況が変わると、妨害が発生します。

NEW 節が指定されている場合、そのディレクティブは DO ループに適用されなければなりません。NEW 節は、そのディレクティブとそのまわりにあるINDEPENDENT ディレクティブを、それらのディレクティブによる表明を正しいも

�� �INDEPENDENT, NEW ( named_variable_list ), REDUCTION ( named_variable_list )

��

第 12 章 ディレクティブ (IBM 拡張) 575

Page 602: IBM XL Fortran for Linux, V15.1

のとして受け入れることによって、変更します。この変更は、NEW 節に指定されている変数がループの各反復によって変更される場合でも 行われます。NEW 節に指定された変数は、DO ループ本体専用の変数であるかのような働きをします。つまり、それらの変数 (およびそれらと関連している変数) がループの各反復の前と後の両方で未定義の状態になっても、プログラムには影響がありません。

NEW 節または REDUCTION 節に指定する変数には、次の制約があります。

v 仮引数であってはならない

v ポインティング先であってはならない

v 使用関連付けまたはホスト関連付けであってはならない

v 共通ブロック変数であってはならない

v SAVE または STATIC 属性が指定されていてはならない

v POINTER または TARGET 属性が指定されていてはならない

v EQUIVALENCE ステートメントに指定されていてはならない

FORALL の場合、INDEPENDENT ディレクティブの影響を受けるインデックス値のどの組み合わせも、別の組み合わせが必要とするアトミック記憶単位への割り当てを行いません。DO ループ、FORALL ステートメント、または FORALL 構文がすべて同じ本体を持ち、それぞれの前に INDEPENDENT ディレクティブがある場合、これらの動作は同じです。

REDUCTION 節は、指定された変数の更新が、INDEPENDENT のループ内にあるREDUCTION ステートメント内で発生することを表明します。また、REDUCTION変数の中間値は、更新そのもの以外では、並列セクション内で使用されません。従って、構文の後の REDUCTION 変数の値は、縮約ツリーの結果です。

REDUCTION 節が指定されている場合、そのディレクティブは DO ループに適用されなければなりません。INDEPENDENT の DO ループ内での REDUCTION 変数への唯一の参照は、REDUCTION ステートメント内のものでなければなりません。

REDUCTION 変数は、組み込み型でなければなりませんが、文字型であってはなりません。REDUCTION 変数は、割り振り可能配列であってはなりません。

REDUCTION 変数は、以下のものの中にあってはなりません。

v 同じ INDEPENDENT ディレクティブの NEW 節

v 後続の DO ループの本体内にある INDEPENDENT ディレクティブの NEW 節または REDUCTION 節

v 後続の DO ループの本体内にある PARALLEL DO ディレクティブのFIRSTPRIVATE 節、PRIVATE 節、または LASTPRIVATE 節

v 後続の DO ループの本体内にある PARALLEL SECTIONS ディレクティブのPRIVATE 節

REDUCTION ステートメントの形式は、次のいずれかです。

576 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 603: IBM XL Fortran for Linux, V15.1

ここで、

reduction_var_ref

REDUCTION 節内の変数または変数のサブオブジェクトです。

reduction_op

+、-、*、.AND.、.OR.、.EQV.、.NEQV.、または .XOR. です。

reduction_function

MAX、MIN、IAND、IOR、または IEOR です。

REDUCTION ステートメントには、以下の規則が適用されます。

1. REDUCTION ステートメントとは、INDEPENDENT の DO ループの範囲内で発生する代入ステートメントです。REDUCTION 節内の変数は、INDEPENDENT の DO ループ内の REDUCTION ステートメント中でのみ使用できます。

2. 1 つの REDUCTION ステートメント内の 2 つの reduction_var_ref は、字句的に同一でなければなりません。

3. INDEPENDENT ディレクティブの構文規則では、配列エレメントまたは配列セクションを REDUCTION 節内の REDUCTION 変数として指定することは許可されていません。そのようなサブオブジェクトが REDUCTION ステートメント内にあってもかまいませんが、REDUCTION 変数として扱われるのは配列全体です。

4. 次の形式の REDUCTION ステートメントを使用することはできません。

例 1:

INTEGER A(10),B(10,12),F!IBM* INDEPENDENT ! The NEW clause cannot be

FORALL (I=1:9:2) A(I)=A(I+1) ! specified before a FORALL!IBM* INDEPENDENT, NEW(J)

DO M=1,10J=F(M) ! 'J' is used as a scratchA(M)=J*J ! variable in the loop

�� reduction_var_ref = expr reduction_op reduction_var_ref ��

�� reduction_var_ref = reduction_var_ref reduction_op expr ��

�� reduction_var_ref = reduction_function (expr, reduction_var_ref) ��

�� reduction_var_ref = reduction_function (reduction_var_ref, expr) ��

�� reduction_var_ref = expr - reduction_var_ref ��

第 12 章 ディレクティブ (IBM 拡張) 577

Page 604: IBM XL Fortran for Linux, V15.1

!IBM* INDEPENDENT, NEW(N)DO N=1,12 ! The first executable statement

B(M,N)=M+N*N ! following the INDEPENDENT mustEND DO ! be either a DO or FORALL

END DOEND

例 2:

X=0!IBM* INDEPENDENT, REDUCTION(X)

DO J = 1, MX = X + J**2

END DO

例 3:

INTEGER A(100), B(100, 100)!IBM* INDEPENDENT, REDUCTION(A), NEW(J) ! Example showing an array used

DO I=1,100 ! for a reduction variableDO J=1, 100

A(I)=A(I)+B(J, I)END DO

END DO

関連情報v 414ページの『ループ並列化』

v 153ページの『DO 構文』

v 411ページの『FORALL』

v 「XL Fortran コンパイラー・リファレンス」の『-qdirective』

v 「XL Fortran コンパイラー・リファレンス」の『-qhot』

v 「XL Fortran コンパイラー・リファレンス」の『-qsmp コンパイラー・オプション』

#LINE目的

#line ディレクティブは、cpp または他の Fortran ソース・コード・ジェネレーターによって作成されるコードを、プログラマーによって作成された入力コードと関連付けます。プリプロセッサーによってコード行が挿入または削除されることがありますが、#line ディレクティブは、オリジナルのソースのどの行からプリプロセッサーが中間ファイルの対応する行を生成したのかを示すので、エラーの報告やデバッグの際に役立ちます。

構文

#line ディレクティブは非コメント形式ディレクティブであり、このタイプのディレクティブの構文規則に従います。

�� #line line_numberfilename

��

578 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 605: IBM XL Fortran for Linux, V15.1

line_number

KIND パラメーターなしの正の符号なし整数リテラル定数です。line_number

の指定は必須です。

filename

kind 型パラメーターなしの文字リテラル定数です。filename は、絶対パスまたは相対パスを指定できます。指定された filename は、後で使用するために記録されます。相対パスを指定した場合、プログラムのデバッグ時にデバッガーがディレクトリー検索リストを使用して filename を解決します。

規則

#line ディレクティブは、他の非コメント形式ディレクティブと同じ規則に従いますが、以下の例外があります。

v #line ディレクティブと同じ行にインライン・コメントを入れることはできません。

v 自由ソース形式では、# 文字と line 間の空白は任意指定です。

v 固定または自由ソース形式では、語 line の各文字の間に空白を組み込んではなりません。

v 固定ソース形式では、行のどこからでも #line ディレクティブを開始できます。

#line ディレクティブは、現行ファイル内でそのディレクティブに続くすべてのコードの発生元を示します。別の #line ディレクティブが現れると、前のものはオーバーライドされます。

filename が指定されている場合、現行ファイル内の後続のコードは、その filename

が元になっているかのようになります。filename が省略されていて、現行ファイル内のそれよりも前に filename が指定された #line ディレクティブが存在しない場合、現行ファイル内のコードは、指定された行番号で現行ファイルが元であるかのように扱われます。現行ファイル内のそれよりも前に filename が指定された #lineディレクティブが存在する場合、前のディレクティブの filename が使用されます。

line_number は、適切なファイル内の、ディレクティブに続くコード行の位置を示します。そのファイル内の後続行は、別の #line ディレクティブが指定されるか、またはファイルが終わりになるまで、元ファイル内の後続行と 1 対 1 で対応していると想定されます。

XL Fortran がファイルに対して cpp を起動すると、-d オプションも指定されているのでなければ、プリプロセッサーは #line ディレクティブを出力します。

ファイル test.F の内容は次のとおりです。

! File test.F, Line 1#include "test.h"PRINT*, "test.F Line 3"...PRINT*, "test.F Line 6"#include "test.h"PRINT*, "test.F Line 8"END

第 12 章 ディレクティブ (IBM 拡張) 579

Page 606: IBM XL Fortran for Linux, V15.1

ファイル test.h の内容は次のとおりです。

! File test.h line 1RRINT*,1 ! Syntax ErrorPRINT*,2

C プリプロセッサーがデフォルトのオプションでファイル test.F を処理した後は次のようになります。

#line 1 "test.F"! File test.F, Line 1#line 1 "test.h"! File test.h Line 1RRINT*,1 ! Syntax ErrorPRINT*,2#line 3 "test.F"PRINT*, "test.F Line 3"...#line 6PRINT*, "test.F Line 6"#line 1 "test.h"! File test.h Line 1RRINT*,1 ! Syntax ErrorPRINT*,2#line 8 "test.F"PRINT*, "test.F Line 8"END

コンパイラーは、C プリプロセッサーによって作成されたファイルを処理した後、次のようなメッセージを表示します。

2 2 |RRINT*,1!Syntax error

......a................a - "test.h", line 2.6: 1515-019 (S) Syntax is incorrect.

4 2 |RRINT*,1 !Syntax error......a................

a - "test.h", line 2.6: 1515-019 (S) Syntax is incorrect.

関連情報v 「XL Fortran コンパイラー・リファレンス」の『-d オプション』

v 「XL Fortran コンパイラー・リファレンス」の『C プリプロセッサーによるFortran ファイルの引き渡し』

LOOPID目的

LOOPID ディレクティブを使用すると、有効範囲単位内でループに固有 ID を割り当てることができます。ID は、ループの変形を指示するのに使用できます。これで作成する ID を使用して、-qreport コンパイラー・オプションは、ループの変形に関するレポートを生成します。

580 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 607: IBM XL Fortran for Linux, V15.1

構文

名前 有効範囲単位内で固有の ID です。

規則

LOOPID ディレクティブは、BLOCK_LOOP ディレクティブまたは DO 構文の直前になければなりません。

1 つのループに対して LOOPID ディレクティブを複数回指定してはなりません。

制御ステートメントのない DO 構文、DO WHILE 構文、 F2008 DOCONCURRENT 構文 F2008 、または無限 DO には、LOOPID ディレクティブを指定してはなりません。

関連情報v ループの最適化に関するその他の方法については、BLOCK_LOOP、STREAM

UNROLL、UNROLL、および UNROLL_AND_FUSE ディレクティブを参照してください。

MEM_DELAY目的

MEM_DELAY ディレクティブは、特定のロードに対して遅延サイクル数を指定します。それらの特定のロードが、キャッシュ・ミスが原因でメモリー・アクセス待ち時間の長くなる延滞ロードです。

どのロードが延滞ロードなのかが指定されていると、コンパイラーは、その情報を利用し、データ・プリフェッチなどの最適化を実行することができます。

構文

delinquent_variableサブプログラムへの参照によって正当に受け渡すことのできる任意のデータ項目。

cycles 32 ビットのリテラル整数値または等価の PARAMETER。

規則

MEM_DELAY ディレクティブは、指定されたメモリー参照を含むステートメントの直前に置かれます。

�� LOOPID ( name ) ��

�� MEM_DELAY ( delinquent_variable , cycles ) ��

第 12 章 ディレクティブ (IBM 拡張) 581

Page 608: IBM XL Fortran for Linux, V15.1

cycles は、コンパイル時定数でなければならず、通常は L1 ミス待ち時間または L2

ミス待ち時間のいずれかです。

例program mem1integer::i,ninteger::a(20),b(400)

n=20do i=1,n!IBM* mem_delay(b(n*i),10)a(i)=b(n*i)end do;end

NEW目的

NEW ディレクティブは、どの変数が PARALLEL DO ループまたは PARALLELSECTIONS 構文内でローカルでなければならないのかを指定するために使用します。このディレクティブは、PARALLEL DO ディレクティブおよび PARALLELSECTIONS ディレクティブの PRIVATE 節と同じ機能を実行します。

クラス

NEW ディレクティブが有効なのは、-qsmp コンパイラー・オプションが指定されている場合に限られます。

構文

規則

NEW ディレクティブは、PARALLEL DO ディレクティブまたは PARALLELSECTIONS ディレクティブの直後になければなりません。

NEW ディレクティブを指定する場合は、対応する PARALLEL DO またはPARALLEL SECTIONS ディレクティブを節なしで指定する必要があります。

NEW ディレクティブが PARALLEL DO ディレクティブの後に続く場合、 NEWディレクティブの後の最初の非コメント行 (他のディレクティブを含まない) は、DO ループでなければなりません。この行は、無限 DO、 F2008 DOCONCURRENT F2008 、または DO WHILE のいずれかのループにはできません。

NEW ディレクティブの named_variable_list 内の変数名についての制限事項は、PARALLEL DO ディレクティブの PRIVATE 節および PARALLEL SECTIONSディレクティブの PRIVATE 節に指定される変数名の制約事項と同じです。「XL

Fortran 最適化およびプログラミング・ガイド」の ディレクティブおよび 構文についてのセクションを参照してください。

�� NEW named_variable_list ��

582 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 609: IBM XL Fortran for Linux, V15.1

例INTEGER A(10), C(10)REAL B(10)INTEGER FUNC(100)!SMP$ PARALLEL DO!SMP$ NEW I, TMP

DO I = 1, 10TMP = A(I) + COS(B(I))C(I) = TMP + FUNC(I)

END DO

NOFUNCTRACE目的

NOFUNCTRACE ディレクティブは、宣言がディレクティブの直後に続くプロシージャーまたはモジュールに対するトレースを無効にします。

構文

規則

NOFUNCTRACE ディレクティブは、プロシージャーまたはモジュールの宣言の直前にある必要があります。このディレクティブがプロシージャー宣言の後にあると、ディレクティブは、プロシージャーとそのすべての内部プロシージャーに適用されます。ディレクティブがモジュール宣言の後にあると、ディレクティブは、そのモジュール内のすべてのプロシージャーに適用されます。 NOFUNCTRACE ディレクティブは、内部プロシージャー宣言の直前に置くことができます。

以下の例は、-qfunctrace を指定してコンパイルした場合の、NOFUNCTRACE ディレクティブの使用法を示しています。

! None of the procedures in module m will be traced!IBM* NOFUNCTRACEMODULE MCONTAINS

SUBROUTINE modsub1CALL internal1

CONTAINSSUBROUTINE internal1END SUBROUTINE internal1

END SUBROUTINE modsub1END MODULE M

MODULE nCONTAINS

! modsub2 and its internal procedure internal3 will be traced.! internal procedure internal2 will not be traced.SUBROUTINE modsub2

CALL internal2CALL internal3

CONTAINS!IBM* NOFUNCTRACE

�� NOFUNCTRACE ��

第 12 章 ディレクティブ (IBM 拡張) 583

Page 610: IBM XL Fortran for Linux, V15.1

SUBROUTINE internal2END SUBROUTINE internal2

SUBROUTINE internal3END SUBROUTINE internal3

END SUBROUTINE modsub2

! modsub3 and its internal procedure internal4 will not be traced.!IBM* NOFUNCTRACESUBROUTINE modsub3

CALL internal4CONTAINS

SUBROUTINE internal4END SUBROUTINE internal4

END SUBROUTINE modsub3END MODULE n

! The program and its internal procedure internal5 will not be traced.!IBM* NOFUNCTRACEPROGRAM nofunctrace

USE mUSE nCALL modsub1CALL modsub2CALL modsub3CALL internal5

CONTAINSSUBROUTINE internal5END SUBROUTINE internal5

END PROGRAM nofunctrace

関連情報

-qfunctraceコンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

NOSIMD目的

NOSIMD ディレクティブは、このディレクティブの直後にあるループ内、またはFORALL 構文内で、コンパイラーが自動的に Vector Multimedia Extension (VMX)

または Vector Scalar Extension (VSX) 命令を生成することを禁止します。

構文

規則

NOSIMD ディレクティブの後の最初の非コメント行 (他のディレクティブを含まない) は、DO ループ、FORALL ステートメント、または FORALL 構文でなければなりません。この行は、無限 DO、 F2008 DO CONCURRENT F2008 、またはDO WHILE のいずれかのループにはできません。 NOSIMD ディレクティブは、このディレクティブの直後の DO ループ、FORALL ステートメント、または

�� NOSIMD ��

584 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 611: IBM XL Fortran for Linux, V15.1

FORALL 構文にのみ適用され、配列言語用にコンパイラーによって生成された、ネストされた DO ループ、ネストされた FORALL ステートメント、またはネストされた DO ループには適用されません。

NOSIMD ディレクティブは、ループ最適化ディレクティブおよび SMP ディレクティブと一緒に使用できます。

例SUBROUTINE VEC (A, B)

REAL*8 A(200), B(200)!IBM* NOSIMDFORALL (N = 1:200), B(N) = B(N) / A(N)

END SUBROUTINE

関連情報

アプリケーション全体に対するベクトル・サポートの制御については、 コンパイラー・オプションを参照してください。

NOVECTOR目的

NOVECTOR ディレクティブは、このディレクティブの直後のループをコンパイラーが自動的にベクトル化するのを禁止します。自動ベクトル化には、ループ内で実行される一定の操作、および、連続する配列エレメントに対する一定の操作を変換して、いくつかの結果を同時に計算する 1 つのルーチン呼び出しにする操作が含まれます。

構文

規則

NOVECTOR ディレクティブの後の最初の非コメント行 (他のディレクティブを含まない) は、DO ループ、FORALL ステートメント、または FORALL 構文でなければなりません。この行は、無限 DO、 F2008 DO CONCURRENT F2008 、または DO WHILE のいずれかのループにはできません。 NOVECTOR ディレクティブは、このディレクティブの直後の DO ループ、FORALL ステートメント、または FORALL 構文にのみ適用され、ネストされた DO ループ、ネストされたFORALL 構文またはステートメントには適用されません。

NOVECTOR ディレクティブは、ループ最適化ディレクティブまたは SMP ディレクティブと一緒に使用できます。

例SUBROUTINE VEC (A, B)

REAL*8 A(200), B(200)!IBM* NOVECTOR

�� NOVECTOR ��

第 12 章 ディレクティブ (IBM 拡張) 585

Page 612: IBM XL Fortran for Linux, V15.1

DO N = 1, 200B(N) = B(N) / A(N)

END DOEND SUBROUTINE

関連情報

アプリケーション全体に対する自動ベクトル化の制御については、-qhot=vector コンパイラー・オプションを参照してください。

PERMUTATION目的

PERMUTATION ディレクティブは、integer_array_name_list にリストされている各配列のエレメントが繰り返し値を持たないことを指定します。このディレクティブは、配列エレメントを他の配列参照のための添え字として使用するときに便利です。

PERMUTATION ディレクティブが有効なのは、-qsmp または -qhot コンパイラー・オプションが指定されている場合のみです。

構文

integer_array_name

繰り返し値がない整数配列です。

規則

PERMUTATION ディレクティブの後の最初の非コメント行 (他のディレクティブを含まない) は、DO ループでなければなりません。この行は、無限 DO、 F2008

DO CONCURRENT F2008 、または DO WHILE のいずれかのループにはできません。 PERMUTATION ディレクティブは、このディレクティブの直後の DO ループにのみ適用され、ネストされた DO ループには適用されません。

例PROGRAM EX3

INTEGER A(100), B(100)!IBM* PERMUTATION (A)DO I = 1, 100

A(I) = IB(A(I)) = B(A(I)) + A(I)

END DOEND PROGRAM EX3

関連情報v 「XL Fortran コンパイラー・リファレンス」の『-qhot オプション』

v 「XL Fortran コンパイラー・リファレンス」の『-qsmp コンパイラー・オプション』

�� PERMUTATION ( integer_array_name_list ) ��

586 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 613: IBM XL Fortran for Linux, V15.1

v DO

@PROCESS目的

@PROCESS ディレクティブを使用すると、ソース・レベルで、個別のコンパイル単位にのみコンパイラー・オプションが影響することを指定できます。このディレクティブは、構成ファイル、デフォルト設定、またはコマンド行に組み込まれたオプションをオーバーライドできます。ソース・レベルでの特定のコンパイラー・オプションの指定に関する制限事項については、「XL Fortran コンパイラー・リファレンス」を参照してください。

構文

option -q なしのコンパイラー・オプションの名前です。

suboption

コンパイラー・オプションのサブオプションです。

規則

固定ソース形式では、@PROCESS ディレクティブは 1 桁目から、または 6 桁目より後から開始できます。自由ソース形式では、@PROCESS ディレクティブは、どの桁からでも開始できます。

@PROCESS コンパイラー・ディレクティブと同じ行にステートメント・ラベルまたはインライン・コメントを置くことはできません。

デフォルトでは、@PROCESS コンパイラー・ディレクティブで指定されたオプション設定は、そのステートメントが存在するコンパイル単位に対してのみ有効です。ファイルに複数のコンパイル単位がある場合、そのオプションは、次の単位がコンパイルされる前に元の設定に戻ります。DIRECTIVE オプションを使用して指定されたトリガー定数は、ファイルの終わりまで、または、NODIRECTIVE が処理されるまで有効です。

@PROCESS コンパイラー・ディレクティブは、コンパイル単位の最初のステートメントの前になければなりません。ただし、SOURCE および NOSOURCE コンパイラー・オプションの場合は例外で、これらのオプションは、コンパイル単位内のどこの場所でも @PROCESS ディレクティブに指定できます。

�� �

,

@PROCESS option( suboption_list )

��

第 12 章 ディレクティブ (IBM 拡張) 587

Page 614: IBM XL Fortran for Linux, V15.1

関連情報

コンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」の『コンパイラー・オプションの詳細』を参照してください。

SNAPSHOT目的

SNAPSHOT ディレクティブを使用して、デバッグ・プログラムでブレークポイントを設定できる安全な位置を指定できます。さらに、デバッグ・プログラムに可視のままでなければならない変数のセットを用意できます。

SNAPSHOT ディレクティブが設定されているポイントで、パフォーマンスが少し低下することがあります。これは、デバッグ・プログラムによるアクセスのために変数をメモリーに保持する必要があるためです。SNAPSHOT ディレクティブによって可視にされた変数は、読み取り専用です。これらの変数がデバッガーを通して変更されると、未定義の動作が発生します。使用に際しては、十分注意してください。

最適化レベルが高い場合、SNAPSHOT ディレクティブによる静的ストレージ・クラスの変数の内容の保持は、一貫したものになりません。

構文

named_variable

名前付き変数です。現行の有効範囲でアクセス可能でなければなりません。

規則

SNAPSHOT ディレクティブを使用するには、コンパイル時に -qdbg コンパイラー・オプションを指定する必要があります。

例 1: 次の例では、プライベート変数の値をモニターするために、SNAPSHOT ディレクティブが使用されています。

INTEGER :: IDXINTEGER :: OMP_GET_NUM_THREADS, OMP_GET_THREAD_NUMINTEGER, ALLOCATABLE :: ARR(:)

! ...

!$OMP PARALLEL, PRIVATE(IDX)!$OMP MASTER

ALLOCATE(ARR(OMP_GET_NUM_THREADS()))!$OMP END MASTER!$OMP BARRIER

IDX = OMP_GET_THREAD_NUM() + 1

�� SNAPSHOT ( named_variable_list ) ��

588 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 615: IBM XL Fortran for Linux, V15.1

!IBM* SNAPSHOT(IDX) ! The PRIVATE variable IDX is made visible! to the debugger.

ARR(IDX) = 2*IDX + 1

!$OMP END PARALLEL

例 2: 次の例では、プログラムのデバッグ中に中間値をモニターするために、SNAPSHOT ディレクティブが使用されています。

SUBROUTINE SHUFFLE(NTH, XDAT)INTEGER, INTENT(IN) :: NTHREAL, INTENT(INOUT) :: XDAT(:)INTEGER :: I_TH, IDX, PART(1), I, J, LB, UBINTEGER :: OMP_GET_THREAD_NUMINTEGER(8) :: Y=1REAL :: TEMP

CALL OMP_SET_NUM_THREADS(NTH)PART = UBOUND(XDAT)/NTH

!$OMP PARALLEL, PRIVATE(NUM_TH, I, J, LB, UB, IDX, TEMP), SHARED(XDAT)NUM_TH = OMP_GET_THREAD_NUM() + 1LB = (NUM_TH - 1)*PART(1) + 1UB = NUM_TH*PART(1)

DO I=LB, UB!$OMP CRITICAL

Y = MOD(65539_8*y, 2_8**31)IDX = INT(REAL(Y)/REAL(2_8**31)*(UB - LB) + LB)

!SMP$ SNAPSHOT(i, y, idx, num_th, lb, ub)

!$OMP END CRITICALTEMP = XDAT(I)XDAT(I) = XDAT(IDX)XDAT(IDX) = TEMP

ENDDO

!SMP$ SNAPSHOT(TEMP) ! The user can examine the value! of the TEMP variable

!$OMP END PARALLELEND

関連情報

-g または -qdbg コンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

SOURCEFORM目的

SOURCEFORM コンパイラー・ディレクティブは、ファイルの終わりに達するか、@PROCESS ディレクティブまたは別の SOURCEFORM ディレクティブが異なるソース形式を指定するまで、後続のすべての行が指定のソース形式で処理されることを指示します。

構文

第 12 章 ディレクティブ (IBM 拡張) 589

Page 616: IBM XL Fortran for Linux, V15.1

source FIXED、FIXED(right_margin)、FREE(F90)、FREE(IBM)、または FREE です。FREE のデフォルト設定は FREE(F90) です。

right_margin

右マージンの桁位置を指定する符号なし整数です。デフォルトは 72

です。最大は 132 です。

規則

SOURCEFORM ディレクティブは、ファイル内のどの位置にでも置くことができます。インクルード・ファイルは、そのインクルード・ファイルのソース形式でコンパイルされます。インクルード・ファイル内に SOURCEFORM ディレクティブがある場合、そのインクルード・ファイルの処理が完了した後、ソース形式は、組み込み先のファイルのソース形式に戻ります。

SOURCEFORM ディレクティブはラベルを指定することはできません。

ヒント

例@PROCESS DIRECTIVE(CONVERT*)

PROGRAM MAIN ! Main program not yet convertedA=1; B=2INCLUDE 'freeform.f'PRINT *, RESULT ! Reverts to fixed formEND

ファイル freeform.f の内容は次のとおりです。

!CONVERT* SOURCEFORM(FREE(F90))RESULT = A + B

�� SOURCEFORM ( source ) ��

インクルード・ファイルが存在する既存のファイルを Fortran 90 自由ソース形式に変更するには、次のように行います。

1. インクルード・ファイルを Fortran 90 自由ソース形式に変換します。つまり、各インクルード・ファイルの先頭に SOURCEFORM ディレクティブを追加します。以下に例を示します。

!CONVERT*SOURCEFORM (FREE(F90))

この変換プロセス用の trigger_constant を定義します。

2. すべてのインクルード・ファイルが変換されたら、.f ファイルを変換します。それぞれのファイルの先頭に同じ SOURCEFORM ディレクティブを追加するか、.f ファイルが -qfree=f90 を指定してコンパイルされることを確認します。

3. すべてのファイルが変換されたら、-qnodirective コンパイラー・オプションを指定してディレクティブの処理を使用不可にできます。コンパイル時に -qfree=f90 が使用されていることを確認してください。不必要な SOURCEFORM ディレクティブを削除することもできます。

590 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 617: IBM XL Fortran for Linux, V15.1

STREAM_UNROLL目的

STREAM_UNROLL ディレクティブは、反復数の多い DO ループ に対してソフトウェア・プリフェッチとループのアンロール (展開) を結合した機能を適用することを、コンパイラーに指示します。ストリームのアンロール機能は、DO ループを最適化して、複数のストリームが使用されるようにします。STREAM_UNROLL ディレクティブは、内部と外部の両方の DO ループに対して指定でき、コンパイラーは、最適な数のストリームを使用して、可能な限りストリームのアンロールを実行します。依存関係を持つループに STREAM_UNROLL ディレクティブを適用すると、予期しない結果になります。

構文

unroll_factor

unroll_factor は、正のスカラー整数定数式でなければなりません。unroll_factor が 1 の場合、ループのアンロールは使用不可になります。unroll_factor が指定されていない場合、ストリームのアンロールを実行するのに最適の数をコンパイラーが決定します。

規則

ループのアンロールを使用可能にするには、以下のコンパイラー・オプションのいずれかを指定する必要があります。v -O3 以上の最適化レベルv -qhot コンパイラー・オプションv -qsmp コンパイラー・オプション

-qstrict オプションが有効な場合はストリームのアンロールは発生しないことに注意してください。-qhot オプションのみを使用してストリームのアンロールを使用可能にしたい場合、-qstrict=none も指定する必要があります。

STREAM_UNROLL ディレクティブは、DO ループの直前になければなりません。

STREAM_UNROLL ディレクティブを複数回指定してはなりません。また、同じDO 構文に対して、このディレクティブを UNROLL、 NOUNROLL、UNROLL_AND_FUSE、または NOUNROLL_AND_FUSE ディレクティブと結合してはなりません。

STREAM_UNROLL ディレクティブを DO WHILE ループまたは無限 DO ループに対して指定してはなりません。

以下に、パフォーマンスを向上させる STREAM_UNROLL の例を示します。

�� STREAM_UNROLL( unroll_factor )

��

第 12 章 ディレクティブ (IBM 拡張) 591

Page 618: IBM XL Fortran for Linux, V15.1

integer, dimension(1000) :: a, b, cinteger i, m, n

!IBM* stream_unroll(4)do i =1, n

a(i) = b(i) + c(i)enddoend

unroll factor は、次のように、反復数を n から n/4 に減らします。

m = n/4do i =1, n/4

a(i) = b(i) + c(i)a(i+m) = b(i+m) + c(i+m)a(i+2*m) = b(i+2*m) + c(i+2*m)a(i+3*m) = b(i+3*m) + c(i+3*m)

enddo

増加した数の読み取り操作と補完操作は、コンパイラーが決定した数のストリームに振り分けられ、その結果、計算時間が短くなり、パフォーマンスが向上します。

関連情報v XL Fortran におけるプリフェッチ技法の使用の詳細については、PREFETCH ディレクティブ・セットを参照してください。

v ループの最適化に関するその他の方法については、BLOCK_LOOP、LOOPID、UNROLL、および UNROLL_AND FUSE ディレクティブを参照してください。

SUBSCRIPTORDER目的

SUBSCRIPTORDER ディレクティブは、配列の添え字を再配置します。このディレクティブは宣言内の配列の次元の順序を変更するので、この結果、配列の形状が新しくなります。配列への参照はすべて、新しい配列形状に一致するように対応して再配置されます。

SUBSCRIPTORDER ディレクティブは、慎重に使用すれば、キャッシュ・ヒット数およびデータ・プリフェッチの量の増加によって、パフォーマンスを向上させることができます。パフォーマンスを最大限に上げる配置が見つかるまで、このディレクティブを試験的に何度か使用しなければならない場合もあります。SUBSCRIPTORDER が特に有用なのは、キャッシュを使用しないハードウェア・アーキテクチャー用に開発されたコードを移植する場合です。

PowerPC などのキャッシュ付きハードウェア・アーキテクチャーでは、各データ・エレメントにアクセスするために、キャッシュ・ライン全体のデータがプロセッサーにロードされることがよくあります。ストレージ配置の変更を使用すると、連続的にアクセスされるエレメントが隣り合って保管されるようにできます。これによって、参照される各キャッシュ・ラインでエレメントのアクセス数が増えるので、パフォーマンスが向上することになります。さらに、連続してアクセスされる配列が隣り合っていると、プロセッサーのプリフェッチ機能を活用するのに役立ちます。

592 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 619: IBM XL Fortran for Linux, V15.1

構文

subscriptorder_array は次のとおりです。

配列名 (array name)

配列の名前です。

subscriptorder_number

整数定数です。

規則

SUBSCRIPTORDER ディレクティブは、subscriptorder_array リスト内の配列に対するすべての宣言 (すべての USE ステートメントの後) および参照に先行する有効範囲単位内に存在する必要があります。このディレクティブは、その有効範囲単位にのみ適用され、最低でも 1 つの配列を含む必要があります。複数の有効範囲単位が 1 つの配列を共有している場合は、SUBSCRIPTORDER ディレクティブを、同一の添え字配置で、該当する各有効範囲単位に適用する必要があります。複数の有効範囲単位で配列を共用する方法の例には、 COMMON ステートメント、USE ステートメント、およびサブルーチン引数があります。

subscriptorder_number リスト内の最小の添え字番号は 1 でなければなりません。最大の番号は、対応する配列の次元数と等しくなければなりません。これら 2 つの限界値の間にあるすべての整数 (限界値を含む) は、再配置の前の添え字番号を示し、リストに一度だけ含まれている必要があります。

1 つの有効単位内の 1 つの特定の配列に対して、SUBSCRIPTORDER ディレクティブを複数回適用してはなりません。

エレメント型プロシージャーに実引数として配列を渡すとき、そのうちの 1 つの配列が SUBSCRIPTORDER ディレクティブに指定されている場合には、配列形状の適合性を維持する必要があります。また、SHAPE、SIZE、LBOUND、およびUBOUND 照会組み込みプロシージャーの実引数、および大部分の変形組み込みプロシージャーの実引数の調整も行う必要があります。

入力データ・ファイル内のデータ、および SUBSCRIPTORDER ディレクティブに指定された配列の明示的初期化のデータを手動で変更する必要があります。

�� �

,

SUBSCRIPTORDER ( subscriptorder_array ) ��

�� �

,

array_name ( subscriptorder_number ) ��

第 12 章 ディレクティブ (IBM 拡張) 593

Page 620: IBM XL Fortran for Linux, V15.1

COLLAPSE ディレクティブも適用される配列では、COLLAPSE ディレクティブは、常に、添え字再配列より前の次元数を参照します。

想定サイズ配列の最後の次元を再配置してはなりません。

例 1: 次の例では、SUBSCRIPTORDER ディレクティブは、明示的形状配列に適用され、その配列へのすべての参照の添え字を、プログラム出力に影響することなく交換します。

!IBM* SUBSCRIPTORDER(A(2,1))INTEGER COUNT/1/, A(3,2)

DO J = 1, 3DO K = 1, 2

! Inefficient coding: innermost index is accessing rightmost! dimension. The subscriptorder directive compensates by! swapping the subscripts in the array's declaration and! access statements.!

A(J,K) = COUNTPRINT*, J, K, A(J,K)

COUNT = COUNT + 1END DO

END DO

上記のディレクティブがなければ、配列形状は (3,2) です。配列エレメントは次の順序で保管されます。

A(1,1) A(2,1) A(3,1) A(1,2) A(2,2) A(3,2)

ディレクティブがある場合は、配列形状は (2,3) です。配列エレメントは次の順序で保管されます。

A(1,1) A(2,1) A(1,2) A(2,2) A(1,3) A(2,3)

関連情報

COLLAPSE ディレクティブの詳細については、 565ページの『COLLAPSE』 を参照してください。

UNROLL目的

UNROLL ディレクティブは、可能であればループのアンロール (展開) を試みることをコンパイラーに指示します。ループのアンロールは、DO ループの本体を複製して、ループ完了に必要な反復回数を減らします。

-qunroll コンパイラー・オプションを使用すれば、ファイル全体のループのアンロールを制御できます。特定の DO ループに対するディレクティブの指定は、常にこのコンパイラー・オプションをオーバーライドします。

594 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 621: IBM XL Fortran for Linux, V15.1

構文

unroll_factor

unroll_factor は、正のスカラー整数定数式でなければなりません。unroll_factor が 1 の場合、ループのアンロールは使用不可になります。unroll_factor が指定されていない場合、コンパイラーがループのアンロールを決定します。

規則

ループのアンロールを使用可能にするには、以下のコンパイラー・オプションのいずれかを指定する必要があります。v -O3 以上の最適化レベルv -qhot コンパイラー・オプションv -qsmp コンパイラー・オプション

UNROLL ディレクティブは、DO ループの直前になければなりません。

UNROLL ディレクティブを複数回指定してはなりません。また、同じ DO 構文に対して、このディレクティブを NOUNROLL、STREAM_UNROLL、UNROLL_AND_FUSE、または NOUNROLL_AND_FUSE ディレクティブと結合してはなりません。

UNROLL ディレクティブを DO WHILE ループまたは無限 DO ループに対して指定してはなりません。

例 1: 次の例で使用されている UNROLL(2) ディレクティブは、ループ本体を複製して、1 回の反復で 2 回の反復分の作業が実行されるようにできることをコンパイラーに通知します。コンパイラーは、ループをアンロールした場合、1000 回の反復を実行する代わりに、500 回だけ反復を実行することになります。

!IBM* UNROLL(2)DO I = 1, 1000

A(I) = IEND DO

コンパイラーが上記のループをアンロールすることを選択すると、コンパイラーはループを実質的には以下と同じになるように変換します。

DO I = 1, 1000, 2A(I) = IA(I+1) = I + 1

END DO

例 2: 最初の DO ループで、UNROLL(3) が使用されています。アンロールが実行される場合、コンパイラーは、ループを展開して、3 回の反復分の操作が 1 回の反

�� UNROLL( unroll_factor )

NOUNROLL

��

第 12 章 ディレクティブ (IBM 拡張) 595

Page 622: IBM XL Fortran for Linux, V15.1

復で実行されるようにします。2 番目の DO ループでは、パフォーマンスが最大になるようなループのアンロール方法をコンパイラーが決定します。

PROGRAM GOODUNROLL

INTEGER I, X(1000)REAL A, B, C, TEMP, Y(1000)

!IBM* UNROLL(3)DO I = 1, 1000

X(I) = X(I) + 1END DO

!IBM* UNROLLDO I = 1, 1000

A = -IB = I + 1C = I + 2TEMP = SQRT(B*B - 4*A*C)Y(I) = (-B + TEMP) / (2*A)

END DOEND PROGRAM GOODUNROLL

関連情報v ループの最適化に関するその他の方法については、BLOCK_LOOP、LOOPID、

STREAM UNROLL、および UNROLL_AND_FUSE ディレクティブを参照してください。

UNROLL_AND_FUSE目的

UNROLL_AND_FUSE ディレクティブは、可能であればループのアンロール (展開)

とヒューズ (融合) を試みるようコンパイラーに指示します。ループのアンロールは、複数の DO ループの本体を複製し、必要な反復を結合して、アンロールされた単一のループにします。ヒューズされたループを使用することによって、ループ反復の必要回数を最小化し、キャッシュ・ミスの回数も減らすことができます。依存関係を持つループに UNROLL_AND_FUSE ディレクティブを適用すると、予期しない結果になります。

構文

unroll_factor

unroll_factor は、正のスカラー整数定数式でなければなりません。unroll_factor が 1 の場合、ループのアンロールは使用不可になります。unroll_factor が指定されていない場合、コンパイラーがループのアンロールを決定します。

�� UNROLL_AND_FUSE( unroll_factor )

NOUNROLL_AND_FUSE

��

596 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 623: IBM XL Fortran for Linux, V15.1

規則

ループのアンロールを使用可能にするには、以下のコンパイラー・オプションのいずれかを指定する必要があります。v -O3 以上の最適化レベルv -qhot コンパイラー・オプションv -qsmp コンパイラー・オプション

-qstrict オプションが有効な場合はループのアンロールは発生しないことに注意してください。-qhot オプションのみを使用してループのアンロールを使用可能にしたい場合、-qnostrict も指定する必要があります。

UNROLL_AND_FUSE ディレクティブは、DO ループの直前になければなりません。

UNROLL_AND_FUSE ディレクティブは、最も内側の DO ループに対して指定してはなりません。

UNROLL_AND_FUSE ディレクティブを複数回指定してはなりません。また、同じDO 構文に対して、このディレクティブを NOUNROLL_AND_FUSE、NOUNROLL、UNROLL、または STREAM_UNROLL ディレクティブと結合してはなりません。

UNROLL_AND_FUSE ディレクティブを DO WHILE ループまたは無限 DO ループに対して指定してはなりません。

例 1: 次の例では、UNROLL_AND_FUSE ディレクティブは、ループの本体を複製し、ヒューズします。これによって、配列 B のキャッシュ・ミスの数が減少します。

INTEGER, DIMENSION(1000, 1000) :: A, B, C!IBM* UNROLL_AND_FUSE(2)

DO I = 1, 1000DO J = 1, 1000

A(J,I) = B(I,J) * C(J,I)END DO

END DOEND

次の DO ループは、上記の UNROLL_AND_FUSE ディレクティブを適用した結果として考えられるものです。

DO I = 1, 1000, 2DO J = 1, 1000

A(J,I) = B(I,J) * C(J,I)A(J,I+1) = B(I+1, J) * C(J, I+1)

END DOEND DO

例 2: 次の例では、複数の UNROLL_AND_FUSE ディレクティブが使用されています。

INTEGER, DIMENSION(1000, 1000) :: A, B, C, D, H!IBM* UNROLL_AND_FUSE(4)

DO I = 1, 1000!IBM* UNROLL_AND_FUSE(2)

第 12 章 ディレクティブ (IBM 拡張) 597

Page 624: IBM XL Fortran for Linux, V15.1

DO J = 1, 1000DO k = 1, 1000

A(J,I) = B(I,J) * C(J,I) + D(J,K)*H(I,K)END DO

END DOEND DOEND

関連情報v ループの最適化に関するその他の方法については、BLOCK_LOOP、LOOPID、

STREAM UNROLL、および UNROLL ディレクティブを参照してください。

598 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 625: IBM XL Fortran for Linux, V15.1

第 13 章 ハードウェア固有のディレクティブ

このセクションでは、ハードウェア固有のコンパイラー・ディレクティブをアルファベット順に解説します。ディレクティブは、そうではないと注記されていない限り、サポートされるすべてのハードウェアで機能します。このセクションには、以下のカテゴリーが含まれています。

キャッシュ制御

CACHE_ZERO目的

CACHE_ZERO ディレクティブは、マシン・インストラクション dcbz (data cache

block set to zero) を起動します。この命令は、指定された変数に対応するデータ・キャッシュ・ブロックをゼロにセットします。このディレクティブは、慎重に使用してください。

構文

cv_var ゼロに設定されるキャッシュ・ブロックに関連付けられた変数。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008 サブモジュール名 F2008 、関数名、定数、ラベル、ゼロ・サイズのストリング、またはベクトル添え字を持つ配列にすることはできません。

次の例では、ゼロに設定したいキャッシュ・ブロックに配列 ARRA が既にロード済みであると想定します。このキャッシュ・ブロック内のデータがゼロに設定されます。

real(4) :: arrA(2**5)! ....!IBM* CACHE_ZERO(arrA(1)) ! set data in cache block to zero

DCBF目的

DCBF ディレクティブは、変更されたキャッシュ・ブロックをメイン・メモリーにコピーし、データ・キャッシュにあるコピーを無効にします。variable を含んでいるキャッシュ・ブロックがデータ・キャッシュ内に存在し、そのキャッシュ・ブロ

�� CACHE_ZERO ( cv_var_list ) ��

© Copyright IBM Corp. 1996, 2015 599

Page 626: IBM XL Fortran for Linux, V15.1

ックが変更されている場合、それがメイン・メモリーにコピーされます。

構文

variable

サブプログラムへの参照による受け渡しが可能な任意のデータ項目。ただし、名前付き定数、長さゼロの配列、ベクトル添え字付きの配列セクションは除外されます。

DCBFL目的

DCBFL ディレクティブは、指定されたプリフェッチ変数の場所のキャッシュ・ラインを、L1 データ・キャッシュのみからフラッシュし、最新バージョンのターゲット・ストレージ・ブロックがまだ L2 にあるが、もう L1 にはないことを確実にします。

構文

variable

サブプログラムへの参照による受け渡しが可能な任意のデータ項目。ただし、名前付き定数、長さゼロの配列、ベクトル添え字付きの配列セクションは除外されます。

DCBFLP目的

DCBFLP ディレクティブは、アドレスにあるキャッシュ・ラインを、シングル・プロセッサーの 1 次データ・キャッシュからフラッシュします。

構文

�� DCBF ( variable ) ��

�� DCBFL ( variable ) ��

�� DCBFLP ( variable ) ��

600 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 627: IBM XL Fortran for Linux, V15.1

variable

サブプログラムへの参照による受け渡しが可能な任意のデータ項目。ただし、名前付き定数、長さゼロの配列、ベクトル添え字付きの配列セクションは除外されます。

DCBST目的

DCBST ディレクティブは、変更されたキャッシュ・ブロックをメイン・メモリーにコピーします。 variable を含んでいるキャッシュ・ブロックがデータ・キャッシュ内に存在し、そのキャッシュ・ブロックが変更されている場合、それがメイン・メモリーにコピーされます。

構文

variable

サブプログラムへの参照による受け渡しが可能な任意のデータ項目。ただし、名前付き定数、長さゼロの配列、ベクトル添え字付きの配列セクションは除外されます。

EIEIO目的

入出力の順序付けられた実行を強制します (EIEIO (Enforce In-order Execution of

Input/Output))。

EIEIO ディレクティブを使用すると、このディレクティブの前にある I/O ストレージ・アクセス命令がすべて完了してからでないと、このディレクティブの後にあるI/O アクセス命令が開始しないことを指定できます。EIEIO は、ロード/保管アクセスの実行順序が重要な共用データ命令を管理するときに使用してください。

EIEIO は、他の同期命令では発生しうるパフォーマンスへの負担なしで、 I/O ストアを制御するのに必要な機能を提供します。

構文

�� DCBST ( variable ) ��

�� EIEIO ��

第 13 章 ハードウェア固有のディレクティブ 601

Page 628: IBM XL Fortran for Linux, V15.1

ISYNC目的

ISYNC ディレクティブを使用すると、先行するすべての命令が完了した後に、プリフェッチされた命令を破棄することができます。後続の命令は、ストレージからフェッチまたは再フェッチされ、直前の命令のコンテキストで実行されます。このディレクティブは、ISYNC を実行するプロセッサーにのみ影響します。

構文

LIGHT_SYNC目的

LIGHT_SYNC ディレクティブは、LIGHT_SYNC の前にあるすべての保管が完了してからでないと、 LIGHT_SYNC ディレクティブを実行したプロセッサーでは新しい命令を実行できないようにします。これによって、複数のプロセッサー間での同期化を実行できます。その際、LIGHT_SYNC は各プロセッサーからの確認応答を待たないので、パフォーマンスへの影響を最小限にとどめることができます。

構文

PREFETCHPREFETCH ディレクティブは、特定のデータについて、参照される前に、そのデータをメイン・メモリーからキャッシュにロードするようコンパイラーに指示します。ハードウェアで自動的に実行されるプリフェッチもありますが、コンパイラーが支援するソフトウェア・プリフェッチはソース・コードから直接的に情報を利用できるため、このディレクティブを指定することによって、キャッシュ・ミスの数を大幅に減らすことができます。

規則

変数がプリフェッチされるときには、変数アドレスが含まれているメモリー・ブロックがキャッシュにロードされます。1 つのメモリー・ブロックは、 1 つのキャッシュ・ラインのサイズと同じです。キャッシュにロードしようとしている変数はメ

�� ISYNC ��

�� LIGHT_SYNC ��

602 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 629: IBM XL Fortran for Linux, V15.1

モリー・ブロック内のどこにあってもかまわないので、配列のすべてのエレメントをプリフェッチできないこともあります。

これらのディレクティブは、ソース・コード内で、実行可能構文を置くことのできる場所であればどこにあってもかまいません。

これらのディレクティブを使用すると、プログラムの実行時オーバーヘッドが増えることがあります。従って、これらのディレクティブは必要な場合にのみ使用するようにしてください。

プリフェッチ・ディレクティブの効果を最大化するために、単一のプリフェッチの後、または一連のプリフェッチの最後に、LIGHT_SYNC ディレクティブを指定することをお勧めします。

関連情報

反復数の大きいループへのプリフェッチ技法の適用については、STREAM_UNROLL ディレクティブを参照してください。

DCBTSTT目的

DCBTSTT ディレクティブは、指定されたアドレスを格納しているメモリーのブロックをデータ・キャッシュにフェッチします。格納の一時的なタッチは、プログラムが格納アクセスの対象にする可能性があるブロックを明示するヒントになります。

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008

サブモジュール名 F2008 、関数名、リテラル定数、ラベル、ゼロ・サイズのストリング、ゼロ・サイズの配列、またはベクトル添え字を持つ配列にすることはできません。

DCBTT目的

DCBTT ディレクティブは、指定されたアドレスを格納しているメモリーのブロックを L1 データ・キャッシュにロードします。

�� DCBTSTT ( prefetch_variable ) ��

第 13 章 ハードウェア固有のディレクティブ 603

Page 630: IBM XL Fortran for Linux, V15.1

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008

サブモジュール名 F2008 、関数名、リテラル定数、ラベル、ゼロ・サイズのストリング、ゼロ・サイズの配列、またはベクトル添え字を持つ配列にすることはできません。

DEFAULT_PREFETCH_DEPTH目的

DEFAULT_PREFETCH_DEPTH ディレクティブは、ハードウェア検出のストリームとソフトウェア定義のストリームのプリフェッチ深さを定義します。このディレクティブは、次のいずれかの場合に有効になります。

v プリフェッチ深さに 0 が指定されている場合

v TH=1010 が指定されている __dcbt または __dcbtst が使用されていない場合

構文

prefetch_depth

0 から 7 までの値を持つ整数型のスカラーでなければなりません。これは以下の定義済みレベルを持つ相対値です。

表 56. 緊急

整数値 緊急

0 デフォルト

1 緊急でない

2 緊急度が最も低い

3 緊急度が低い

4 中

5 緊急

6 緊急度が高い

7 緊急度が最も高い

�� DCBTT ( prefetch_variable ) ��

�� DEFAULT_PREFETCH_DEPTH ( prefetch_depth ) ��

604 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 631: IBM XL Fortran for Linux, V15.1

DEPTH_ATTAINMENT_URGENCY目的

DEPTH_ATTAINMENT_URGENCY ディレクティブは、ハードウェア検出のストリームのプリフェッチ深さに達した場合の緊急度を設定します。

構文

urgency

0 から 7 までの値を持つ整数型のスカラーでなければなりません。これは以下の定義済みレベルを持つ相対値です。

表 57. 緊急

整数値 緊急

0 デフォルト

1 緊急でない

2 緊急度が最も低い

3 緊急度が低い

4 中

5 緊急

6 緊急度が高い

7 緊急度が最も高い

HARDWARE_TRANSIENT_ENABLE目的

HARDWARE_TRANSIENT_ENABLE ディレクティブにより、ハードウェア検出のストリームに対する一時属性を使用可能または使用不可にします。

構文

注: データ・ストリーム制御レジスター (DSCR) によって一時属性をストリームに適用するには、4 つの使用可能化組み込み関数のうちの少なくとも 2 つを設定する必要があります。1 つの関数を、アクセスのタイプ (ロードまたは保管) を選択するように設定して、もう 1 つの関数を、プリフェッチのタイプ (ソフトウェア定義またはハードウェア検出) を選択するように設定します。

flag スカラー論理式です。.FALSE. という値は、ハードウェア検出のストリーム

�� DEPTH_ATTAINMENT_URGENCY ( urgency ) ��

�� HARDWARE_TRANSIENT_ENABLE ( flag ) ��

第 13 章 ハードウェア固有のディレクティブ 605

Page 632: IBM XL Fortran for Linux, V15.1

に対する一時属性を使用不可にします。.TRUE. という値は、ハードウェア検出のストリームに対する一時属性を使用可能にします。

HARDWARE_UNIT_COUNT_ENABLE目的

HARDWARE_UNIT_COUNT_ENABLE ディレクティブは、ハードウェア検出のストリームに対する装置カウントを使用可能または使用不可にします。装置カウントはスカラーの整数型であり、キャッシュ・ラインの数を示す 0 から 1023 の値が指定されます。

構文

flag スカラー論理式です。.TRUE. という値は、ハードウェア検出のストリームに対する装置カウントを使用可能にします。.FALSE. という値は、ハードウェア検出のストリームに対する装置カウントを使用不可にします。

LOAD_STREAM_DISABLE目的

LOAD_STREAM_DISABLE ディレクティブにより、ハードウェア検出と、ロード・ストリームの開始を実行できないようにします。

構文

flag スカラー論理式です。.FALSE. という値は、ロード・ストリームのハードウェア検出および開始を無効にします。.TRUE. という値は、ロード・ストリームのハードウェア検出および開始を有効にします。

LOAD_TRANSIENT_ENABLE目的

LOAD_TRANSIENT_ENABLE ディレクティブにより、ロード・ストリームに対する一時属性を使用可能または使用不可にします。

構文

�� HARDWARE_UNIT_COUNT_ENABLE ( flag ) ��

�� LOAD_STREAM_DISABLE ( flag ) ��

606 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 633: IBM XL Fortran for Linux, V15.1

注: データ・ストリーム制御レジスター (DSCR) によって一時属性をストリームに適用するには、4 つの使用可能化組み込み関数のうちの少なくとも 2 つを設定する必要があります。1 つの関数を、アクセスのタイプ (ロードまたは保管) を選択するように設定して、もう 1 つの関数を、プリフェッチのタイプ (ソフトウェア定義またはハードウェア検出) を選択するように設定します。

flag スカラー論理式です。.TRUE. という値は、ロード・ストリームの一時属性を使用可能にします。.FALSE. という値は、ロード・ストリームの一時属性を使用不可にします。

PARTIAL_DCBT目的

PARTIAL_DCBT ディレクティブは、指定されたアドレスを格納しているキャッシュ・ラインの半分を L3 データ・キャッシュにロードします。

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008

サブモジュール名 F2008 、関数名、リテラル定数、ラベル、ゼロ・サイズのストリング、ゼロ・サイズの配列、またはベクトル添え字を持つ配列にすることはできません。

PREFETCH_BY_LOAD目的

PREFETCH_BY_LOAD ディレクティブは、ロード命令によってデータをキャッシュにプリフェッチします。PREFETCH_BY_LOAD は、ハードウェア支援プリフェッチを有効にします。

構文

�� LOAD_TRANSIENT_ENABLE ( flag ) ��

�� PARTIAL_DCBT ( prefetch_variable ) ��

第 13 章 ハードウェア固有のディレクティブ 607

Page 634: IBM XL Fortran for Linux, V15.1

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008 サブモジュール名 F2008 、関数名、定数、ラベル、ゼロ・サイズのストリング、またはベクトル添え字を持つ配列にすることはできません。

PREFETCH_BY_STREAM目的

PREFETCH_BY_STREAM プリフェッチ技法は、プロセッサーを使用して、隣接するキャッシュ・ラインへの順次アクセスを認識し、予期されるラインをメモリー階層のより深いレベルから要求します。メイン・メモリーに対して繰り返し参照が行われる場合、この技法は、パスまたはストリームを確立し、十分なラインがキャッシュにロードされるまでプリフェッチの深さを増加させます。順に減少していくメモリー・アドレスからデータをフェッチするためには、PREFETCH_BY_STREAM_BACKWARD ディレクティブを使用します。増加していくメモリー・アドレスからデータをフェッチするためには、PREFETCH_BY_STREAM_FORWARD ディレクティブを使用します。このストリーム・プリフェッチを使用してデータをメイン・メモリーからキャッシュにロードすることによって、ロード待ち時間を削減または無くすことができます。

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008 サブモジュール名 F2008 、関数名、定数、ラベル、ゼロ・サイズのストリング、またはベクトル添え字を持つ配列にすることはできません。

�� PREFETCH_BY_LOAD ( prefetch_variable_list ) ��

�� PREFETCH_BY_STREAM_BACKWARD ( prefetch_variable ) ��

�� PREFETCH_BY_STREAM_FORWARD ( prefetch_variable ) ��

608 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 635: IBM XL Fortran for Linux, V15.1

PREFETCH_FOR_LOAD目的

PREFETCH_FOR_LOAD ディレクティブは、キャッシュ・プリフェッチ命令を使用して、読み取りのためにデータをキャッシュにプリフェッチします。

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008 サブモジュール名 F2008 、関数名、定数、ラベル、ゼロ・サイズのストリング、またはベクトル添え字を持つ配列にすることはできません。

PREFETCH_FOR_STORE目的

PREFETCH_FOR_STORE ディレクティブは、キャッシュ・プリフェッチ命令を使用して、書き込みのためにデータをキャッシュにプリフェッチします。

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008 サブモジュール名 F2008 、関数名、定数、ラベル、ゼロ・サイズのストリング、またはベクトル添え字を持つ配列にすることはできません。

PREFETCH_GET_DSCR_REGISTER目的

PREFETCH_GET_DSCR_REGISTER 組み込みプロシージャーは、データ・ストリーム制御レジスター (DSCR) の現行値を返します。 DSCR は、データ・ストリーム・プリフェッチおよびランプの速度を制御するためにアクセス可能にされます。

�� PREFETCH_FOR_LOAD ( prefetch_variable_list ) ��

�� PREFETCH_FOR_STORE ( prefetch_variable_list ) ��

第 13 章 ハードウェア固有のディレクティブ 609

Page 636: IBM XL Fortran for Linux, V15.1

クラス

関数

引数型および属性

なし

結果型および属性

結果は INTEGER (8) 型です。

PREFETCH_SET_DSCR_REGISTER(VALUE)目的

PREFETCH_SET_DSCR_REGISTER 組み込みプロシージャーは、データ・ストリーム制御レジスター (DSCR) の値を入力値に設定します。DSCR は、データ・ストリーム・プリフェッチおよびランプの速度を制御するためにアクセス可能にされます。

クラス

サブルーチン

引数型および属性VALUE

INTENT(IN) INTEGER (8)。

結果型および属性

なし

PROTECTED_STORE_STREAM_SET目的

PROTECTED_STORE_STREAM_SET_FORWARD ディレクティブは、指定されたプリフェッチ変数の場所にあるキャッシュ・ラインで始まる保護ストア・ストリームを設定し、メモリー・アドレス増加方向にフェッチします。PROTECTED_STORE_STREAM_SET_BACKWARD ディレクティブは、メモリー・アドレス減少方向にフェッチします。

構文

�� PROTECTED_STORE_STREAM_SET_FORWARD ( prefetch_variable , stream_ID ) ��

610 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 637: IBM XL Fortran for Linux, V15.1

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008

サブモジュール名 F2008 、関数名、リテラル定数、ラベル、ゼロ・サイズのストリング、ゼロ長の配列、またはベクトル添え字を持つ配列にすることはできません。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。POWER® 8 プロセッサーの場合、0 から 11 までの任意の数値を使用できます。

PROTECTED_STREAM_COUNT目的

PROTECTED_STREAM_COUNT ディレクティブは、長さ制限のある指定されたストリーム用のキャッシュ・ラインの数を設定します。

構文

unit_count

長さ制限のある保護ストリーム用のキャッシュ・ラインの数です。これは、整数型のスカラーでなければなりません。0 から 1023 までの任意の数にできます。 1024 キャッシュ・ラインよりも大きなストリームの場合、PROTECTED_STREAM ディレクティブの代わりに、PROTECTED_UNLIMITED_STREAM ディレクティブを使用してください。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。 POWER8® プロセッサーの場合は 0 から 11 の任意の数値です。

PROTECTED_STREAM_COUNT_DEPTH目的

PROTECTED_STREAM_COUNT_DEPTH ディレクティブは、長さ制限のある指定されたストリーム用のキャッシュ・ライン数とプリフェッチ深さを設定します。

�� PROTECTED_STORE_STREAM_SET_BACKWARD ( prefetch_variable , stream_id ) ��

�� PROTECTED_STREAM_COUNT ( unit_count , stream_id ) ��

第 13 章 ハードウェア固有のディレクティブ 611

Page 638: IBM XL Fortran for Linux, V15.1

構文

unit_count

長さ制限のある保護ストリーム用のキャッシュ・ラインの数です。これは、整数型のスカラーでなければなりません。0 から 1023 までの任意の数にできます。 1024 キャッシュ・ラインよりも大きなストリームの場合、PROTECTED_STREAM ディレクティブの代わりに、PROTECTED_UNLIMITED_STREAM ディレクティブを使用してください。

prefetch_depth

範囲 0 から 7 の整変数または数値リテラルのいずれかで指定できます。これは、以下のように質的に定義されたレベルの相対値です。

表 58. プリフェッチ深さ

整数値 深さ

0 デフォルト

1 なし

2 最も浅い

3 浅い

4 中

5 深い

6 より深い

7 最も深い

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。 POWER8 プロセッサーの場合は 0 から 11 の任意の数値です。

PROTECTED_STREAM_GO目的

PROTECTED_STREAM_GO ディレクティブは、長さ制限のあるすべてのストリームのプリフェッチを開始します。

構文

�� PROTECTED_STREAM_COUNT_DEPTH ( unit_count , prefetch_depth , stream_id ) ��

�� PROTECTED_STREAM_GO ��

612 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 639: IBM XL Fortran for Linux, V15.1

PROTECTED_STREAM_SET目的

PROTECTED_STREAM_SET_FORWARD ディレクティブは、指定されたプリフェッチ変数の場所にあるキャッシュ・ラインで始まる保護ストリームを設定し、メモリー・アドレス増加方向にフェッチします。PROTECTED_STREAM_SET_BACKWARD ディレクティブは、メモリー・アドレス減少方向にフェッチします。

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008

サブモジュール名 F2008 、関数名、リテラル定数、ラベル、ゼロ・サイズのストリング、ゼロ長の配列、またはベクトル添え字を持つ配列にすることはできません。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。 POWER8 プロセッサーの場合は 0 から 11 の任意の数値です。

PROTECTED_STREAM_STRIDE目的

PROTECTED_STREAM_STRIDE ディレクティブは、指定されたプリフェッチ・ストリームの各エレメント間の間隔を設定します。

構文

address_offset

プリフェッチされるストリームの最初の単位の位置を示すワード・オフセッ

�� PROTECTED_STREAM_SET_FORWARD ( prefetch_variable , stream_ID ) ��

�� PROTECTED_STREAM_SET_BACKWARD ( prefetch_variable , stream_id ) ��

�� PROTECTED_STREAM_STRIDE ( address_offset, stride, stream_id ) ��

第 13 章 ハードウェア固有のディレクティブ 613

Page 640: IBM XL Fortran for Linux, V15.1

トです。つまり、最初の単位のアドレスを、キャッシュ・ラインの先頭からのワード数で示したものです。この変数は、整数型のスカラーでなければなりません。address_offset を取得する方法の例を次に示します。

i8 = LOC(variable_name)

address_offset = ISHFT(IAND(i8,127_8),-2)

i8 は INTEGER(8) 型、address_offset は INTEGER(4) 型です。variable_name はどの型でもかまいません。

stride プリフェッチ・ストリームのエレメント間の間隔 (ワード・サイズ) をバイト数で表したもの。この変数は、範囲が 0 から 262143 までの整数型のスカラーでなければなりません。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。POWER8 プロセッサーの場合は 0 から 11 の任意の数値です。

PROTECTED_STREAM_STOP目的

PROTECTED_STREAM_STOP ディレクティブは、指定された保護ストリームのプリフェッチを停止します。

構文

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。 POWER8 プロセッサーの場合は 0 から 11 の任意の数値です。

PROTECTED_STREAM_STOP_ALL目的

PROTECTED_STREAM_STOP_ALL ディレクティブは、すべての保護ストリームのプリフェッチを停止します。

構文

�� PROTECTED_STREAM_STOP ( stream_id ) ��

�� PROTECTED_STREAM_STOP_ALL ��

614 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 641: IBM XL Fortran for Linux, V15.1

PROTECTED_UNLIMITED_STORE_STREAM _SET目的

PROTECTED_UNLIMITED_STORE_STREAM_SET_FORWARD ディレクティブは、指定されたプリフェッチ変数の場所にあるキャッシュ・ラインで始まる、長さ無制限の保護ストア・ストリームを設定し、メモリー・アドレス増加方向にフェッチします。PROTECTED_UNLIMITED_STORE_STREAM_SET_BACKWARD ディレクティブは、メモリー・アドレス減少方向にフェッチします。

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008

サブモジュール名 F2008 、関数名、リテラル定数、ラベル、ゼロ・サイズのストリング、ゼロ長の配列、またはベクトル添え字を持つ配列にすることはできません。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。POWER8 プロセッサーの場合は 0 から 11 の任意の数値です。

PROTECTED_UNLIMITED_STREAM_SET目的

PROTECTED_UNLIMITED_STREAM_SET_FORWARD ディレクティブは、指定されたプリフェッチ変数の場所にあるキャッシュ・ラインで始まる、長さ無制限の保護ストリームを設定し、メモリー・アドレス増加方向にフェッチします。PROTECTED_UNLIMITED_STREAM_SET_BACKWARD ディレクティブは、メモリー・アドレス減少方向にフェッチします。

�� PROTECTED_UNLIMITED_STORE_STREAM_SET_FORWARD ( prefetch_variable , stream_id ) ��

�� PROTECTED_UNLIMITED_STORE_STREAM_SET_BACKWARD ( prefetch_variable , stream_id ) ��

第 13 章 ハードウェア固有のディレクティブ 615

Page 642: IBM XL Fortran for Linux, V15.1

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008

サブモジュール名 F2008 、関数名、リテラル定数、ラベル、ゼロ・サイズのストリング、ゼロ長の配列、またはベクトル添え字を持つ配列にすることはできません。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。 POWER8 プロセッサーの場合は 0 から 11 の任意の数値です。

PROTECTED_UNLIMITED_STREAM_ SET_GO目的

PROTECTED_UNLIMITED_STREAM_SET_GO_FORWARD ディレクティブは、指定されたプリフェッチ変数の場所にあるキャッシュ・ラインで始まる、長さ無制限の保護ストリームを設定します。このディレクティブは、メモリー・アドレス増加方向にデータをフェッチします。PROTECTED_UNLIMITED_STREAM_SET_GO_BACKWARD ディレクティブは、メモリー・アドレス減少方向にフェッチします。

構文

prefetch_variable

プリフェッチされる変数です。この変数は、決定可能なストレージ・アドレスを持つデータ・オブジェクトでなければなりません。この変数の型は、組

�� PROTECTED_UNLIMITED_STREAM_SET_FORWARD ( prefetch_variable , stream_id ) ��

�� PROTECTED_UNLIMITED_STREAM_SET_BACKWARD ( prefetch_variable , stream_id ) ��

�� PROTECTED_UNLIMITED_STREAM_SET_GO_FORWARD ( prefetch_variable , stream_id ) ��

�� PROTECTED_UNLIMITED_STREAM_SET_GO_BACKWARD ( prefetch_variable , stream_id ) ��

616 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 643: IBM XL Fortran for Linux, V15.1

み込みデータ型および派生データ型を含む、任意のデータ型が可能です。この変数は、プロシージャー名、サブルーチン名、モジュール名、 F2008

サブモジュール名 F2008 、関数名、リテラル定数、ラベル、ゼロ・サイズのストリング、ゼロ長の配列、またはベクトル添え字を持つ配列にすることはできません。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。この値は 0 から 11 までの任意の数値を使用できます。

SET_PREFETCH_UNIT_COUNT目的

SET_PREFETCH_UNIT_COUNT ディレクティブで、データ・ストリーム内の単位数を設定します。

構文

count キャッシュ・ラインの数。0 から 1023 の範囲内の値を持つ整数型のスカラーである必要があります。

SOFTWARE_TRANSIENT_ENABLE目的

SOFTWARE_TRANSIENT_ENABLE ディレクティブにより、ソフトウェア定義のストリームに対する一時属性を使用可能または使用不可にします。

構文

注: データ・ストリーム制御レジスター (DSCR) によって一時属性をストリームに適用するには、4 つの使用可能化組み込み関数のうちの少なくとも 2 つを設定する必要があります。1 つの関数を、アクセスのタイプ (ロードまたは保管) を選択するように設定して、もう 1 つの関数を、プリフェッチのタイプ (ソフトウェア定義またはハードウェア検出) を選択するように設定します。

flag スカラー論理式です。.TRUE. という値は、ソフトウェア定義のストリームに対する一時属性を使用可能にします。.FALSE. という値は、ソフトウェア定義のストリームに対する一時属性を使用不可にします。

�� SET_PREFETCH_UNIT_COUNT ( count ) ��

�� SOFTWARE_TRANSIENT_ENABLE ( flag ) ��

第 13 章 ハードウェア固有のディレクティブ 617

Page 644: IBM XL Fortran for Linux, V15.1

SOFTWARE_UNIT_COUNT_ENABLE目的

SOFTWARE_UNIT_COUNT_ENABLE ディレクティブにより、ソフトウェア定義のストリームに対する装置カウントを使用可能または使用不可にします。装置カウントは、スカラーであり、整数型です。その値は 0 から 1023 の範囲内であり、これはキャッシュ・ラインの数を示します。

構文

flag スカラー論理式です。.TRUE. という値は、ソフトウェア定義のストリームに対する装置カウントを使用可能にします。.FALSE. という値は、ソフトウェア定義のストリームに対する装置カウントを使用不可にします。

STORE_TRANSIENT_ENABLE目的

STORE_TRANSIENT_ENABLE ディレクティブにより、保管ストリームに対する一時属性を使用可能または使用不可にします。

構文

注: データ・ストリーム制御レジスター (DSCR) によって一時属性をストリームに適用するには、4 つの使用可能化組み込み関数のうちの少なくとも 2 つを設定する必要があります。1 つの関数を、アクセスのタイプ (ロードまたは保管) を選択するように設定して、もう 1 つの関数を、プリフェッチのタイプ (ソフトウェア定義またはハードウェア検出) を選択するように設定します。

flag スカラー論理式です。.TRUE. という値は、保管ストリームに対する一時属性を使用可能にします。.FALSE. という値は、保管ストリームに対する一時属性を使用不可にします。

STRIDE_N_STREAM_ENABLE目的

STRIDE_N_STREAM_ENABLE ディレクティブにより、ハードウェア検出と、単一キャッシュ・ブロックよりも大きいストライドを持つロード・ストリームおよび保管ストリームの開始ができます。そのようなロード・ストリームは、ロード・ストリーム無効化 (LSD) ビットの値が 0 の場合にのみ検出されます。そのような保

�� SOFTWARE_UNIT_COUNT_ENABLE ( flag ) ��

�� STORE_TRANSIENT_ENABLE ( flag ) ��

618 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 645: IBM XL Fortran for Linux, V15.1

管ストリームは、保管ストリーム有効化 (SSE) ビットの値が 1 の場合にのみ検出されます。

構文

flag スカラー論理式です。.TRUE. という値は、単一キャッシュ・ブロックよりも大きいストライドを持つロード・ストリームと保管ストリームのハードウェア検出および開始を可能にします。 .FALSE. という値は、それを不可にします。

TRANSIENT_PROTECTED_STREAM_COUNT _DEPTH目的

TRANSIENT_PROTECTED_STREAM_COUNT_DEPTH ディレクティブは、長さ制限のある指定されたプリフェッチ・ストリーム用にキャッシュ・ライン数とプリフェッチ深さを設定します。

構文

unit_count

プリフェッチするキャッシュ・ラインの数です。これは、範囲が 0 から1023 までの整数型のスカラーでなければなりません。

prefetch_depth

上記と同様に、プリフェッチの深さを設定します。これは、範囲が 0 から7 までの整数型のスカラーでなければなりません。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。POWER8 プロセッサーの場合は 0 から 11 の任意の数値です。

TRANSIENT_UNLIMITED_PROTECTED _STREAM_DEPTH目的

TRANSIENT_UNLIMITED_PROTECTED_STREAM_DEPTH ディレクティブは、長さ制限のない指定されたプリフェッチ・ストリーム用にプリフェッチ深さを設定します。

�� STRIDE_N_STREAM_ENABLE ( flag ) ��

�� TRANSIENT_PROTECTED_STREAM_COUNT_DEPTH ( unit_count, prefetch_depth, stream_id ) ��

第 13 章 ハードウェア固有のディレクティブ 619

Page 646: IBM XL Fortran for Linux, V15.1

構文

prefetch_depth

上記と同様に、プリフェッチの深さを設定します。これは、範囲が 0 から7 までの整数型のスカラーでなければなりません。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。POWER8 プロセッサーの場合は 0 から 11 の任意の数値です。

UNLIMITED_PROTECTED_STREAM_DEPTH目的

UNLIMITED_PROTECTED_STREAM_DEPTH ディレクティブは、長さ制限のない指定されたプリフェッチ・ストリーム用にプリフェッチ深さを設定します。

構文

unit_count

プリフェッチするキャッシュ・ラインの数です。これは、範囲が 0 から1023 までの整数型のスカラーでなければなりません。

prefetch_depth

上記と同様に、プリフェッチの深さを設定します。これは、範囲が 0 から7 までの整数型のスカラーでなければなりません。

stream_id

プリフェッチされるストリームの ID です。これは、整数型のスカラーでなければなりません。 POWER8 プロセッサーの場合は 0 から 11 の任意の数値です。

例例

例 1: この例は、PREFETCH_BY_LOAD、PREFETCH_FOR_LOAD、およびPREFETCH_FOR_STORE ディレクティブの有効な使用法を示しています。

この例では、キャッシュ・ラインのサイズは 64 バイトであり、宣言されたデータ項目はすべてプログラムの先頭ではキャッシュに入っていないと想定します。ディレクティブを使用する根拠は、次のとおりです。

�� TRANSIENT_UNLIMITED_PROTECTED_STREAM_DEPTH ( prefetch_depth, stream_id ) ��

�� UNLIMITED_PROTECTED_STREAM_DEPTH ( unit_count, prefetch_depth, stream_id ) ��

620 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 647: IBM XL Fortran for Linux, V15.1

v 配列 ARRA のすべてのエレメントへの代入が実行されるため、PREFETCH_FOR_STORE ディレクティブを使用して、配列の最初の 16 個およびその次の 16 個のエレメントを、参照される前に、キャッシュに入れることができます。

v 配列 ARRC のすべてのエレメントが読み取られるので、PREFETCH_FOR_LOAD ディレクティブを使用して、配列の最初の 16 のエレメントと配列の次の 16 のエレメントが参照される前に、これらをキャッシュに入れることができます。(エレメントは最初に初期化されているという前提になっています。)

v ループのそれぞれの繰り返しでは、変数 A、B、C、TEMP、I、K および配列エレメント ARRB(I*32) が使用されているので、 PREFETCH_BY_LOAD ディレクティブを使用して、変数と配列をキャッシュに入れることができます。 (キャッシュ・ラインのサイズの関係で、エレメント ARRB(I*32) から始めて ARRB の 16

のエレメントがフェッチされます。)

PROGRAM GOODPREFETCH

REAL*4 A, B, C, TEMPREAL*4 ARRA(2**5), ARRB(2**10), ARRC(2**5)INTEGER(4) I, K

! Bring ARRA into cache for writing.!IBM* PREFETCH_FOR_STORE (ARRA(1), ARRA(2**4+1))

! Bring ARRC into cache for reading.!IBM* PREFETCH_FOR_LOAD (ARRC(1), ARRC(2**4+1))

! Bring all variables into the cache.!IBM* PREFETCH_BY_LOAD (A, B, C, TEMP, I , K)

! A subroutine is called to allow clock cycles to pass so that the! data is loaded into the cache before the data is referenced.

CALL FOO()K = 32DO I = 1, 2 ** 5

! Bring ARRB(I*K) into the cache!IBM* PREFETCH_BY_LOAD (ARRB(I*K))

A = -IB = I + 1C = I + 2TEMP = SQRT(B*B - 4*A*C)ARRA(I) = ARRC(I) + (-B + TEMP) / (2*A)ARRB(I*K) = (-B - TEMP) / (2*A)

END DOEND PROGRAM GOODPREFETCH

例 2: この例では、キャッシュ・ラインのサイズ合計は 256 バイトであり、宣言されたデータ項目は最初はキャッシュまたはレジスターには保管されていないと想定します。配列 ARRA と ARRC がキャッシュに読み込まれます。

PROGRAM PREFETCH_STREAM

REAL*4 A, B, C, TEMPREAL*4 ARRA(2**5), ARRC(2**5), ARRB(2**10)INTEGER*4 I, K

! All elements of ARRA and ARRC are read into the cache.!IBM* PREFETCH_BY_STREAM_FORWARD(ARRA(1))! You can substitute PREFETCH_BY_STREAM_BACKWARD (ARRC(2**5)) to read all! elements of ARRA and ARRC into the cache.

第 13 章 ハードウェア固有のディレクティブ 621

Page 648: IBM XL Fortran for Linux, V15.1

K = 32DO I = 1, 2**5

A = -iB = i + 1C = i + 2TEMP = SQRT(B*B -4*A*C)ARRA(I) = ARRC(I) + (-B + TEMP) / (2*A)ARRB(I*K) = (-B -TEMP) / (2*A)

END DOEND PROGRAM PREFETCH_STREAM

622 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 649: IBM XL Fortran for Linux, V15.1

第 14 章 組み込みプロシージャー

Fortran には、任意のプログラムで使用できる、組み込みプロシージャーと呼ばれる多数のプロシージャーが定義されています。このセクションでは、これらのプロシージャーをアルファベット順に解説します。

組み込みプロシージャーのクラス組み込みプロシージャーには、照会関数、エレメント型プロシージャー、システム照会関数、変換関数、およびサブルーチンという 5 つのクラスがあります。

照会組み込み関数照会関数 の結果は、その主引数のプロパティーに依存します (引数の値ではありません)。引数の値は、定義されている必要はありません。

ALLOCATED LEN RANK�4�

ASSOCIATED LOC �3� SAME_TYPE_AS �1�

BIT_SIZE MAXEXPONENT SHAPE

COMMAND_ARGUMENT_COUNT �1� MINEXPONENT SIZE

DIGITS NEW_LINE �1� SIZEOF �3�

EPSILON NUM_PARTHDS �3� STORAGE_SIZE �2�

EXTENDS_TYPE_OF �1� NUM_USRTHDS �3� TINY

IS_CONTIGUOUS �2� PRECISION UBOUND

HUGE PRESENT

KIND RADIX

LBOUND RANGE

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張�4� TS 29113

エレメント型組み込みプロシージャーいくつかの組み込み関数および 1 つの組み込みサブルーチン (MVBITS) は、エレメント型 です。つまり、スカラー引数に対しても指定できますが、配列である引数を受け入れます。

すべての引数がスカラーである場合、結果はスカラーです。

いずれかの引数が配列である場合、すべての INTENT(OUT) 引数およびINTENT(INOUT) 引数は、同じ形状の配列でなければならず、残りの引数はそれらと適合するものでなければなりません。

© Copyright IBM Corp. 1996, 2015 623

Page 650: IBM XL Fortran for Linux, V15.1

結果の形状は、階数が最大の引数の形状です。結果のエレメントは、関数が各引数の対応するエレメントに個別に適用されると仮定した場合と同じです。

ABS �3� FLOOR MAX

ACHAR FRACTION MERGE

ACOS GAMMA�2� MERGE_BITS�2�

ACOSD HFIX�2� MIN

ACOSH�2� HYPOT�3� MOD

ADJUSTL IACHAR MODULO

ADJUSTR IAND MVBITS

AIMAG IBCLR NEAREST

AINT IBM2GCCLDBL�3� NINT

ASIN IBM2GCCLDBL_CMPLX�3� NOT

ASIND �3� IBSET POPCNT�2�

ASINH�2� ICHAR POPCNTB

ATAN IEOR POPPAR�1�

ATAND �3� ILEN�3� QCMPLX�3�

ATAN2 INDEX QEXT �3�

ATAN2D�3� INT REAL

BTEST INT2�3� RRSPACING

CEILING IOR RSHIFT

CHAR ISHFT SCALE

CMPLX ISHFTC SCAN

CONJG IS_IOSTAT_END�1� SET_EXPONENT

COS IS_IOSTAT_EOR�2� SHIFTA�2�

COSD�3� LEADZ�2� SHIFTL�2�

COSH LEN_TRIM SHIFTR�2�

CVMGx�3� LGAMMA�3� SIGN

DBLE LGE SIN

DCMPLX�3� LGT SIND �3�

DIM LLE SINH

DPROD LLT SPACING

DSHIFTL�2� LOG SQRT

DSHIFTR�2� LOG_GAMMA�2� TAN

ERF�2� LOG10 TAND�3�

ERFC�2� LOGICAL TANH

ERFC_SCALED�2� LSHIFT�3� TRAILZ �2�

EXP MASKL�2� VERIFY

EXPONENT MASKR�2�

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張

624 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 651: IBM XL Fortran for Linux, V15.1

システム照会組み込み関数 (IBM 拡張)システム照会関数 は、宣言式でのみ使用できます。これらの関数は、定数式では使用できず、実引数として渡すこともできません。

v NUMBER_OF_PROCESSORS

v PROCESSORS_SHAPE

変換組み込み関数上記以外のすべての組み込み関数は、変換関数 に分類されます。通常、これらの関数は、配列引数を受け入れ、引数配列のエレメントの値に基づいた配列結果を戻します。

ALL MAXVAL SELECTED_INT_KIND

ANY MINLOC SELECTED_REAL_KIND

COUNT MINVAL SPREAD

CSHIFT NULL SUM

DOT_PRODUCT PACK TRANSFER

EOSHIFT PRODUCT TRANSPOSE

FINDLOC�1� REPEAT TRIM

MATMUL RESHAPE UNPACK

MAXLOC SELECTED_CHAR_KIND �2�

注:�1� Fortran 2008

�2� Fortran 2003

配列に関するバックグラウンド情報については、 85ページの『第 5 章 配列の概念』を参照してください。

組み込みサブルーチンいくつかの組み込みプロシージャーは、サブルーチンです。これらは、さまざまな操作を実行します。

ALIGNX �3� MOVE_ALLOC �1�

ABORT �3� MVBITS

CPU_TIME RANDOM_NUMBER

DATE_AND_TIME RANDOM_SEED

EXECUTE_COMMAND_LINE �2� SIGNAL �3�

GETENV SRAND �3�

GET_COMMAND �1� SYSTEM �3�

GET_COMMAND_ARGUMENT �1� SYSTEM_CLOCK

GET_ENVIRONMENT_VARIABLE �1�

注:�1� Fortran 2003

�2� Fortran 2008

�3� IBM 拡張

第 14 章 組み込みプロシージャー 625

Page 652: IBM XL Fortran for Linux, V15.1

データ表記モデル

整数ビット・モデル以下のモデルは、負でないスカラー整数オブジェクトの各ビットをプロセッサーがどのように表現するのかを示しています。

j 整数値です。

s ビット数です。

wk 位置 k にある 2 進数 w です。

IBM 拡張

XL Fortran は、XL Fortran 整数の kind 型パラメーターに対して、以下の s パラメーターをインプリメントします。

整数 kind パラメーター s パラメーター

1 8

2 16

4 32

8 64

IBM 拡張 の終り

以下の組み込み関数がこのモデルを使用します。

BTEST IBSET ISHFTC

IAND IEOR MVBITS

IBCLR IOR NOT

IBITS ISHFT

整数データ・モデル

i 整数値です。

s 符号 (±1) です。

∑q

k = 1

i s= x1rwk

kx

626 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 653: IBM XL Fortran for Linux, V15.1

q 桁数 (正の整数) です。

wk 負でない数字 < r です。

r 基数です。

IBM 拡張

XL Fortran では、以下の r パラメーターおよび q パラメーターのこのモデルがインプリメントされています。

整数 kind パラメーター r パラメーター q パラメーター

1 2 7

2 2 15

4 2 31

8 2 63

IBM 拡張 の終り

以下の組み込み関数がこのモデルを使用します。

DIGITS RADIX RANGE

HUGE

実数データ・モデル

x 実数値です。

s 符号 (±1) です。

b 整数 > 1 です。

e emin ≤ e ≤ emax の整数です。

p 整数 > 1 です。

fk 負でない整数 < b (f1 ≠ 0) です。

注: x=0 の場合、e=0 であり、すべての fk=0 です。

IBM 拡張

XL Fortran では、以下のパラメーターのこのモデルがインプリメントされています。

p

0 or

k = 1

x =s bx x

e bfkkx

第 14 章 組み込みプロシージャー 627

Page 654: IBM XL Fortran for Linux, V15.1

実数 kind パラメーター b パラメーター p パラメーターemin パラメーター

emax パラメーター

4 2 24 -125 128

8 2 53 -1021 1024

16 2 106 -1021 1024

IBM 拡張 の終り

以下の組み込み関数がこのモデルを使用します。

DIGITS MINEXPONENT RRSPACING

EPSILON NEAREST SCALE

EXPONENT PRECISION SET_EXPONENT

FRACTION RADIX SPACING

HUGE RANGE TINY

MAXEXPONENT

組み込みプロシージャーの詳細説明以下は、組み込みプロシージャーのすべての総称名のアルファベット順リストです。

それぞれのプロシージャーごとに、数種類の情報が説明されます。

注:

1. タイトルにリストされる引数名は、そのプロシージャーを呼び出すときにキーワード引数の名前として使用できます。

2. 特定名のあるプロシージャーについては、特定名をリストした表が示され、その表には各特定関数についての説明も記述されます。

v 関数からの戻りの型または引数の型が小文字で記述されている場合、その型は記述されているように指定されるが、実際はコンパイラーが、-qintsize、-qrealsize、および -qautodbl オプションの設定に基づいて、別の特定名の呼び出しに置き換える場合があることを意味します。

例えば、SINH の参照は、-qrealsize=8 が有効である場合は DSINH に置き換えられ、 DSINH への参照は QSINH に置き換えられます。

v 「引数渡し」と書かれている欄は、その特定名をプロシージャーの実引数として渡すことができるかどうかを示します。実引数として渡すことが可能なのは、組み込みプロシージャーの特定名のみであり、一部の特定名のみに限られます。そのように渡された特定名は、スカラー引数でのみ参照が可能です。

3. 特定名は分かっているが総称名が不明である場合のために、索引には特定名も項目として含まれています。

628 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 655: IBM XL Fortran for Linux, V15.1

ABORT() (IBM 拡張)目的

シグナル SIGABRT がキャッチされておりシグナル・ハンドラーが返されない場合を除いて、プログラムを異常終了します。開いているすべての出力ファイルをファイル・ポインターの現在位置までに切り捨て、開いているすべてのファイルを閉じてから、abort() システム・ルーチンを呼び出します。この結果、SIGABRT シグナルが現行プロセスに送信されます。

ABORT 組み込みは、SIGABRT シグナルのブロッキングまたは無視をオーバーライドします。シグナルは返されません。

クラス

サブルーチン

以下に、ABORT サブルーチンを使用するステートメント例を示します。

IF (ERROR_CONDITION) CALL ABORT

ABS(A)目的

絶対値。

クラス

エレメント型関数

引数型および属性A INTENT(IN) INTEGER、REAL、または COMPLEX

結果型および属性

A が複素数の場合は結果が実数になることを除いて、A と同じです。

結果値v A の型が整数または実数の場合、結果は |A| です。

v A の型が複素数で値が (x,y) の場合、結果は以下の近似値です。

ABS ((3.0, 4.0)) の値は 5.0 です。

特定名 引数の型 結果の型 引数渡し

IABS 任意の整数 �1� �2� 引数と同じ はい

x y+2 2√

第 14 章 組み込みプロシージャー 629

Page 656: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

ABS デフォルト実数 デフォルト実数 はい

DABS 倍精度実数 倍精度実数 はい

QABS �1� REAL(16) REAL(16) はい

CABS デフォルト複素数 デフォルト実数 はい

CDABS �1� 倍精度複素数 倍精度実数 はい

ZABS �1� 倍精度複素数 倍精度実数 はい

CQABS �1� COMPLEX(16) REAL(16) はい

注:�1� IBM 拡張�2� デフォルト以外の整数の引数を指定できます。

ACHAR(I, KIND)目的

ASCII 照合シーケンスで指定位置にある文字を戻します。これは、IACHAR 関数の逆です。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

KIND (オプション)INTENT(IN) スカラー INTEGER。 KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 長さ 1 の文字。

v KIND が指定されている場合、kind 型パラメーターは、KIND の値で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト文字型のものです。

結果値v I の値が 0 ≤ I ≤ 127 の範囲内にある場合、 ASCII 照合シーケンス内で I に対応する文字が表現可能であれば、I の位置にあるその文字が結果になります。

v I が許容範囲外の場合の結果は未定義です。

ACHAR (88) の値は 'X' です。

630 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 657: IBM XL Fortran for Linux, V15.1

ACOS(X)目的

アークコサイン (逆余弦) 関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL F2008 または COMPLEX。 F2008 REAL である場合、値

は、不等式 |X| ≤ 1 を満たしていなければなりません。

結果型および属性

X と同じです。

結果値

X がいずれかの実数型である場合、結果値は次のようになります。

v ラジアンで表され、arccos(X) の近似値になります。

v 0 ≤ ACOS(X) ≤ π の範囲内にあります。

F2008

X が複素数型の場合、結果値の実数部は次のようになります。

v ラジアンで表されます。

v range 0 ≤ REAL(ACOS(X)) ≤ π の範囲内にあります。

F2008

ACOS (1.0) の値は 0.0 です。

F2008 ACOS((0.540302, 0.000000)) の値は (1.000000, 0.000000) (近似値) です。F2008

特定名 引数の型 結果の型 引数渡し

ACOS デフォルト実数 デフォルト実数 はい

DACOS 倍精度実数 倍精度実数 はい

QACOS �1� REAL(16) REAL(16) はい

QARCOS �1� REAL(16) REAL(16) はい

注:

1. IBM 拡張。

第 14 章 組み込みプロシージャー 631

Page 658: IBM XL Fortran for Linux, V15.1

ACOSD(X) (IBM 拡張)目的

アークコサイン (逆余弦) 関数です。結果は角度で表されます。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL。値は、不等式 |X| ≤ 1 を満たしていなければなりませ

ん。

結果型および属性

X と同じです。

結果値v 角度で表され、arccos(X) の近似値になります。

v 0° ≤ ACOSD(X) ≤ 180° の範囲内にあります。

ACOSD (0.5) の値は 60.0° です。

特定名 引数の型 結果の型 引数渡し

ACOSD デフォルト実数 デフォルト実数 はい

DACOSD 倍精度実数 倍精度実数 はい

QACOSD REAL(16) REAL(16) はい

ACOSH(X) (Fortran 2008)目的

逆双曲線コサイン関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL または COMPLEX

結果型および属性

X と同じです。

632 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 659: IBM XL Fortran for Linux, V15.1

結果値

結果値は、X の逆双曲線コサインの近似値です。

X が複素数型の場合、結果値の虚数部は次のようになります。

v ラジアンで表されます。

v 0 ≤ AIMAG(ACOSH(X)) ≤ π の範囲内にあります。

ACOSH(1.5430806) の値は 1.0 (近似値) です。

ACOSH((1.5430806, 0.000000)) の値は (1.000000, 0.000000) (近似値) です。

ADJUSTL(STRING)目的

先行ブランクを除去し、末尾ブランクを挿入して、左寄せにします。

クラス

エレメント型関数

引数型および属性STRING

INTENT(IN) CHARACTER

結果型および属性

STRING と同じ長さおよび kind 型パラメーターの文字。

結果値

結果の値は、先行ブランクが削除され、それと同じ数の末尾ブランクが挿入されることを除いて、STRING と同じです。

ADJUSTL ('�WORD') の値は 'WORD�' です。

ADJUSTR(STRING)目的

末尾ブランクを除去し、先行ブランクを挿入して、右寄せにします。

クラス

エレメント型関数

引数型および属性STRING

INTENT(IN) CHARACTER

第 14 章 組み込みプロシージャー 633

Page 660: IBM XL Fortran for Linux, V15.1

結果型および属性

STRING と同じ長さおよび kind 型パラメーターの文字。

結果値

結果の値は、末尾ブランクが削除され、それと同じ数の先行ブランクが挿入されることを除いて、STRING と同じです。

ADJUSTR ('WORD�') の値は '�WORD' です。

AIMAG(Z)、IMAG(Z)目的

複素数値の虚数部。

クラス

エレメント型関数

引数型および属性Z INTENT(IN) COMPLEX

結果型および属性

Z と同じ kind 型パラメーターの実数。

結果値

Z の値が (x,y) の場合、結果の値は y です。

AIMAG ((2.0, 3.0)) の値は 3.0 です。

特定名 引数の型 結果の型 引数渡し

AIMAG デフォルト複素数 デフォルト実数 はい

DIMAG �1� 倍精度複素数 倍精度実数 はい

QIMAG �1� COMPLEX(16) REAL(16) はい

注:

1. IBM 拡張。

F2008 Fortran 2008 では、designator%IM を使用して、複素数の虚数部に直接アクセスできます。例えば、Z%IM の値は AIMAG(Z) と同じです。複素数部指定子について詳しくは、『複素数』を参照してください。 F2008

634 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 661: IBM XL Fortran for Linux, V15.1

AINT(A, KIND)目的

整数に切り捨てます。

クラス

エレメント型関数

引数型および属性A INTENT(IN) REAL

KIND (オプション)INTENT(IN) スカラー INTEGER。 KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 結果は実数型です。

v KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。それ以外の場合、kind 型パラメーターは A と同じです。

結果値v |A| < 1 の場合、結果はゼロです。

v |A| ≥ 1 の場合、結果は、A の絶対値を超えない範囲で絶対値が最も大きい、A

と同じ符号の整数に等しい値です。

例AINT(3.555) = 3.0AINT(-3.555) = -3.0

特定名 引数の型 結果の型 引数渡し

AINT デフォルト実数 デフォルト実数 はい

DINT 倍精度実数 倍精度実数 はい

QINT �1� REAL(16) REAL(16) はい

注:

1. IBM 拡張。

ALIGNX(K,M) (IBM 拡張)目的

ALIGNX 組み込みサブルーチンを使用して、プログラムのフロー中の特定のポイントでの変数の位置合わせを表明できます。具体的には、 ALIGNX を呼び出した時点で、第 2 引数のアドレスを第 1 引数の値で割った余りがゼロであることを表明できます。第 2 引数が Fortran 90 ポインターである場合、表明は、ターゲットのアドレスを指します。第 2 引数が整数ポインターである場合、表明は、ポインティング先のアドレスを指します。コンパイラーに誤った位置合わせを付与すると、結果のプログラムは、位置合わせに依存する命令 (VMX 操作など) が実行される場合

第 14 章 組み込みプロシージャー 635

Page 662: IBM XL Fortran for Linux, V15.1

や、あるいは、そのような命令が最適化プログラムによって挿入される場合、正しく実行されない可能性があります。

クラス

サブルーチン

引数型および属性K INTENT(IN) INTEGER(4)。K に対応する実引数は、2 の累乗の値を持つ正の

定数式である必要があります。

M 任意の型の変数。M に対応する実引数が Fortran 90 ポインターの場合は、そのポインターは関連付けられている必要があります。

例INTEGER*4 B(200)

DO N=1, 200CALL ALIGNX(4, B(N)) !ASSERTS THAT AT THIS POINT,B(N) = N !B(N) IS 4-BYTE ALIGNED

END DOEND

SUBROUTINE VEC(A, B, C)INTEGER A(200), B(200), C(200)CALL ALIGNX(16, A(1))CALL ALIGNX(16, B(1))CALL ALIGNX(16, C(1))DO N = 1, 200

C(N) = A(N) + B(N)END DO

END SUBROUTINE

ALL(MASK, DIM)目的

配列全体のすべての値、または、1 つの次元の各ベクトルのすべての値が真であるかどうかを判別します。

クラス

変換関数

引数型および属性MASK INTENT(IN) LOGICAL 配列

DIM (オプション)INTENT(IN) スカラー INTEGER。その値は、1 ≤ DIM ≤ rank(MASK) の範囲内でなければなりません。対応する実引数は、オプションの仮引数であってはなりません。

結果値

結果は、型パラメーターが MASK と同じ論理配列です。結果の階数は、DIM が指定されている場合は rank(MASK)-1 です。それ以外の場合、結果は論理型のスカラーです。

636 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 663: IBM XL Fortran for Linux, V15.1

結果の形状は、MASK の階数を n とすると、(s1, s2, ..., s(DIM-1), s(DIM+1), ..., sn) です。

結果配列の中の個々のエレメントが .TRUE. になるのは、 MASK(m1, m2, ...,

m(DIM-1), :, m(DIM+1), ..., mn) で指定されたすべてのエレメントが真である場合だけです。結果がスカラーである場合は、DIM が指定されていないか、または MASK のランクが 1 であるという理由で、.TRUE. になります。しかし、これは MASK のすべてのエレメントが真であるか、または MASK のサイズがゼロの場合に限ります。

例! A is the array | 4 3 6 |, and B is the array | 3 5 2 |! | 2 4 1 | | 7 8 4 |

! Is every element in A less than the! corresponding one in B?

RES = ALL(A .LT. B) ! result RES is false

! Are all elements in each column of A less than the! corresponding column of B?

RES = ALL(A .LT. B, DIM = 1) ! result RES is (f,t,f)

! Same question, but for each row of A and B.RES = ALL(A .LT. B, DIM = 2) ! result RES is (f,t)

ALLOCATED(X)目的

割り振り可能オブジェクトが割り振られているかどうかを示します。

クラス

照会関数

引数型および属性

X は、次のいずれかです。

ARRAY割り振り状況を判別したい割り振り可能配列。

SCALAR割り振り状況を判別したい割り振り可能スカラー。

結果型および属性

デフォルト論理スカラー。

結果値

結果は、ARRAY または SCALAR の割り振り状況に対応します。つまり、割り振られていれば .TRUE. に、割り振られていなければ .FALSE. に、割り振り状況が未定義であれば未定義になります。-qxlf90=autodealloc コンパイラー・オプションを指定してコンパイルする場合、未定義の割り振り状況にはなりません。

第 14 章 組み込みプロシージャー 637

Page 664: IBM XL Fortran for Linux, V15.1

例INTEGER, ALLOCATABLE, DIMENSION(:) :: APRINT *, ALLOCATED(A) ! A is not allocated yet.ALLOCATE (A(1000))PRINT *, ALLOCATED(A) ! A is now allocated.END

関連情報

92ページの『割り振り可能配列』, 319ページの『ALLOCATE』, 30ページの『割り振り状況』.

ANINT(A, KIND)目的

最も近い整数。

クラス

エレメント型関数

引数型および属性A INTENT(IN) REAL

KIND (オプション)INTENT(IN) スカラー INTEGER。 KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 結果は実数型です。

v KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。それ以外の場合、kind 型パラメーターは A と同じです。

結果値v A > 0 の場合、ANINT(A) = AINT(A + 0.5) です。

v A ≤ 0 の場合、ANINT(A) = AINT(A - 0.5) です。

注: 0.5 の加算および減算は、ゼロ方向への丸めモードで実行されます。

例ANINT(3.555) = 4.0ANINT(-3.555) = -4.0

特定名 引数の型 結果の型 引数渡し

ANINT デフォルト実数 デフォルト実数 はい

DNINT 倍精度実数 倍精度実数 はい

QNINT �1� REAL(16) REAL(16) はい

注:

1. IBM 拡張。

638 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 665: IBM XL Fortran for Linux, V15.1

ANY(MASK, DIM)目的

配列全体のいずれかの値、または、1 つの次元の各ベクトルのいずれかの値が真であるかどうかを判別します。

クラス

変換関数

引数型および属性MASK INTENT(IN) LOGICAL 配列

DIM (オプション)INTENT(IN) INTEGER スカラー。その値は、1 ≤ DIM ≤ rank(MASK) の範囲内でなければなりません。対応する実引数は、オプションの仮引数であってはなりません。

結果値

結果は、型パラメーターが MASK と同じ論理配列です。結果の階数は、DIM が指定されている場合は rank(MASK)-1 です。それ以外の場合、結果は論理型のスカラーです。

結果の形状は、MASK の階数を n とすると、(s1, s2, ..., s(DIM -1), s(DIM+1), ..., sn) です。

結果配列の中の個々のエレメントが .TRUE. になるのは、 MASK(m1, m2, ...,

m(DIM-1), :, m(DIM+1), ..., mn) で指定されたどのエレメントも真である場合だけです。結果がスカラーである場合は、DIM が指定されていないか、または MASK のランクが 1 であるという理由で、.TRUE. になります。しかし、これは MASK のエレメントのいずれかが真である場合に限ります。

例! A is the array | 9 -6 7 |, and B is the array | 2 7 8 |! | 3 -1 5 | | 5 6 9 |

! Is any element in A greater than or equal to the! corresponding element in B?

RES = ANY(A .GE. B) ! result RES is true

! For each column in A, is there any element in the column! greater than or equal to the corresponding element in B?

RES = ANY(A .GE. B, DIM = 1) ! result RES is (t,f,f)

! Same question, but for each row of A and B.RES = ANY(A .GE. B, DIM = 2) ! result RES is (t,f)

ASIN(X)目的

アークサイン (逆正弦) 関数です。

第 14 章 組み込みプロシージャー 639

Page 666: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL F2008 または COMPLEX。 F2008 。値は、不等式

|X| ≤ 1 を満たしていなければなりません。

結果型および属性

X と同じです。

結果値

X がいずれかの実数型である場合、結果値は次のようになります。

v ラジアンで表され、arcsin(X) の近似値になります。

v -π/2 ≤ ASIN(X) ≤ π/2 の範囲内にあります。

F2008

X が複素数型の場合、結果値の実数部は次のようになります。

v ラジアンで表されます。

v -π/2 ≤ REAL(ASIN(X)) ≤ π/2 の範囲内にあります。

F2008

ASIN (1.0) は、π/2 の近似値になります。

F2008 ASIN((0.841471, 0.000000)) の値は (1.000000, 0.000000) (近似値) です。F2008

特定名 引数の型 結果の型 引数渡し

ASIN デフォルト実数 デフォルト実数 はい

DASIN 倍精度実数 倍精度実数 はい

QASIN �1� REAL(16) REAL(16) はい

QARSIN �1� REAL(16) REAL(16) はい

注:

1. IBM 拡張。

ASIND(X) (IBM 拡張)目的

アークサイン (逆正弦) 関数です。結果は角度で表されます。

クラス

エレメント型関数

640 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 667: IBM XL Fortran for Linux, V15.1

引数型および属性X INTENT(IN) REAL。値は、不等式 |X| ≤ 1 を満たしていなければなりませ

ん。

結果型および属性

X と同じです。

結果値v 角度で表され、arcsin(X) の近似値になります。

v -90° ≤ ASIND(X) ≤ 90° の範囲内にあります。

ASIND (0.5) の値は 30.0° です。

特定名 引数の型 結果の型 引数渡し

ASIND デフォルト実数 デフォルト実数 はい

DASIND 倍精度実数 倍精度実数 はい

QASIND REAL(16) REAL(16) はい

ASINH(X) (Fortran 2008)目的

逆双曲線サイン関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL または COMPLEX

結果型および属性

X と同じです。

結果値

結果値は、X の逆双曲線コサインの近似値です。

X が複素数型の場合、結果値の虚数部は次のようになります。

v ラジアンで表されます。

v 0 ≤ AIMAG(ASINH(X)) ≤ π の範囲内にあります。

ASINH(1.1752012) の値は 1.0 (近似値) です。

ASINH((1.175201, 0.000000)) の値は (1.000000, 0.000000) (近似値) です。

第 14 章 組み込みプロシージャー 641

Page 668: IBM XL Fortran for Linux, V15.1

ASSOCIATED(POINTER, TARGET)目的

ポインター引数の関連付け状況を戻すか、または、ポインターがターゲットと関連付けられているかどうかを示します。

クラス

照会関数

引数型および属性POINTER

関連付け状況をテストしたい不特定型のポインターです。このポインターの関連付け状況は未定義であってはなりません。

TARGET (オプション)POINTER と関連付けられているか、または関連付けられていない、不特定型のポインターまたはターゲットです。関連付け状況は未定義であってはなりません。

結果型および属性

デフォルト論理スカラー。

結果値

POINTER 引数だけが指定されているとき、その引数がいずれかのターゲットと関連する場合は .TRUE. になり、それ以外の場合は .FALSE. になります。 TARGETも指定されている場合、プロシージャーは、POINTER が TARGET と関連付けられているかどうか、あるいは、TARGET が関連付けられているのと同じオブジェクトと関連付けられているかどうか (TARGET もポインターである場合) をテストします。

異なる形状の POINTER と TARGET が関連付けられている場合、この組み込み関数は .FALSE. を戻します。

TARGET が指定されている場合、以下のいずれかであれば、結果は .FALSE. です。

v POINTER がゼロ・サイズ配列と関連付けられている。

v TARGET がゼロ・サイズ配列と関連付けられている。

v TARGET がゼロ・サイズ配列である。

異なる型または形状のオブジェクトは、互いに関連付けることができません。

型および形状は同じで境界が異なる配列は、互いに関連付けることができます。

例REAL, POINTER, DIMENSION(:,:) :: AREAL, TARGET, DIMENSION(5,10) :: B, C

NULLIFY (A)PRINT *, ASSOCIATED (A) ! False, not associated yet

642 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 669: IBM XL Fortran for Linux, V15.1

A => BPRINT *, ASSOCIATED (A) ! True, because A is

! associated with B

PRINT *, ASSOCIATED (A,C) ! False, A is not! associated with C

END

ATAN(X)目的

アークタンジェント (逆正接) 関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL F2008 または COMPLEX。 F2008

結果型および属性

X と同じです。

結果値

X がいずれかの実数型である場合、結果値は次のようになります。

v ラジアンで表され、arctan(X) の近似値になります。

v -π/2 ≤ ATAN(X) ≤ π/2 の範囲内にあります。

F2008

X が複素数型の場合、結果値の実数部は次のようになります。

v ラジアンで表されます。

v -π/2 ≤ REAL(ATAN(X)) ≤ π/2 の範囲内にあります。

F2008

ATAN (1.0) は、π/4 の近似値になります。

F2008 ATAN((1.557408, 0.000000)) の値は (1.000000, 0.000000) (近似値) です。F2008

特定名 引数の型 結果の型 引数渡し

ATAN デフォルト実数 デフォルト実数 はい

DATAN 倍精度実数 倍精度実数 はい

QATAN �1� REAL(16) REAL(16) はい

注:

第 14 章 組み込みプロシージャー 643

Page 670: IBM XL Fortran for Linux, V15.1

1. IBM 拡張。

関連関数v F2008 ATAN(Y, X) F2008

ATAN(Y, X) (Fortran 2008)目的

アークタンジェント (逆正接) 関数です。

クラス

エレメント型関数

引数型および属性Y INTENT(IN) REAL

X Y と同じ型および kind 型パラメーターの INTENT(IN) 引数。Y の値がゼロの場合は、X の値がゼロであってはなりません。

結果型および属性

X と同じです。

結果値

結果は『ATAN2(Y, X)』の結果と同じです。

関連関数v 643ページの『ATAN(X)』

ATAN2(Y, X)目的

アークタンジェント (逆正接) 関数です。結果は、実数の引数 Y および X で形成される、ゼロでない複素数 (X, Y) の主値です。

クラス

エレメント型関数

引数型および属性Y INTENT(IN) REAL

X Y と同じ型および kind 型パラメーターの INTENT(IN) 引数。Y の値がゼロの場合は、X の値がゼロであってはなりません。

結果型および属性

X と同じです。

644 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 671: IBM XL Fortran for Linux, V15.1

結果値v ラジアンで表され、複素数 (X, Y) の引数の主値に等しい値になります。v -π < ATAN2(Y, X) ≤ π の範囲内にあります。v X ≠ 0 の場合、結果は arctan(Y/X) の近似値です。v Y > 0 の場合、結果は正です。v Y < 0 の場合、結果は負です。v X = 0 の場合、結果の絶対値は π/2 です。

-qxlf2003=signdzerointr オプションは、 Fortran 2003 動作を使用するかどうかを制御します。「XL Fortran コンパイラー・リファレンス」の『qxlf2003』を参照してください。

v Y = 0 かつ X < 0 の場合、結果は π です。

v Y = 0 かつ X > 0 の場合、結果はゼロです。

v Y = 0 かつ X < 0 の場合、結果は、Y が正の実数ゼロの場合は π、Y が負の実数ゼロの場合は -π です。

v Y = 0 かつ X > 0 の場合、結果は Y です。

ATAN2 (1.5574077, 1.0) の値は 1.0 です。

以下であると想定します。

Y = | 1 1 | X = | -1 1 || -1 -1 | | -1 1 |

この場合、ATAN2(Y,X) の値は次の値に近似します。

ATAN2 (Y, X) = | 3π/4 π/4 || -3π/4 -π/4 |

特定名 引数の型 結果の型 引数渡し

ATAN2 デフォルト実数 デフォルト実数 はい

DATAN2 倍精度実数 倍精度実数 はい

QATAN2 �1� REAL(16) REAL(16) はい

ATAN2D(Y, X) (IBM 拡張)目的

アークタンジェント (逆正接) 関数です。結果は、実数の引数 Y および X で形成される、ゼロでない複素数 (X, Y) の主値です。

クラス

エレメント型関数

第 14 章 組み込みプロシージャー 645

Page 672: IBM XL Fortran for Linux, V15.1

引数型および属性Y INTENT(IN) REAL

X Y と同じ型および kind 型パラメーターの INTENT(IN) 引数。Y の値がゼロの場合は、X の値がゼロであってはなりません。

結果型および属性

X と同じです。

結果値v 角度で表され、複素数 (X, Y) の引数の主値に等しい値になります。v -180° < ATAN2D(Y,X) ≤ 180° の範囲内にあります。v X≠0 の場合、結果は arctan(Y/X) の近似値です。v Y>0 の場合、結果は正です。v Y<0 の場合、結果は負です。v Y=0 かつ X>0 の場合、結果はゼロです。v Y=0 かつ X<0 の場合、結果は 180° です。v X=0 の場合、結果の絶対値は 90° です。

ATAN2D (1.5574077, 1.0) の値は 57.295780181° (近似値) です。

以下であると想定します。

Y = | 1.0 1.0 | X = | -1.0 1.0 || -1.0 -1.0 | | -1.0 1.0 |

この場合、ATAN2D(Y,X) の値は次のようになります。

ATAN2D(Y,X) = | 135.0000000° 45.00000000° || -135.0000000° -45.00000000° |

特定名 引数の型 結果の型 引数渡し

ATAN2D デフォルト実数 デフォルト実数 はい

DATAN2D 倍精度実数 倍精度実数 はい

QATAN2D REAL(16) REAL(16) はい

ATAND(X) (IBM 拡張)目的

アークタンジェント (逆正接) 関数です。結果は角度で表されます。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

646 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 673: IBM XL Fortran for Linux, V15.1

結果型および属性

X と同じです。

結果値v 角度で表され、arctan(X) の近似値になります。

v -90° ≤ ATAND(X) ≤ 90° の範囲内にあります。

ATAND (1.0) の値は 45.0° です。

特定名 引数の型 結果の型 引数渡し

ATAND デフォルト実数 デフォルト実数 はい

DATAND 倍精度実数 倍精度実数 はい

QATAND REAL(16) REAL(16) はい

ATANH(X) (Fortran 2008)目的

逆双曲線タンジェント関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL または COMPLEX

結果型および属性

X と同じです。

結果値

結果値は、X の逆双曲線タンジェントの近似値です。

X が複素数型の場合、結果値の虚数部は次のようになります。

v ラジアンで表されます。

v -π/2 ≤ AIMAG(ATANH(X)) ≤ π/2 の範囲内にあります。

ATANH(0.76159416) の値は 1.0 (近似値) です。

ATANH((0.761594, 0.000000)) の値は (1.000000, 0.000000) (近似値) です。

第 14 章 組み込みプロシージャー 647

Page 674: IBM XL Fortran for Linux, V15.1

BTEST(I, POS)目的

整数値の 1 つのビットをテストします。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

POS INTENT(IN) INTEGER。その値は負でなく、BIT_SIZE (I) より小さくなければなりません。

結果型および属性

結果はデフォルト論理型です。

結果値

結果値は、I の第 POS ビットの値が 1 であれば .TRUE. に、I の第 POS ビットの値が 0 であれば .FALSE. になります。

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

BTEST (8, 3) の値は .TRUE. です。

A の値が以下であるとします。| 1 2 || 3 4 |

BTEST (A, 2) の値は、次のようになります。| false false || false true |

BTEST (2, A) の値は、次のようになります。| true false || false false |

626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

BTEST �1� 任意の整数 デフォルト論理 はい

注:

1. IBM 拡張。

648 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 675: IBM XL Fortran for Linux, V15.1

BIT_SIZE(I)目的

整数型のビット数を戻します。引数の型のみが検査されるので、引数を定義する必要はありません。

クラス

照会関数

引数型および属性I INTENT(IN) INTEGER

結果型および属性

I と同じ kind 型パラメーターのスカラー整数。

結果値

結果は、整数データ型の引数内のビットの数です。

型 ビット数----------- ------integer(1) 8integer(2) 16integer(4) 32integer(8) 64

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

kind 4 (つまり、4 バイト整数) の整数型に含まれるのは 32 ビットなので、BIT_SIZE (1_4) の値は 32 です。

CEILING(A, KIND)目的

引数以上で最も小さい整数を戻します。

クラス

エレメント型関数

引数型および属性A INTENT(IN) REAL

KIND (オプション)INTENT(IN) スカラー INTEGER。 KIND に対応する実引数は、定数式である必要があります。

第 14 章 組み込みプロシージャー 649

Page 676: IBM XL Fortran for Linux, V15.1

結果型および属性v 整数型です。

v KIND が指定されている場合、kind 型パラメーターは、 KIND で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト整数型のものです。

結果値

結果は、A 以上で最も小さい整数に等しい値です。

指定された KIND の整数として表現できない場合の結果は未定義です。

例CEILING(-3.7) の値は -3 です。CEILING(3.7) の値は 4 です。

CEILING(1000.1, KIND=2) の値は 1001 で、kind型パラメーターは 2 です。

CHAR(I, KIND)目的

指定された kind 型パラメーターと関連付けられた照合シーケンスの、指定された位置にある文字を戻します。これは、ICHAR 関数の逆です。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER。その値は、 0 ≤ I ≤ 127 の範囲内でなければ

なりません。

KIND (オプション)INTENT(IN) スカラー INTEGER。 KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 長さ 1 の文字。

v KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト文字型のものです。

結果値v 結果は、指定された kind 型パラメーターと関連付けられた照合シーケンスの位置 I にある文字です。

v ICHAR (CHAR (I, KIND (C))) の値は、0 ≤ I ≤ 127 に対して I でなければならず、CHAR (ICHAR (C), KIND (C)) の値は、任意の表示可能文字に対して C

でなければなりません。

650 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 677: IBM XL Fortran for Linux, V15.1

CHAR (88) の値は 'X' です。

特定名 引数の型 結果の型 引数渡し

CHAR 任意の整数 デフォルト文字 はい �1�

注:

1. IBM 拡張: デフォルト以外の整数の引数を指定できます。

XL Fortran は、ASCII 照合シーケンスのみをサポートします。

CMPLX(X, Y, KIND)目的

複素数型に変換します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER、REAL、COMPLEX、BINARY、OCTAL、または 16 進定数

CONSTANT。

Y (オプション)INTENT(IN) INTEGER、REAL、COMPLEX、BINARY、OCTAL、または 16 進定数CONSTANT。 X が COMPLEX である場合は、指定できません。

KIND (オプション)INTENT(IN) スカラー INTEGER。 KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 複素数型です。

v KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト実数型のものです。

結果値v Y が指定されていなくて、X が複素数でない場合、ゼロ値の Y が指定されているかのように処理されます。

v Y が指定されていなくて、X が複素数の場合、AIMAG(X) 値の Y が指定されているかのように処理されます。

v CMPLX(X, Y, KIND) は、実数部が REAL(X, KIND)、虚数部が REAL(Y, KIND)

の複素数値になります。

CMPLX (-3) の値は (-3.0, 0.0) です。

第 14 章 組み込みプロシージャー 651

Page 678: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

CMPLX �1� デフォルト実数 デフォルト複素数 いいえ

注:

1. IBM 拡張。

関連情報

663ページの『DCMPLX(X, Y) (IBM 拡張)』, 745ページの『QCMPLX(X, Y)

(IBM 拡張)』.

COMMAND_ARGUMENT_COUNT() (Fortran 2003)目的

プログラムを呼び出したコマンドのコマンド行引数の数を戻します。

クラス

照会関数

結果型および属性

デフォルト整数スカラー

結果値

結果の値は、コマンド引数の数です (コマンド名はカウントされません)。コマンド引数がない場合、結果の値は 0 です。

例integer cmd_countcmd_count = COMMAND_ARGUMENT_COUNT()print*, cmd_countend

上記のプログラムで生成される出力例は次のとおりです。

$ a.out0$ a.out aa1$ a.out aa bb2

CONJG(Z)目的

複素数の共役。

クラス

エレメント型関数

652 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 679: IBM XL Fortran for Linux, V15.1

引数型および属性Z INTENT(IN) COMPLEX

結果型および属性

Z と同じです。

結果値

Z の値を (x, y) とすると、結果の値は (x, -y) です。

CONJG ((2.0, 3.0)) の値は (2.0, -3.0) です。

特定名 引数の型 結果の型 引数渡し

CONJG デフォルト複素数 デフォルト複素数 はい

DCONJG �1� 倍精度複素数 倍精度複素数 はい

QCONJG �1� COMPLEX(16) COMPLEX(16) はい

注:

1. IBM 拡張。

COS(X)目的

コサイン関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL または COMPLEX

結果型および属性

X と同じです。

結果値v cos(X) の近似値です。

v X が実数型の場合、X はラジアンの値であると見なされます。

v X が複素数型の場合、X の実数部と虚数部はラジアンの値であると見なされます。

COS (1.0) の値は 0.54030231 (近似値) です。

第 14 章 組み込みプロシージャー 653

Page 680: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

COS デフォルト実数 デフォルト実数 はい

DCOS 倍精度実数 倍精度実数 はい

QCOS �1� REAL(16) REAL(16) はい

CCOS �2a� デフォルト複素数 デフォルト複素数 はい

CDCOS �1� �2b� 倍精度複素数 倍精度複素数 はい

ZCOS �1� �2b� 倍精度複素数 倍精度複素数 はい

CQCOS �1� �2b� COMPLEX(16) COMPLEX(16) はい

注:

1. IBM 拡張。

2. X が a + bi という形式 (ここで、i = (-1)½) の複素数であるとすると、次のようになります。

a. abs(b) は 88.7228 以下でなければなりません。a は任意の実数値です。

b. abs(b) は 709.7827 以下でなければなりません。a は任意の実数値です。

COSD(X) (IBM 拡張)目的

コサイン関数です。引数は角度です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値

cos(X) の近似値です。ここで、X は角度の値です。

COSD (45.0°) の値は 0.7071067691 です。

特定名 引数の型 結果の型 引数渡し

COSD デフォルト実数 デフォルト実数 はい

DCOSD 倍精度実数 倍精度実数 はい

QCOSD REAL(16) REAL(16) はい

654 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 681: IBM XL Fortran for Linux, V15.1

COSH(X)目的

双曲線コサイン関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL F2008 または COMPLEX。 F2008

結果型および属性

X と同じです。

結果値

結果は、cosh(X) の近似値です。

F2008 X が複素数型の場合、虚数部はラジアンの値であると見なされます。F2008

COSH (1.0) の値は 1.5430806 (近似値) です。

F2008 COSH((1.000000, 0.000000)) の値は (1.543081, 0.000000) (近似値) です。F2008

特定名 引数の型 結果の型 引数渡し

COSH デフォルト実数 デフォルト実数 はい

DCOSH 倍精度実数 倍精度実数 はい

QCOSH �1� REAL(16) REAL(16) はい

注:

1. IBM 拡張。

COUNT(MASK, DIM, KIND)目的

論理配列全体の真の配列エレメントの数、または、1 つの次元の各ベクトル内で真の配列エレメントの数をカウントします。通常、この論理配列は、別の組み込み関数でマスクとして使用される配列です。

クラス

変換関数

第 14 章 組み込みプロシージャー 655

Page 682: IBM XL Fortran for Linux, V15.1

引数型および属性MASK INTENT(IN) LOGICAL 配列

DIM (オプション)INTENT(IN) INTEGER スカラー。その値は、1 ≤ DIM ≤ rank(MASK) の範囲内でなければなりません。対応する実引数は、オプションの仮引数であってはなりません。

KIND (オプション)INTENT(IN) スカラー INTEGER。 KIND に対応する実引数は、定数式である必要があります。

結果値

DIM が指定されている場合、結果は、階数が rank(MASK)-1 の整数配列です。DIM が指定されていない場合、または、MASK の階数が 1 の場合、結果は整数型のスカラーです。

KIND が指定されている場合、結果の kind は、KIND の値で指定されたものです。それ以外の場合、kind 型パラメーターはデフォルト整数型のものです。

結果の配列の各エレメント (R(s1, s2, ..., s(DIM-1), s(DIM+1), ..., sn)) は、対応する次元(s1, s2, ..., s(DIM-1), :, s(DIM+1), ..., sn) のエレメントのうち MASK 内で真になっているエレメントの数です。

MASK がゼロ・サイズ配列である場合、結果はゼロになります。

例! A is the array | T F F |, and B is the array | F F T |! | F T T | | T T T |

! How many corresponding elements in A and B! are equivalent?

RES = COUNT(A .EQV. B) ! result RES is 3

! How many corresponding elements are equivalent! in each column?

RES = COUNT(A .EQV. B, DIM=1) ! result RES is (0,2,1)

! Same question, but for each row.RES = COUNT(A .EQV. B, DIM=2) ! result RES is (1,2)

CPU_TIME(TIME) (Fortran 95)目的

現行プロセス (および、場合によっては、すべてのスレッド内のすべての子プロセス) によって消費された CPU 時間を秒単位で戻します。CPU_TIME の呼び出しで戻されるのは、プログラムの開始時からプロセスが使用したプロセッサー時間です。測定される時間は、プログラムが実際に実行している時間のみであり、プログラムが中断状態または待機状態である時間は含まれません。

656 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 683: IBM XL Fortran for Linux, V15.1

クラス

サブルーチン

引数型および属性TIME INTENT(OUT) REAL スカラー。これにはプロセッサー時間の近似値が代入さ

れます。時間は秒単位で測定されます。CPU_TIME で戻される時間は、XLFRTEOPTS 環境変数または実行時オプション cpu_time_type の設定に依存します。cpu_time_type の有効な設定値は次のとおりです。

usertime現行プロセスのユーザー時間。

systime現行プロセスのシステム時間。

alltime 現行プロセスのユーザー時間とシステム時間の合計。

total_usertime現行プロセスの総ユーザー時間。総ユーザー時間は、現行プロセスのユーザー時間と、子プロセス (ある場合) の合計ユーザー時間の総計です。

total_systime現行プロセスの総システム時間。総システム時間は、現行プロセスのシステム時間と、子プロセス (ある場合) の合計システム時間の総計です。

total_alltime現行プロセスのユーザー時間およびシステム時間の合計。ユーザー時間およびシステム時間の合計は、現行システムのユーザー時間およびシステム時間の合計と、子プロセス (ある場合) のユーザー時間およびシステム時間の合計を合わせたものです。

これは、cpu_time_type 実行時オプションが設定されていない場合の CPU_TIME のデフォルトの時間測定です。

cpu_time_type 実行時オプションは、setrteopts プロシージャーを使用して設定できます。cpu_time_type の設定値の変更は、それ以降のすべての CPU_TIME 呼び出しに影響します。

例 1:

! The default value for cpu_time_type is usedREAL T1, T2... ! First chunk of code to be timedCALL CPU_TIME(T1)... ! Second chunk of code to be timedCALL CPU_TIME(T2)print *, 'Time taken for first chunk of code: ', T1, 'seconds.'print *, 'Time taken for both chunks of code: ', T2, 'seconds.'print *, 'Time for second chunk of code was ', T2-T1, 'seconds.'

cpu_time_type 実行時オプションを usertime に設定するには、以下のコマンドをksh または bsh コマンド行から入力します。

第 14 章 組み込みプロシージャー 657

Page 684: IBM XL Fortran for Linux, V15.1

export XLFRTEOPTS=cpu_time_type=usertime

例 2:

! Use setrteopts to set the cpu_time_type run-time option as many times! as you need toCALL setrteopts ('cpu_time_type=alltime')CALL stallingloopCALL CPU_TIME(T1)print *, 'The sum of the user and system time is', T1, 'seconds'.CALL setrteopts ('cpu_time_type=usertime')CALL stallingloopCALL CPU_TIME(T2)print *, 'The total user time from the start of the program is', T2, 'seconds'.

関連情報v 詳しくは、「XL Fortran コンパイラー・リファレンス」の XLFRTEOPTS 環境変数の説明を参照してください。

CSHIFT(ARRAY, SHIFT, DIM)目的

配列の指定された次元のすべてのベクトルのエレメントをシフトします。循環シフトが行われます。つまり、シフトによって一方の端から押し出されるエレメントは、他方の端に挿入されます。

クラス

変換関数

引数型および属性ARRAY

任意の型の配列。

SHIFT

v ARRAY がランク 1 の場合、INTENT(IN) INTEGER スカラー。

v ARRAY がランク 1 でない場合、INTENT(IN) INTEGER スカラー、またはランク rank(ARRAY)-1 の INTEGER 式。

DIM (オプション)INTENT(IN) INTEGER スカラー。その値は、1 ≤ DIM ≤ rank(ARRAY) の範囲内でなければなりません。指定されていない場合、デフォルトで 1 になります。

結果値

結果は、ARRAY と同じ形状、データ型、および型パラメーターの配列です。

SHIFT がスカラーの場合、各ベクトルに同じシフトが適用されます。それ以外の場合、各ベクトル ARRAY (s1, s2, ..., s(DIM-1), :, s(DIM+1), ..., sn) は、 SHIFT (s1, s2, ...,

s(DIM-1), s(DIM+1), ..., sn) 内の対応する値に従ってシフトされます。

シフトの量は、SHIFT の絶対値によって決まります。シフトの方向は、SHIFT の符号によって決まります。

658 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 685: IBM XL Fortran for Linux, V15.1

正の SHIFTベクトルの各エレメントは、ベクトルの先頭に向かって移動されます。

負の SHIFTベクトルの各エレメントは、ベクトルの終わりに向かって移動されます。

ゼロの SHIFTシフトは行われません。ベクトルの値は変更されません。

例! A is the array | A D G |! | B E H |! | C F I |

! Shift the first column down one, the second column! up one, and leave the third column unchanged.

RES = CSHIFT (A, SHIFT = (/-1,1,0/), DIM = 1)! The result is | C E G |! | A F H |! | B D I |

! Do the same shifts as before, but on the rows! instead of the columns.

RES = CSHIFT (A, SHIFT = (/-1,1,0/), DIM = 2)! The result is | G A D |! | E H B |! | C F I |

CVMGx(TSOURCE, FSOURCE, MASK) (IBM 拡張)目的

条件付きベクトル・マージ関数 (CVMGM、CVMGN、CVMGP、CVMGT、およびCVMGZ) によって、これらの関数が含まれている既存のコードを移植できます。

これらの呼び出しは、以下の関数の呼び出しによく似ています。

MERGE ( TSOURCE, FSOURCE, arith_expr .op. 0 )またはMERGE ( TSOURCE, FSOURCE, logical_expr .op. .TRUE. )

MERGE 組み込み関数は Fortran 90 言語の一部なので、新しいプログラムでは、これらの関数の代わりに、この関数を使用することをお勧めします。

クラス

エレメント型関数

引数型および属性TSOURCE

LOGICAL、INTEGER、または REAL 型で、kind が 1 以外のスカラーまたは配列式。

FSOURCETSOURCE と同じ型および kind 型パラメーターを持つスカラー式または配列式です。

MASK INTEGER または REAL 型 (CVMGM、CVMGN、CVMGP、およびCVMGZ の場合)、または LOGICAL 型 (CVMGT の場合) で、kind が 1

第 14 章 組み込みプロシージャー 659

Page 686: IBM XL Fortran for Linux, V15.1

以外のスカラーまたは配列式。配列である場合は、形状が TSOURCE および FSOURCE に合致していなければなりません。

TSOURCE と FSOURCE のいずれか一方のみが型なしの場合、型なしの引数は、他方の引数の型を獲得します。TSOURCE と FSOURCE の両方が型なしの場合、両引数とも MASK の型を獲得します。 MASK も型なしの場合、TSOURCE とFSOURCE は、両方ともデフォルト整数として扱われます。MASK は、型なしの場合、 CVMGT 関数の場合はデフォルト論理型として、他の CVMGx 関数の場合はデフォルト整数として扱われます。

結果型および属性

TSOURCE および FSOURCE と同じです。

結果値

この関数の結果は、3 番目の引数に対して実行されたテスト結果によって、1 番目または 2 番目のいずれかの引数の値になります。引数がすべて配列の場合、MASK配列の各エレメントに対してテストが実行され、結果には、TSOURCE の一部のエレメントおよび FSOURCE の一部のエレメントが含まれる可能性があります。

表 59. CVMGx 組み込みプロシージャーの結果の値

説明 関数からの戻り値 総称名

正またはゼロのテスト

MASK≥0 の場合はTSOURCE、MASK<0 の場合は FSOURCE

CVMGP

負のテスト MASK<0 の場合はTSOURCE、MASK≥0 の場合は FSOURCE

CVMGM

ゼロのテスト MASK=0 の場合はTSOURCE、MASK≠0 の場合は FSOURCE

CVMGZ

非ゼロのテスト MASK≠0 の場合はTSOURCE、MASK=0 の場合は FSOURCE

CVMGN

真のテスト MASK= .TRUE. の場合にはTSOURCE、MASK=.FALSE. の場合にはFSOURCE

CVMGT

DATE_AND_TIME(DATE, TIME, ZONE, VALUES)目的

リアルタイム・クロックからのデータおよび日付を、ISO 8601:1988 に定義されている表記法と互換の形式で戻します。

クラス

サブルーチン

660 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 687: IBM XL Fortran for Linux, V15.1

引数型および属性DATE (オプション)

少なくとも 8 の長さを持つ INTENT(OUT) CHARACTER スカラー。左端の 8

文字が、形式 CCYYMMDD の値に設定されます。ここで、CC は世紀、YY はその世紀の年、 MM はその年の月、DD はその月の日です。使用可能な日付がない場合、これらの文字はブランクに設定されます。

TIME (オプション)少なくとも 10 の長さを持つ INTENT(OUT) CHARACTER スカラー。左端の 10

文字が、形式 hhmmss.sss の値に設定されます。ここで、hh は時、mm は分、 ss.sss は秒とミリ秒です。使用可能なクロックがない場合、これらの文字はブランクに設定されます。

ZONE (オプション)

少なくとも 5 の長さを持つ INTENT(OUT) CHARACTER スカラー。左端の 5

文字が、形式 ±hhmm の値に設定されます。ここで、hh と mm は、協定世界時 (UTC) に対する時差の時間と分です。使用可能なクロックがない場合、これらの文字はブランクに設定されます。

時間帯がハードウェアで設定されていない場合、ZONE の値が正しくないことがあります。時間帯が確実に正しく設定されるように、手動でTZ 環境変数を設定することができます。

VALUES (オプション)ランク 1 の INTENT(OUT) INTEGER。サイズは少なくとも 8 でなければなりません。VALUES に戻される値は、次のとおりです。

VALUES(1)年 (例: 1998) または -HUGE (0) (日付が使用可能でない場合) です。

VALUES(2)月または -HUGE (0) (日付が使用可能でない場合) です。

VALUES(3)日または -HUGE (0) (日付が使用可能でない場合) です。

VALUES(4)協定世界時 (UTC) に対する時差 (分) または -HUGE (0) (時差の情報が使用可能でない場合) です。

VALUES(5)時刻 (0 から 23 の範囲) または -HUGE (0) (クロックがない場合)

です。

VALUES(6)分 (0 から 59 の範囲) または -HUGE (0) (クロックがない場合)

です。

VALUES(7)秒 (0 から 60 の範囲) または -HUGE (0) (クロックがない場合)

です。

第 14 章 組み込みプロシージャー 661

Page 688: IBM XL Fortran for Linux, V15.1

VALUES (8)ミリ秒 (0 から 999 の範囲) または -HUGE (0) (クロックがない場合) です。

以下にプログラム例を示します。

INTEGER DATE_TIME (8)CHARACTER (LEN = 10) BIG_BEN (3)CALL DATE_AND_TIME (BIG_BEN (1), BIG_BEN (2), &

BIG_BEN (3), DATE_TIME)

このプログラムは、スイスのジュネーブで 1985 年 4 月 12 日 15:27:35.5 に実行されるとすると、 BIG_BEN(1) に値 19850412 を、BIG_BEN(2) に値 152735.500

を、BIG_BEN(3) に値 +0100 を、DATE_TIME に値 1985、4、12、60、15、27、35、500 を入れます。

UTC は CCIR 勧告 460-2 (グリニッジ標準時とも呼ばれる) で規定されていることに注意してください。

DBLE(A)目的

倍精度実数型に変換します。

クラス

エレメント型関数

引数型および属性A INTENT(IN) INTEGER、REAL、COMPLEX、または BOZ リテラル CONSTANT

結果型および属性

倍精度実数。

結果値v A の型が倍精度実数の場合、DBLE(A) = A です。

v A の型が整数または実数の場合、結果は、倍精度実数データが含むことのできる精度で A の有効部分が表されたものです。

v A の型が複素数の場合、結果は、倍精度実数データが含むことのできる精度で A

の実数部の有効部分が表されたものです。

DBLE (-3) の値は -3.0D0 です。

特定名 引数の型 結果の型 引数渡し

DFLOAT 任意の整数 倍精度実数 いいえ

662 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 689: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

DBLE デフォルト実数 倍精度実数 いいえ

DBLEQ REAL(16) REAL(8) いいえ

DCMPLX(X, Y) (IBM 拡張)目的

倍精度複素数型に変換します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER、REAL、または COMPLEX

Y (オプション)INTENT(IN) INTEGER または REAL。X が複素数型である場合は、指定できません。

結果型および属性

倍精度複素数型です。

結果値v Y が指定されていなくて、X が複素数でない場合、ゼロ値の Y が指定されているかのように処理されます。

v Y が指定されていなくて、X が複素数の場合、AIMAG(X) 値の Y が指定されているかのように処理されます。

v DCMPLX(X, Y) は、実数部が REAL(X, KIND=8)、虚数部が REAL(Y, KIND=8)

の複素数値になります。

DCMPLX (-3) の値は (-3.0D0, 0.0D0) です。

特定名 引数の型 結果の型 引数渡し

DCMPLX 倍精度実数 倍精度複素数 いいえ

関連情報

651ページの『CMPLX(X, Y, KIND)』、 745ページの『QCMPLX(X, Y) (IBM 拡張)』

第 14 章 組み込みプロシージャー 663

Page 690: IBM XL Fortran for Linux, V15.1

DIGITS(X)目的

型および kind 型パラメーターが引数と同じ数値の有効桁数を戻します。

クラス

照会関数

引数型および属性X INTENT(IN) INTEGER または REAL。X に対応する実引数は、スカラー値で

あっても配列値であってもかまいません。

結果型および属性

デフォルト整数スカラー。

結果値v X が整数型の場合、X の有効桁数は次のとおりです。

型 ビット数----------- ------integer(1) 7integer(2) 15integer(4) 31integer(8) 63

v X が実数型の場合、X の有効ビット数は次のとおりです。

型 ビット数---------- ------real(4) 24real(8) 53real(16) 106

X の型が integer(8) の場合、DIGITS (X) = 63 です ( 626ページの『データ表記モデル』を参照してください)。

DIM(X, Y)目的

X-Y の差が正の場合は、差です。それ以外の場合はゼロです。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER または REAL

Y X と同じ型および kind 型パラメーターの INTENT(IN) 引数。

664 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 691: IBM XL Fortran for Linux, V15.1

結果型および属性

X と同じです。

結果値v X > Y の場合、結果の値は X - Y です。

v X ≤ Y の場合、結果の値はゼロです。

DIM (-3.0, 2.0) の値は 0.0 です。DIM (-3.0, -4.0) の値は 1.0 です。

特定名 引数の型 結果の型 引数渡し

IDIM 任意の整数 �1� 引数と同じ はい

DIM デフォルト実数 デフォルト実数 はい

DDIM 倍精度実数 倍精度実数 はい

QDIM �2� REAL(16) REAL(16) はい

注:

1. IBM 拡張: デフォルト以外の整数の引数を指定できます。

2. IBM 拡張。

DOT_PRODUCT(VECTOR_A, VECTOR_B)目的

2 つのベクトルの内積を計算します。

クラス

変換関数

引数型および属性VECTOR_A

INTENT(IN) NUMERIC または LOGICAL ベクトル

VECTOR_B型とサイズは VECTOR_A と同じです。

結果値

結果はスカラーで、データ型は、 119ページの表 16および 123ページの表 17に記述された規則によって、2 つのベクトルのデータ型に基づいて決まります。

どちらかのベクトルがゼロ・サイズの配列である場合、その配列が数値データ型であれば結果はゼロになり、論理型であれば偽になります。

VECTOR_A が整数型または実数型である場合、結果の値は、 SUM(VECTOR_A *

VECTOR_B) に等しくなります。

第 14 章 組み込みプロシージャー 665

Page 692: IBM XL Fortran for Linux, V15.1

VECTOR_A が複素数型である場合、結果は、SUM(CONJG(VECTOR_A) *

VECTOR_B) に等しくなります。

VECTOR_A が論理型である場合、結果は、ANY(VECTOR_A .AND. VECTOR_B)

に等しくなります。

例! A is (/ 3, 1, -5 /), and B is (/ 6, 2, 7 /).

RES = DOT_PRODUCT (A, B)! calculated as! ( (3*6) + (1*2) + (-5*7) )! = ( 18 + 2 + (-35) )! = -15

DPROD(X, Y)目的

倍精度実数積。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

Y INTENT(IN) REAL

結果型および属性

倍精度実数。

結果値

結果は、X と Y の積に等しい値です。

DPROD (-3.0, 2.0) の値は -6.0D0 です。

特定名 引数の型 結果の型 引数渡し

DPROD デフォルト実数 倍精度実数 はい

QPROD �1� 倍精度実数 REAL(16) はい

注:

1. IBM 拡張。

DSHIFTL(I, J, SHIFT) (Fortran 2008)目的

左方向への結合シフトを実行します。

666 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 693: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER または BOZ リテラル CONSTANT

J INTENT(IN) INTEGER または BOZ リテラル CONSTANT

I と J の両方が型 INTEGER の場合、それらは同じ kind でなければなりません。 I と J の両方を BOZ リテラル CONSTANT にしてはなりません。

SHIFT INTENT(IN) INTEGER。I が INTEGER の場合、その値は負ではなく、BIT_SIZE(I) 以下でなければなりません。そうでない場合、それはBIT_SIZE(J) 以下でなければなりません。

結果型および属性

I が整数型の場合、I と同じです。そうでない場合、J と同じです。

結果値v I または J が BOZ リテラル定数の場合、それはまず組み込み関数 INT による場合のように、他方の kind 型パラメーターを持つ整数型に変換されます。結果値の右端の SHIFT ビットは、J の左端の SHIFT ビットと等しくなり、結果値の他のビットは、I の右端のビットと等しくなります。これは IOR (SHIFTL (I,

SHIFT)、SHIFTR (J, BIT SIZE (J)-SHIFT)) と等しくなります。

v 空になったビットはありません。

v ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

DSHIFTL (5, 2**15, 10) の結果は 5120 です。

DSHIFTR(I, J, SHIFT) (Fortran 2008)目的

右への結合シフトを実行します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER または BOZ リテラル CONSTANT

J INTENT(IN) INTEGER または BOZ リテラル CONSTANT

I と J の両方が型 INTEGER の場合、それらは同じ kind でなければなりません。 I と J の両方を BOZ リテラル CONSTANT にしてはなりません。

SHIFT INTENT(IN) INTEGER。I が INTEGER の場合、その値は負ではなく、BIT_SIZE(I) 以下でなければなりません。そうでない場合、それはBIT_SIZE(J) 以下でなければなりません。

第 14 章 組み込みプロシージャー 667

Page 694: IBM XL Fortran for Linux, V15.1

結果型および属性

I が整数型の場合、I と同じです。そうでない場合、J と同じです。

結果値v I または J が BOZ リテラル定数の場合、それはまず組み込み関数 INT による場合のように、他方の kind 型パラメーターを持つ整数型に変換されます。結果値の左端の SHIFT ビットは、I の右端の SHIFT ビットと等しくなり、結果値の他のビットは、J の左端のビットと等しくなります。これは IOR (SHIFTL (I,

BIT SIZE (I)-SHIFT), SHIFTR (J, SHIFT)) と等しくなります。

v 空になったビットはありません。

v ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

DSHIFTR (-50, -128, 30) の結果は、-197 になります。

EOSHIFT(ARRAY, SHIFT, BOUNDARY, DIM)目的

配列の指定された次元のすべてのベクトルのエレメントをシフトします。シフトでは終端が切り捨てられます。つまり、シフトによって一方の端から押し出されるエレメントは失われ、境界エレメントのコピーが他方の端に入れられます。

クラス

変換関数

引数型および属性ARRAY

任意の型の配列。

SHIFT

v ARRAY がランク 1 の場合、INTENT(IN) INTEGER スカラー。

v そうでない場合、INTENT(IN) INTEGER スカラーまたはランクrank(ARRAY)-1 の INTENT(IN) 式

BOUNDARY (オプション)この引数の型および型パラメーターは、ARRAY と同じ。ARRAY の階数が 1 の場合、BOUNDARY はスカラーでなければなりません。それ以外の場合、BOUNDARY は、rank=rank(ARRAY)-1、形状 (d1, d2..., dDIM-1,

dDIM+1..., dn) のスカラーまたは式です。

DIM (オプション)INTEGER スカラー。その値は、1 ≤ DIM ≤ rank(ARRAY) の範囲内でなければなりません。

結果値

結果は、ARRAY と同じ形状、データ型、および型パラメーターの配列です。

668 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 695: IBM XL Fortran for Linux, V15.1

シフトの量は、SHIFT の絶対値によって決まります。シフトの方向は、SHIFT の符号によって決まります。

正の SHIFTベクトルの各エレメントは、ベクトルの先頭に向かって移動されます。ベクトルの先頭から脱落するエレメントがある場合、そのエレメントの値は、BOUNDARY のベクトルの最後にある対応する値で置き換えられます。

負の SHIFTベクトルの各エレメントは、ベクトルの終わりに向かって移動されます。ベクトルの最後から脱落するエレメントがある場合、そのエレメントの値は、BOUNDARY のベクトルの先頭にある対応する値で置き換えられます。

ゼロの SHIFTシフトは行われません。ベクトルの値は変更されません。

結果値

BOUNDARY がスカラー値である場合、その値がすべてのシフトで使用されます。

BOUNDARY が複数の値からなる配列である場合、添え字 (s1, s2, ..., s(DIM-1),

s(DIM+1), ..., sn) の BOUNDARY の配列エレメントが、その次元に対して使用されます。

BOUNDARY が指定されていない場合、ARRAY のデータ型に基づいて、次のデフォルト値が使用されます。

文字 '�' (1 個のブランク)

論理 偽

整数 0

実 0.0

複素数 (0.0, 0.0)

例! A is | 1.1 4.4 7.7 |,SHIFT is S=(/0, -1, 1/),! | 2.2 5.5 8.8 |! | 3.3 6.6 9.9 |! and BOUNDARY is the array B=(/-0.1, -0.2, -0.3/).

! Leave the first column alone, shift the second! column down one, and shift the third column up one.RES = EOSHIFT (A, SHIFT = S, BOUNDARY = B, DIM = 1)! The result is | 1.1 -0.2 8.8 |! | 2.2 4.4 9.9 |! | 3.3 5.5 -0.3 |

! Do the same shifts as before, but on the! rows instead of the columns.RES = EOSHIFT (A, SHIFT = S, BOUNDARY = B, DIM = 2)! The result is | 1.1 4.4 7.7 |! | -0.2 2.2 5.5 |! | 6.6 9.9 -0.3 |

第 14 章 組み込みプロシージャー 669

Page 696: IBM XL Fortran for Linux, V15.1

EPSILON(X)目的

引数と同じ型および kind 型パラメーターの数値を表すモデルでの、1 と比較するとほとんど無視できる、正のモデル数値を戻します。

クラス

照会関数

引数型および属性X INTENT(IN) REAL。対応する実引数は、スカラー値であっても配列値であっ

てもかまいません。

結果型および属性

X と同じ型および kind 型パラメーターのスカラー。

結果値

結果は次のとおりです。

2.0ei01 - DIGITS(X)

ここで、ei は X の型によって決まる指数指標 (E、D、または Q) です。

type EPSILON(X)---- ----------real(4) 02E0 ** (-23)real(8) 02D0 ** (-52)real(16) 02Q0 ** (-105)

X が real(4) 型の場合、EPSILON (X) = 1.1920929E-07 です。 627ページの『実数データ・モデル』を参照してください。

ERF(X) (Fortran 2008)目的

誤差関数です。

クラス

エレメント型関数

2

e dtt−

√erf(x)

2=

π 0∫x

670 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 697: IBM XL Fortran for Linux, V15.1

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値v 結果は erf(X) の近似値です。

v 結果は、-1 ≤ ERF(X) ≤ 1 の範囲内にあります。

ERF (1.0) の値は 0.8427007794 (近似値) です。

特定名 引数の型 結果の型 引数渡し

ERF デフォルト実数 デフォルト実数 はい

DERF�1� 倍精度実数 倍精度実数 はい

QERF�1� REAL(16) REAL(16) はい

注:v �1� IBM 拡張

ERFC(X) (Fortran 2008)目的

相補誤差関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値v 結果は、1-ERF(X) に等しい値です。

v 結果は、0 ≤ ERFC(X) ≤ 2 の範囲内にあります。

erfc(x)=1 erf(x)=2

xe t dt2

第 14 章 組み込みプロシージャー 671

Page 698: IBM XL Fortran for Linux, V15.1

ERFC (1.0) の値は 0.1572992057 (近似値) です。

特定名 引数の型 結果の型 引数渡し

ERFC デフォルト実数 デフォルト実数 はい

DERFC�1� 倍精度実数 倍精度実数 はい

QERFC�1� REAL(16) REAL(16) はい

注:v �1� IBM 拡張

ERFC_SCALED(X) (Fortran 2008)目的

スケールが適用された相補誤差関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値

結果は、erfc_scaled(X) の近似値です。

ERFC_SCALED (1.0) の値は 0.4275836 (近似値) です。

関連情報v 674ページの『EXP(X)』v 671ページの『ERFC(X) (Fortran 2008)』

EXECUTE_COMMAND_LINE(COMMAND, WAIT, EXITSTAT,CMDSTAT, CMDMSG) (Fortran 2008)

目的

実行のためにコマンドをオペレーティング・システムに渡します。

672 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 699: IBM XL Fortran for Linux, V15.1

クラス

サブルーチン

引数型および属性COMMAND

INTENT(IN) CHARACTER スカラー。実行するコマンド行を指定します。

WAIT (オプション)INTENT(IN) LOGICAL スカラー。COMMAND を同期と非同期のどちらで実行するかを決定します。

v WAIT が .TRUE. に設定されている場合、COMMAND は同期的に実行されます。

v WAIT が .FALSE. に設定されている場合、非同期実行がサポートされていれば、COMMAND が非同期で実行され、サポートされていなければ、同期的に実行されます。

v WAIT が指定されていない場合、値 .TRUE. が指定されているものとして扱われます。COMMAND は同期的に実行されます。

注: 現在のリリースでは、XL Fortran は同期実行のみをサポートしています。

EXITSTAT (オプション)INTENT(OUT) INTEGER スカラー。XL Fortran が COMMAND を同期的に実行する場合、EXITSTAT が指定されていれば、実行されたコマンドから返されたシステム戻りコードの値がこの引数に割り当てられます。それ以外の場合、EXITSTAT の値は変更されません。

CMDSTAT (オプション)INTENT(OUT) INTEGER スカラー。CMDSTAT が指定されている場合、この引数には、以下のようなコマンド実行の状況を示す値が割り当てられます。

v コマンド行の実行がサポートされていない場合、CMDSTAT には値 -1 が割り当てられます。

v COMMAND の実行中にエラーが発生せず、WAIT の値が .FALSE. であるが、非同期実行がサポートされていない場合、CMDSTAT には値 -2 が割り当てられます。

v エラーが発生した場合、CMDSTAT には値 1 が割り当てられます。

v 上記以外のすべての場合、CMDSTAT には値 0 が割り当てられます。

注: CMDSTAT にゼロ以外の値が割り当てられる状況が発生したが、CMDSTAT引数が指定されていない場合は、エラー終了が開始されます。

CMDMSG (オプション)INTENT(OUT) CHARACTER スカラー。COMMAND の実行中にエラーが発生した場合、CMDMSG が指定されていれば、この引数にエラーの説明メッセージの値が割り当てられます。それ以外の場合、CMDMSG の値は変更されません。

例CALL EXECUTE_COMMAND_LINE('rm -rf script')OPEN(1, FILE = 'script')CALL EXECUTE_COMMAND_LINE('date | awk ¥'{printf ¥" %s ¥", $1}¥' >> script.out')

第 14 章 組み込みプロシージャー 673

Page 700: IBM XL Fortran for Linux, V15.1

! Execute the 'cmd' command synchronouslyCHARACTER(LEN = 10) :: cmd = "du -s -m"CALL EXECUTE_COMMAND_LINE(cmd, .TRUE.)

! Assign 'exit' the value of the system return codeINTEGER :: exit = 0CALL EXECUTE_COMMAND_LINE('/bin/mv mod1.mod mod2.mod', .TRUE., EXIT)

! Assign 'exit' the value of the system return code! Assign 'cmdstat' the value of the status of the command executionINTEGER :: exit, cmdstat = 0CALL EXECUTE_COMMAND_LINE('echo running on = ¥'hostname¥'', .TRUE., exit, cmdstat)

! If an error occurs, 'message' is assigned the value of! an explanatory message.

IMPLICIT NONE

CHARACTER(200) :: message = ""INTEGER :: exit_s = 0, cmd_s = 0

CALL EXECUTE_COMMAND_LINE("mv f.1 f.2", EXITSTAT = exit_s,CMDSTAT = cmd_s, CMDMSG = message)

IF (cmd_s .NE. 0) THENIF (cmd_s .EQ. -1) THEN

PRINT *, "command execution not supported on this system"STOP 1

END IF

PRINT *, messageSTOP 2

END IF

IF (exit_s .NE. 0) THENSTOP 3

END IF

END

EXP(X)目的

指数。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL または COMPLEX

結果型および属性

X と同じです。

結果値v 結果は、ex の近似値です。

v X が複素数型の場合、実数部と虚数部はラジアンの値であると見なされます。

674 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 701: IBM XL Fortran for Linux, V15.1

EXP (1.0) の値は 2.7182818 (近似値) です。

特定名 引数の型 結果の型 引数渡し

EXP �1� デフォルト実数 デフォルト実数 はい

DEXP �2� 倍精度実数 倍精度実数 はい

QEXP �2� �3� REAL(16) REAL(16) はい

CEXP �4a� デフォルト複素数 デフォルト複素数 はい

CDEXP �4b� �3� 倍精度複素数 倍精度複素数 はい

ZEXP �4b� �3� 倍精度複素数 倍精度複素数 はい

CQEXP �4b� �3� COMPLEX(16) COMPLEX(16) はい

注:

1. X は、88.7228 以下でなければなりません。

2. X は、709.7827 以下でなければなりません。

3. IBM 拡張。

4. X が a + bi という形式の複素数 (ここで i = (-1) ½) であるとすると、次のようになります。

a. a は 88.7228 以下でなければなりません。b は任意の実数値です。

b. a は 709.7827 以下でなければなりません。b は任意の実数値です。

EXPONENT(X)目的

モデル数値として表された場合の引数の指数部を戻します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

デフォルト整数。

結果値v X ≠ 0 の場合、結果は X の指数です (常にデフォルト整数の範囲内にあります)。

v X = 0 の場合、X の指数はゼロです。

EXPONENT (10.2) = 4 です。 627ページの『実数データ・モデル』を参照してください。

第 14 章 組み込みプロシージャー 675

Page 702: IBM XL Fortran for Linux, V15.1

EXTENDS_TYPE_OF(A, MOLD) (Fortran 2003)目的

A の動的型が MOLD の動的型の拡張であるかどうかを照会します。

クラス

照会関数

引数型および属性A 拡張可能な型の INTENT(IN) 引数。A に対応する実引数がポインターであ

る場合は、そのポインターの関連付け状況は未定義であってはいけません。

MOLD拡張可能な型の INTENT(IN) 引数。MOLD に対応する実引数がポインターである場合は、そのポインターの関連付け状況は未定義であってはいけません。

結果型および属性

デフォルト論理スカラー

結果値v MOLD が無制限ポリモアフィックであり、かつ関連付けが解除されたポインターまたは割り振り解除された割り振り可能引数である場合、結果は真です。

v そうではなく、A が無制限ポリモアフィックであり、かつ関連付けが解除されたポインターまたは割り振り解除された割り振り可能引数である場合、結果は偽です。

v それ以外の場合で、A の動的型が MOLD の動的型の拡張型である場合、結果は真です。

v 上記以外の場合、結果は偽です。

注: 結果は、A と MOLD の動的型によってのみ左右されます。型パラメーターの相違は無視されます。

FINDLOC(ARRAY, VALUE, DIM, MASK, KIND, BACK) またはFINDLOC(ARRAY, VALUE, MASK, KIND, BACK) (Fortran2008)

目的

配列内のある次元で、マスクの真の値に対応するターゲット値と等しい最初または最後のエレメントを見つけます。FINDLOC は、正整数を使用してエレメントの添え字を返します。

クラス

変換関数

676 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 703: IBM XL Fortran for Linux, V15.1

引数型および属性ARRAY

整数型、実数型、複合型、論理型、文字型、またはバイト型の配列。

VALUE

ARRAY と同じ型のスカラー。

DIM (オプション)整数スカラー。その値は、1≤DIM≤n の範囲内でなければなりません。ここで n

は ARRAY のランクです。対応する実引数は、オプションの仮引数にすることはできません。

MASK (オプション)ARRAY と同じ形状の論理型の配列。 これが指定されていない場合は、デフォルトのマスク評価は .TRUE. になります。つまり、配列全体が評価されます。

KIND (オプション)整数スカラー。KIND に対応する実引数は、定数式である必要があります。

BACK (オプション)論理スカラー。これは ARRAY が検索される向きを制御します。これが .FALSE.

であるか、または存在しない場合、配列は先頭から検索されます。 .TRUE. である場合、配列は末尾から検索されます。

結果型および属性v KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト整数型のものです。

v DIM が指定されていない場合、結果は、ARRAY のランクと同じサイズの、ランク1 の整数配列です。

v DIM が指定されておらず、DIM のサイズがゼロのため、値が一致しない場合、またはマスク配列の値がすべて .FALSE. の場合、または VALUE 引数に等しいエレメントが ARRAY にない場合、戻り値はエレメントがゼロである 1 次元配列です。

v DIM が指定されている場合、結果は、ランクが rank(ARRAY)-1 の整数配列であり、ARRAY のランクを n とすると、形状は (s1, ..., sDIM-1, sDIM+1, ..., sn) になります。

制約事項: FINDLOC は実引数として渡すことはできません。

結果値

結果は、値が VALUE と一致する ARRAY の、マスクされたエレメントの位置の添え字を示します。 ARRAY が文字型の場合、比較は ASCII 照合シーケンスを使用して行われます。

複数のエレメントが VALUE と等しく、BACK が存在していないかまたは値 .FALSE.

がある場合、結果は配列エレメント順序の最初のエレメントの場所を示します。BACK が値 .TRUE. が指定されて存在する場合、結果は配列エレメント順序の最後のエレメントの場所を示します。

DIM が指定されている場合、結果は、その次元の各ベクトルに沿った、値が VALUE

と一致する ARRAY のマスクされたエレメントの場所を示します。例 3 では、2 ラ

第 14 章 組み込みプロシージャー 677

Page 704: IBM XL Fortran for Linux, V15.1

ンクの配列内の各 DIM 値に従った結果を示しています。

例 1:

PRINT *, FINDLOC([4,9,-2,9], VALUE=9)

これは | 2 | を出力します。配列は先頭から検索されて、2 つ目のエレメントは、ターゲット値を持つ最初のエレメントであるからです。

PRINT *, FINDLOC([4,9,-2,9], VALUE=9, BACK=.TRUE.)

これは | 4 | を出力します。BACK の値は .TRUE. であり、4 つ目のエレメントは、ターゲット値を持つ最後のエレメントであるからです。

例 2:

INTEGER :: A(-2:0,5:8) ! The lower bound of A does not affect the result.LOGICAL :: M(-5:-3,-1:2) ! A and M can have different lower bounds.A = RESHAPE((/3,2,7,8,5,1,-4,1,0,5,3,5/), (/3,4/))M = RESHAPE((/.FALSE., .TRUE., .FALSE., .TRUE., .FALSE., .TRUE., .TRUE.,

.TRUE., .TRUE., .TRUE., .TRUE., .TRUE./), (/3,4/))!A has the value |3 8 -4 5|, and M has the value |.FALSE. .TRUE. .TRUE. .TRUE.|.! |2 5 1 3| |.TRUE. .FALSE. .TRUE. .TRUE.|! |7 1 0 5| |.FALSE. .TRUE. .TRUE. .TRUE.|

マスク M を使用して値 5 の最初のエレメントを検出するには、以下のようにします。

PRINT *, FINDLOC(A, 5, MASK=M)

これは | 1 4 | を出力します。ターゲット値 5 は A(1, 4) にあるからです。マスクM が原因で、同様にターゲット値を持つ A(2, 2) は評価されません。A(3,4) もターゲット値を持ちますが、これは列優先順で最初のものではありません。

マスク M を使用して値 5 の最後のエレメントを検出するには、以下のようにします。

PRINT *, FINDLOC(A, 5, MASK=M, BACK=.TRUE.)

これは | 3 4 | を出力します。ターゲット値 5 は A(3,4) にあるからです。ターゲット値の他のインスタンスが存在しますが、A(3, 4) は列優先順で最後のものです。

例 3:

INTEGER :: B(2,3)B = RESHAPE((/6,4,-2,3,4,5/),(/2,3/))!B has the value |6 -2 4|.! |4 3 5|

B の各列で値 4 の最初のエレメントを見つけるには、DIM = 1 を指定します。

PRINT *, FINDLOC(B, VALUE=4, DIM=1)

これは | 2 0 1| を出力します。これらの数値は、各列内のターゲット値 4 を持つ最初のエレメントの対応する行位置です。検出されたエレメントは、B(2, 1) およびB(1, 3) にあります。 2 番目の列内に一致する値はないため、0 は 2 番目の場所にあります。

B の各行で値 4 の最初のエレメントを見つけるには、DIM = 2 を指定します。

678 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 705: IBM XL Fortran for Linux, V15.1

PRINT *, FINDLOC(B, VALUE=4, DIM=2)

これは | 3 0 1| を出力します。これらの数値は、各行内のターゲット値を持つ最初のエレメントの対応する列位置です。検出されたエレメントは、B(1, 3) および B(2,

1) にあります。

FLOOR(A, KIND)目的

引数以下で最大の整数を戻します。

クラス

エレメント型関数

引数型および属性A INTENT(IN) REAL

KIND (オプション)INTENT(IN) スカラー INTEGER。 KIND に対応する実引数は、定数式である必要があります。

結果型および属性

整数型です。

KIND が指定されている場合、kind 型パラメーターは、 KIND で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト整数型のものです。

結果値

結果は、A 以下で最も大きい整数に等しい値です。

指定された KIND の整数として表現できない場合の結果は未定義です。

例FLOOR(-3.7) の値は -4 です。FLOOR(3.7) の値は 3 です。

FLOOR(1000.1, KIND=2) の値は 1000 で、kind 型パラメーターは 2 です。

FRACTION(X)目的

引数値のモデル表現の小数部分を戻します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

第 14 章 組み込みプロシージャー 679

Page 706: IBM XL Fortran for Linux, V15.1

結果型および属性

X と同じです。

結果値

結果は次のとおりです。

X * (2.0-EXPONENT(X))

FRACTION(10.2) =2-4 * 10.2 は、約 0.6375 になります。

GAMMA(X) (Fortran 2008)目的

ガンマ関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値

結果は、Γ(X) の近似値です。

GAMMA (1.0) の値は 1.0 です。

GAMMA (10.0) の値は 362880.0 (近似値) です。

特定名 引数の型 結果の型 引数渡し

GAMMA �1� デフォルト実数 デフォルト実数 はい

DGAMMA �2��4� 倍精度実数 倍精度実数 はい

QGAMMA �3��4� REAL(16) REAL(16) はい

u e du1 u− −

0

x∫∞

(x) =Γ

680 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 707: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

注:v X は次の不等式を満たしていなければなりません

�1� -2.0**23 < X ≤ 35.0401 (正でない整数値は除く)

�2� -2.0**52 < X ≤ 171.6243 (正でない整数値は除く)

�3� -2.0**105 < X ≤ 171.6243 (正でない整数値は除く)

v �4� IBM 拡張

GET_COMMAND(COMMAND, LENGTH, STATUS) (Fortran2003)

目的

プログラムを起動したコマンドを戻します。

クラス

サブルーチン

引数型および属性COMMAND (オプション)

INTENT(OUT) CHARACTER スカラー。プログラムを起動したコマンドか、コマンドが不明の場合はブランクのストリングです。

LENGTH (オプション)INTENT(OUT) INTEGER スカラー。プログラムを呼び出したコマンドの有意の長さが入るか、または、コマンドが不明の場合は 0 になります。この長さには、各引数の有意の末尾ブランクが含まれます。COMMAND 引数にコマンドが代入されるときに発生する切り捨てまたは埋め込みは含まれません。

STATUS (オプション)INTENT(OUT) INTEGER スカラー。状況値です。

STATUS の値は、次のいずれかです。

v コマンドの取得が失敗した場合、1

v COMMAND 引数が指定されており、その長さがコマンドの有意の長さより小さい場合、-1

v 上記以外の場合、0

例integer len, statuscharacter(7) :: cmdcall GET_COMMAND(cmd, len, status)print*, cmdprint*, lenprint*, statusend

次のコードは、上記のプログラムによって生成されるサンプル出力です。

$ a.outa.out (スペースが 2 つ続きます)50

第 14 章 組み込みプロシージャー 681

Page 708: IBM XL Fortran for Linux, V15.1

$ a.out aaa.out a8-1

GET_COMMAND_ARGUMENT(NUMBER, VALUE, LENGTH,STATUS) (Fortran 2003)

目的

プログラムを起動したコマンドのコマンド行引数を戻します。

クラス

サブルーチン

引数型および属性NUMBER

INTENT(IN) INTEGER スカラー。引数番号を示す整数です。0 は、コマンド名を表します。1 から引数カウントまでの数は、コマンドの引数を表します。

VALUE (オプション)INTENT(OUT) CHARACTER スカラー。引数の値が入るか、値が不明の場合はブランクのストリングが入ります。

LENGTH (オプション)INTENT(OUT) INTEGER スカラー。引数の有意の長さが入るか、または、引数の長さが不明の場合は 0 が入ります。この長さには、有意の末尾ブランクが含まれます。 VALUE 引数に引数が代入されるときに発生する切り捨てまたは埋め込みは含まれません。

STATUS (オプション)INTENT(OUT) INTEGER スカラー。状況値が割り当てられます。

値は次のいずれかです。

v 引数の取得が失敗した場合、1

v VALUE 引数が指定されており、その長さがコマンド引数の有意の長さより小さい場合、-1

v 上記以外の場合、0

例integer num, len, statuscharacter*7 valuenum = 0call GET_COMMAND_ARGUMENT(num, value, len, status)print*, valueprint*, lenprint*, status

以下に、上記のプログラムによって生成されるサンプル出力を示します。

$ a.out aa bba.out (スペースが 2 つ続きます)50

682 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 709: IBM XL Fortran for Linux, V15.1

GET_ENVIRONMENT_VARIABLE(NAME, VALUE, LENGTH,STATUS, TRIM_NAME) (Fortran 2003)

目的

指定された環境変数の値を戻します。

クラス

サブルーチン

引数型および属性NAME

INTENT(IN) CHARACTER スカラー。オペレーティング・システム環境変数の名前を示す文字ストリングです。このストリングでは、大文字小文字が区別されます。

VALUE (オプション)INTENT(OUT) CHARACTER スカラー。これには、環境変数の値が代入されます。環境変数が値を持たないか存在しなければ、ブランクのストリングが代入されます。

LENGTH (オプション)INTENT(OUT) INTEGER スカラー。これには、値の有意の長さが代入されます。環境変数が値を持たないか存在しなければ、0 が代入されます。

STATUS (オプション)INTENT(OUT) INTEGER スカラー。状況値が割り当てられます。

STATUS の値は、次のいずれかです。

v 環境変数が存在して、その値が正常に VALUE に入れられた場合、または、環境変数が存在するが値がない場合、0

v 環境変数が存在しない場合、1

v VALUE 引数の長さが環境変数の値の有意の長さより小さい場合、-1

v 上記以外のエラー条件が発生した場合、3

TRIM_NAME (オプション)INTENT(IN) LOGICAL スカラー。TRIM_NAME は、NAME 内の末尾ブランクを削除するかどうかを指定する論理値です。デフォルトでは、NAME内の末尾ブランクは切り取られます。TRIM_NAME が指定されていて、その値が .FALSE. である場合、NAME 内の末尾ブランクは意味があるものと見なされます。

例integer num, len, statuscharacter*15 valuecall GET_ENVIRONMENT_VARIABLE('HOME', value, len, status)print*, valueprint*, lenprint*, status

上記のプログラムで生成される出力例は次のとおりです。

第 14 章 組み込みプロシージャー 683

Page 710: IBM XL Fortran for Linux, V15.1

$ a.out/home/xlfuser (スペースが 2 つ続きます)130

GETENV(NAME, VALUE) (IBM 拡張)目的

指定された環境変数の値を戻します。

注: これは、IBM 拡張です。移植性のために、 GET_ENVIRONMENT_VARIABLE

組み込みプロシージャーの使用をお勧めします。

クラス

サブルーチン

引数型および属性NAME

INTENT(IN) CHARACTER スカラー。その値は、オペレーティング・システムの環境変数の名前を示す文字ストリングです。このストリングでは、大文字小文字が区別されます。

VALUEINTENT(OUT) CHARACTER スカラー。サブルーチンが戻ったときに、環境変数の値を保持します。

結果値

結果は、関数結果変数としてではなく、VALUE 引数に戻されます。

NAME 引数に指定された環境変数が存在しない場合、VALUE 引数の内容はブランクになります。

例CHARACTER (LEN=16) ENVDATACALL GETENV('HOME', VALUE=ENVDATA)

! Print the value.PRINT *, ENVDATA

! Show how it is blank-padded on the right.WRITE(*, '(Z32)') ENVDATAEND

上記のプログラムで生成される出力例は次のとおりです。

/home/mark2F686F6D652F6D61726B202020202020

HFIX(A) (IBM 拡張)目的

REAL(4) から INTEGER(2) に変換します。

このプロシージャーは、総称関数ではなく、特定関数です。

684 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 711: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性A INTENT(IN) REAL(4)

結果型および属性

INTEGER(2) スカラーまたは配列です。

結果値v |A| < 1 の場合、HFIX (A) の値は 0 です。

v |A| ≥ 1 の場合、HFIX (A) は、A の絶対値を超えない範囲で絶対値が最大の、A

と同じ符号の整数です。

v INTEGER(2) で表現できない場合の結果は未定義です。

HFIX (-3.7) の値は -3 です。

特定名 引数の型 結果の型 引数渡し

HFIX REAL(4) INTEGER(2) いいえ

HYPOT(X, Y) (Fortran 2008)目的

2 つの値の間のユークリッド距離を求めます。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

Y X と同じ型および kind 型パラメーターの INTENT(IN) 引数。

結果型および属性

X と同じです。

結果値

結果値は sqrt(x2 + y2) (近似値) と同じになります。

HYPOT(3.0, 4.0) の値は 5.0 です。

第 14 章 組み込みプロシージャー 685

Page 712: IBM XL Fortran for Linux, V15.1

HUGE(X)目的

引数と同じ型および kind 型パラメーターの数値を表すモデルでの最大の数を戻します。

クラス

照会関数

引数型および属性X INTENT(IN) INTEGER または REAL

結果型および属性

X と同じ型および kind 型パラメーターのスカラー。

結果値v X がいずれかの整数型である場合、結果は次のようになります。

2DIGITS(X) - 1

v X がいずれかの実数型である場合、結果は次のようになります。

(1.0 - 2.0-DIGITS(X)) *(2.0MAXEXPONENT(X))

X が real(8) 型の場合、HUGE (X) = (1D0 - 2D0**-53) * (2D0**1024) です。

X が integer(8) 型の場合、HUGE (X) = (2**63) - 1 です。

626ページの『データ表記モデル』を参照してください。

IACHAR(C, KIND)目的

ASCII 照合シーケンスでの文字の位置を戻します。

クラス

エレメント型関数

引数型および属性C 長さが 1 の INTENT(IN) 文字。

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

686 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 713: IBM XL Fortran for Linux, V15.1

結果型および属性v 整数型です。

v KIND が指定されている場合、KIND 型パラメーターは KIND の値で指定されたものです。それ以外の場合、KIND 型パラメーターは、デフォルト整数型のものです。

結果値v ISO 646:1983 (International Reference Version) に規定されたコードで定義された照合シーケンス内に C がある場合、結果は、そのシーケンス内での C の位置であり、不等式 (0 ≤ IACHAR (C) ≤ 127) を満たします。C が ASCII 照合シーケンス内にない場合に戻される値は未定義です。

v 結果は、字句比較関数 LGE、LGT、LLE、および LLT と整合したものになります。例えば、LLE (C, D) が真であれば、IACHAR (C) .LE. IACHAR (D) も真です。

IACHAR ('X') の値は 88 です。

IAND(I, J)目的

2 つの整数間でのビット単位の AND を実行します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

J I と同じ kind 型パラメーターの INTENT(IN) INTEGER。

結果型および属性

I と同じです。

結果値

結果の値は、以下の表に従って I と J をビット単位で結合することによって得られます。

I の第 i J の第 i IAND(I,J) の第 iビット ビット ビット-------------------------------

1 1 11 0 00 1 00 0 0

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

第 14 章 組み込みプロシージャー 687

Page 714: IBM XL Fortran for Linux, V15.1

IAND (1, 3) の値は 1 です。 626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

IAND �1� 任意の整数 引数と同じ はい

AND �1� 任意の整数 引数と同じ はい

注:�1� IBM 拡張

IBCLR(I, POS)目的

1 個のビットをゼロにクリアします。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

POS INTENT(IN) INTEGER。その値は負でなく、BIT_SIZE (I) より小さくなければなりません。

結果型および属性

I と同じです。

結果値

結果の値は、I のビット POS がゼロに設定される以外は、 I のビット・シーケンスと同じです。

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

IBCLR (14, 1) の結果は 12 です。

V の値が (/1, 2, 3, 4/) の場合、IBCLR (POS = V, I = 31) の値は (/29, 27, 23,

15/) です。

626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

IBCLR �1� 任意の整数 引数と同じ はい

注:�1� IBM 拡張

688 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 715: IBM XL Fortran for Linux, V15.1

IBITS(I, POS, LEN)目的

ビット・シーケンスを抽出します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

POS INTENT(IN) INTEGER。その値は負でなく、POS + LEN は BIT_SIZE (I) 以下でなければなりません。

LEN INTENT(IN) INTEGER。この値は負数であってはなりません。

結果型および属性

I と同じです。

結果値

結果の値は、I の POS ビットから始まる LEN 個のビットのシーケンスを右寄せして、他のすべてのビットをゼロにしたものです。

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

IBITS (14, 1, 3) の値は 7 です。 626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

IBITS �1� 任意の整数 引数と同じ はい

注:�1� IBM 拡張

IBM2GCCLDBL(A) (IBM 拡張)目的

IBM スタイルの long double データ型を GCC long double に変換します。

クラス

エレメント型関数

引数型および属性A INTENT(IN) REAL(16)

第 14 章 組み込みプロシージャー 689

Page 716: IBM XL Fortran for Linux, V15.1

結果型および属性

A と同じです。

結果値

結果は、GCC の glibc ライブラリーと互換性のある REAL(16) 値に変換された A

の REAL(16) 値です。

特定名 引数の型 結果の型 引数渡し

IBM2GCCLDBL�1� REAL(16) 引数と同じ はい

注:

1. IBM 拡張。

IBM2GCCLDBL_CMPLX(A)目的

IBM スタイルの long double データ型を GCC long double に変換します。

クラス

エレメント型関数

引数型および属性A INTENT(IN) COMPLEX(16)。

結果型および属性

A と同じです。

結果値

この結果は、GCC の glibc ライブラリーと互換性のある COMPLEX(16) 値に変換された A の COMPLEX(16) 値です。

特定名 引数の型 結果の型 引数渡し

IBM2GCCLDBL_CMPLX�1� COMPLEX(16) 引数と同じ はい

注:

1. IBM 拡張。

IBSET(I, POS)目的

1 個のビットを 1 に設定します。

690 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 717: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

POS INTENT(IN) INTEGER。その値は負でなく、BIT_SIZE (I) より小さくなければなりません。

結果型および属性

I と同じです。

結果値

結果の値は、I のビット POS が 1 に設定される以外は、 I のビット・シーケンスと同じです。

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

IBSET (12, 1) の値は 14 です。

V の値が (/1, 2, 3, 4/) の場合、IBSET (POS = V, I = 0) の値は (/2, 4, 8, 16/) です。

626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

IBSET �1� 任意の整数 I と同じです はい

注:�1� IBM 拡張

ICHAR(C, KIND)目的

文字の kind 型パラメーターと関連付けられた照合シーケンスでの文字の位置を戻します。

クラス

エレメント型関数

引数型および属性C 長さが 1 の INTENT(IN) CHARACTER。値は、表現可能な文字の値でなければ

なりません。

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

第 14 章 組み込みプロシージャー 691

Page 718: IBM XL Fortran for Linux, V15.1

結果型および属性v 整数型です。

v KIND が指定されている場合、KIND 型パラメーターは KIND の値で指定されたものです。それ以外の場合、KIND 型パラメーターは、デフォルト整数型のものです。

結果値v 結果は、C の kind 型パラメーターと関連付けられた照合シーケンス内での C の位置であり、 0 ≤ ICHAR (C) ≤ 127 の範囲内にあります。

v 表現可能な任意の文字 C と D について、ICHAR (C) .LE. ICHAR (D) が真である場合のみ C .LE. D は真であり、ICHAR (C) .EQ. ICHAR (D) が真である場合のみ C .EQ. D は真です。

ICHAR ('X') の値は ASCII 照合シーケンスで 88 です。

特定名 引数の型 結果の型 引数渡し

ICHAR デフォルト文字 デフォルト整数 はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。�2� XL Fortran は、ASCII 照合シーケンスのみをサポートします。

IEOR(I, J)目的

排他 OR を実行します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

J I と同じ kind 型パラメーターの INTENT(IN) INTEGER。

結果型および属性

I と同じです。

結果値

結果の値は、以下の真理値表に従って I と J をビット単位で結合することによって得られます。

I の第 i J の第 i IAND(I,J) の第 iビット ビット ビット------------------------------

692 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 719: IBM XL Fortran for Linux, V15.1

1 1 01 0 10 1 10 0 0

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

IEOR (1, 3) の値は 2 です。 626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

IEOR �1� 任意の整数 引数と同じ はい

XOR �1� 任意の整数 引数と同じ はい

注:�1� IBM 拡張

ILEN(I) (IBM 拡張)目的

整数の 2 の補数表現の長さ (ビット単位) より 1 だけ少ない数を戻します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

結果型および属性

I と同じです。

結果値v I が負の場合、ILEN(I)=CEILING(LOG2(-I)) です。

v I が負でない場合、ILEN(I)=CEILING(LOG2(I+1)) です。

例I=ILEN(4) ! 3J=ILEN(-4) ! 2

IMAG(Z) (IBM 拡張)目的

AIMAG と同じです。

関連情報

634ページの『AIMAG(Z)、IMAG(Z)』

第 14 章 組み込みプロシージャー 693

Page 720: IBM XL Fortran for Linux, V15.1

INDEX(STRING, SUBSTRING, BACK, KIND)目的

ストリング内のサブストリングの開始位置を戻します。

クラス

エレメント型関数

引数型および属性STRING

INTENT(IN) CHARACTER

SUBSTRINGSTRING と同じ kind 型パラメーターの INTENT(IN) CHARACTER。

BACK (オプション)INTENT(IN) LOGICAL

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 整数型です。

v KIND が指定されている場合、KIND 型パラメーターは KIND の値で指定されたものです。それ以外の場合、KIND 型パラメーターは、デフォルト整数型のものです。

結果値v ケース (i): BACK が指定されていないか、値 .FALSE. で指定されている場合、結果は、STRING (I : I + LEN (SUBSTRING) - 1) = SUBSTRING を満たす I

の最小の正の値になるか、そのような値がない場合はゼロになります。LEN

(STRING) < LEN (SUBSTRING) の場合は、ゼロが戻されます。 LEN

(SUBSTRING) = 0 の場合は、1 が戻されます。

v ケース (ii): BACK が値 .TRUE. で指定されている場合、結果は、STRING (I : I

+ LEN (SUBSTRING) - 1) = SUBSTRING を満たす、 LEN (STRING) - LEN

(SUBSTRING) + 1 以下で最大の I の値になるか、そのような値がない場合はゼロになります。LEN (STRING) < LEN (SUBSTRING) の場合はゼロが戻され、LEN (SUBSTRING) = 0 の場合は LEN (STRING) + 1 が戻されます。

INDEX ('FORTRAN', 'R') の値は 3 です。

INDEX ('FORTRAN', 'R', BACK = .TRUE.) は値 5 を持ちます。

特定名 引数の型 結果の型 引数渡し

INDEX デフォルト文字 デフォルト整数 はい �1�

694 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 721: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

注:�1� この特定名が引数として渡される場合、このプロシージャーはオプションの BACK

および KIND 引数なしでしか参照されません。

INT(A, KIND)目的

整数型に変換します。

クラス

エレメント型関数

引数型および属性A INTENT(IN) INTEGER、REAL、COMPLEX、または BOZ リテラル CONSTANT

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 整数。

v KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト整数型のものです。

結果値v ケース (i): A が整数型である場合、INT (A) = A です。

v ケース (ii): A が実数型である場合、次の 2 つのケースがあります。|A| < 1 の場合、 INT (A) の値は 0 です。|A| ≥ 1 の場合、INT (A) は、A の絶対値を超えない範囲で絶対値が最大の、A と同じ符号の整数です。

v ケース (iii): A が複素数型である場合、INT (A) は、A の実数部にケース (ii) のルールを適用して得られる値です。

v ケース (iv): A は、BOZ リテラル定数である場合は、プロセッサーによってサポートされている最大の 10 進指数範囲の表現方式を指定する kind パラメーターを持つ整数として扱われます。-qxlf2003=nobozlitargs が指定されている場合、BOZ リテラルは実数型として扱われます。

v 指定された整数型で表せない場合の結果は未定義です。

INT (-3.7) の値は -3 です。

特定名 引数の型 結果の型 引数渡し

INT デフォルト実数 デフォルト整数 いいえ

IDINT 倍精度実数 デフォルト整数 いいえ

IFIX デフォルト実数 デフォルト整数 いいえ

第 14 章 組み込みプロシージャー 695

Page 722: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

IQINT �1� REAL(16) デフォルト整数 いいえ

注:�1� IBM 拡張

関連情報

プログラムを XL Fortran に移植したときの INT の代替動作については、「XL

Fortran コンパイラー・リファレンス」の -qport コンパイラー・オプションを参照してください。

INT2(A) (IBM 拡張)目的

実数値または整数値を 2 バイト整数に変換します。

クラス

エレメント型関数

引数型および属性A INTENT(IN) INTEGER または REAL

INT2 を別の関数呼び出しに実引数として渡すことはできません。

結果型および属性

INTEGER(2) スカラー

結果値

A が整数型である場合、INT2(A) = A です。

A が実数型である場合、次の 2 つの可能性があります。

v |A| < 1 の場合、INT2(A) の値は 0 です。

v |A| >= 1 の場合、INT2(A) は、A の絶対値を超えない範囲で絶対値が最大の、 A

と同じ符号の整数です。

どちらの場合も、切り捨てが起こることがあります。

以下に、INT2 関数の例を示します。

REAL*4 :: R4REAL*8 :: R8INTEGER*4 :: I4INTEGER*8 :: I8

R4 = 8.8; R8 = 18.9I4 = 4; I8 = 8

696 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 723: IBM XL Fortran for Linux, V15.1

PRINT *, INT2(R4), INT2(R8), INT2(I4), INT2(I8)PRINT *, INT2(2.3), INT2(6)PRINT *, INT2(65535.78), INT2(65536.89)END

上記のプログラムで生成される出力例は次のとおりです。

8 18 4 82 6-1 0 ! The results indicate that truncation has occurred, since

! only the last two bytes were saved.

IOR(I, J)目的

包含 OR を実行します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

J I と同じ kind 型パラメーターの INTENT(IN) INTEGER。

結果型および属性

I と同じです。

結果値

結果の値は、以下の真理値表に従って I と J をビット単位で結合することによって得られます。

I の第 i J の第 i IAND(I,J) の第 iビット ビット ビット----------------------------

1 1 11 0 10 1 10 0 0

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

IOR (1, 3) の値は 3 です。 626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

IOR �1� 任意の整数 引数と同じ はい

OR �1� 任意の整数 引数と同じ はい

注:�1� IBM 拡張

第 14 章 組み込みプロシージャー 697

Page 724: IBM XL Fortran for Linux, V15.1

IS_CONTIGUOUS(ARRAY) (Fortran 2008)目的

配列の連続性をテストします。

クラス

照会関数

引数型および属性ARRAY

任意の型の INTENT(IN) 引数。ARRAY に対応する実引数は、任意の型の

配列 TS 29113 または想定ランク・オブジェクト TS 29113 でなければなりません。実引数がポインターである場合は、実引数が関連付けられる必要があります。

結果型および属性

デフォルト論理スカラー

結果値

ARRAY が連続している場合、 TS 29113 またはゼロのランクを持つ場合 TS 29113

は、.TRUE. を返します。それ以外の場合は、.FALSE. を返します。

例INTEGER, POINTER :: ap(:)INTEGER, TARGET :: targ(10)ap => targ(1:10:2)PRINT *, IS_CONTIGUOUS(ap) ! IS_CONTIGUOUS(ap) returns the .FALSE. value.

IS_IOSTAT_END(I) (Fortran 2003)目的

ファイルの終わり条件をチェックします。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

結果型および属性

デフォルト論理スカラー。

698 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 725: IBM XL Fortran for Linux, V15.1

結果値

ファイルの終わり条件が発生したときに、引数が IOSTAT= 指定子の値に一致した場合、.TRUE. を戻します。それ以外の場合、IS_IOSTAT_END は .FALSE. を戻します。

以下に、IS_IOSTAT_END の例を示します。

program ainteger :: ios = 0, x

open( 1, file='dat.dat', action='read' )

do while( .not. is_iostat_end(ios) )

read( 1,*,iostat=ios ) xwrite(6,*) "ios = ", ioswrite(6,*) "x = ", x

enddoend program a

IS_IOSTAT_EOR(I) (Fortran 2003)目的

レコードの終わり条件をチェックします。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

結果型および属性

デフォルト論理スカラー

結果値

レコードの終わり条件が発生したときに、引数が IOSTAT= 指定子の値に一致した場合、.TRUE. を戻します。それ以外の場合、IS_IOSTAT_EOR は .FALSE. を戻します。

ISHFT(I, SHIFT)目的

論理シフトを実行します。

クラス

エレメント型関数

第 14 章 組み込みプロシージャー 699

Page 726: IBM XL Fortran for Linux, V15.1

引数型および属性I INTENT(IN) INTEGER

SHIFT INTENT(IN) INTEGER。SHIFT の絶対値は、BIT_SIZE (I) 以下でなければなりません。

結果型および属性

I と同じです。

結果値v 結果は、I のビットを SHIFT 位置だけシフトすることによって得られる値になります。

v SHIFT が正の場合は左へシフトされ、SHIFT が負の場合は右へシフトされます。SHIFT がゼロの場合、シフトは行われません。

v シフトによって左端または右端から押し出されるビットは、失われます。

v 空になったビットはゼロで埋められます。

v ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

ISHFT (3, 1) の結果は 6 です。 626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

ISHFT �1� 任意の整数 引数と同じ はい

注:�1� IBM 拡張

ISHFTC(I, SHIFT, SIZE)目的

右端ビットの循環シフトを実行します。つまり、シフトによって一方の端から押し出されるビットは、他方の端に挿入されます。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

SHIFT INTENT(IN) INTEGER。SHIFT の絶対値は、SIZE 以下でなければなりません。

SIZE (オプション)INTENT(IN) INTEGER。SIZE の値は、正でなければならず、BIT_SIZE (I) を超えてはなりません。SIZE が指定されていない場合、BIT_SIZE (I) の値が指定されているかのように処理されます。

700 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 727: IBM XL Fortran for Linux, V15.1

結果型および属性

I と同じです。

結果値

結果は、I の右端の SIZE 個のビットを SHIFT 位置だけ循環シフトすることによって得られる値になります。SHIFT が正の場合は左へシフトされ、SHIFT が負の場合は右へシフトされます。SHIFT がゼロの場合、シフトは行われません。失われるビットはありません。シフトされないビットには変更はありません。

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

ISHFTC (3, 2, 3) の値は 5 です。 626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

ISHFTC �1� 任意の整数 引数と同じ はい �2�

注:�1� IBM 拡張�2� この特定名が引数として渡される場合、このプロシージャーは 3 個の引数すべてを指定した状態でしか参照されません。

KIND(X)目的

X の kind 型パラメーターの値を戻します。

クラス

照会関数

引数型および属性X 任意の組み込み型の INTENT(IN) 引数

結果型および属性

デフォルト整数スカラー。

結果値

結果は、X の kind 型パラメーター値に等しい値です。

XL Fortran がサポートする kind 型パラメーターは、 41ページの『第 3 章 組み込みデータ型』に定義されています。

KIND (0.0) は、デフォルト実数型の kind 型パラメーター値になります。

第 14 章 組み込みプロシージャー 701

Page 728: IBM XL Fortran for Linux, V15.1

LBOUND(ARRAY, DIM, KIND)目的

配列の各次元の下限または指定された次元の下限を戻します。

クラス

照会関数

引数型および属性ARRAY

下限を判別したい配列。配列の境界が指定される必要があります。つまり、対応する実引数は、関連付けが解除されたポインターや、割り振られていない割り振り可能な配列であってはなりません。

DIM (オプション)INTEGER スカラー。その値は、1 ≤ DIM ≤ RANK(ARRAY) の範囲内でなければなりません。対応する実引数は、オプションの仮引数であってはなり

ません。 TS 29113 ARRAY がスカラーに関連付けられた想定ランク・オブジ

ェクトである場合、DIM 引数は指定できません。 TS 29113

KIND (オプション)INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 結果は整数型です。

v KIND が指定されている場合、kind 型パラメーターは、KIND の値で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルトの整数型のものです。

v DIM が指定されている場合、結果はスカラーです。DIM が指定されていない場合、結果は、ARRAY の各次元ごとにエレメントが 1 つある 1 次元配列です。

vTS 29113 ARRAY がスカラーに関連付けられた想定ランク・オブジェクトである

場合、結果はゼロ・サイズ配列です。 TS 29113

結果値

結果の各エレメントが、ARRAY の 1 つの次元に対応します。

v ARRAY が配列全体または配列構造コンポーネントである場合、LBOUND(ARRAY, DIM) は、ARRAY の DIM の添え字の下限に等しくなります。

唯一の例外は、 ARRAY が階数 DIM の想定サイズ配列でない場合の、ゼロ・サイズの次元です。そのような場合、結果内の対応するエレメントは、下限に宣言された値に関わらず、 1 になります。

v ARRAY が全体的な配列または配列構造コンポーネントではない配列セクションまたは式である場合、各エレメントの値は 1 になります。

702 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 729: IBM XL Fortran for Linux, V15.1

例REAL A(1:10, -4:5, 4:-5)

RES=LBOUND( A )! The result is (/ 1, -4, 1 /).

RES=LBOUND( A(:,:,:) )RES=LBOUND( A(4:10,-4:1,:) )

! The result in both cases is (/ 1, 1, 1 /)! because the arguments are array sections.

LEADZ(I) (Fortran 2008)目的

整数の 2 進表記における先行ゼロ・ビットの数を戻します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

結果型および属性

I と同じです。

結果値

結果は、I の左端にある 1 のビットまでの、ゼロのビットの数です。I の値がゼロの場合、結果は BIT_SIZE(I) となります。

例I = LEADZ(0_4) ! I=32J = LEADZ(4_4) ! J=29K = LEADZ(-1) ! K=0M = LEADZ(0_8) ! M=64N = LEADZ(1_8) ! N=63

関連情報v 649ページの『BIT_SIZE(I)』

v 782ページの『TRAILZ(I) (Fortran 2008)』

LEN(STRING, KIND)目的

文字エンティティーの長さを戻します。この関数の引数を定義する必要はありません。

クラス

照会関数

第 14 章 組み込みプロシージャー 703

Page 730: IBM XL Fortran for Linux, V15.1

引数型および属性STRING

INTENT(IN) 文字。対応する実引数は、スカラー値であっても配列値であってもかまいません。実引数が割り振り解除された割り振り可能なものであるか、関連付けられていないポインターである場合は、実引数の length 型パラメーターを据え置きにしてはなりません。

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性v スカラー整数型です。

v KIND が指定されている場合、KIND 型パラメーターは KIND の値で指定されたものです。それ以外の場合、KIND 型パラメーターは、デフォルト整数型のものです。

結果値

結果は、STRING がスカラーの場合は、それに含まれる文字の数であり、 STRING

が配列値の場合は、1 つのエレメントに含まれる文字の数です。

C が次のステートメントで宣言されているとします。

CHARACTER (11) C(100)

この場合、LEN (C) の値は 11 です。

特定名 引数の型 結果の型 引数渡し

LEN デフォルト文字 デフォルト整数 はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。

LEN_TRIM(STRING, KIND)目的

文字引数の長さを、末尾ブランクの数を除いて、戻します。

クラス

エレメント型関数

引数型および属性STRING

INTENT(IN) CHARACTER

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

704 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 731: IBM XL Fortran for Linux, V15.1

結果型および属性v 整数型です。

v KIND が指定されている場合、KIND 型パラメーターは KIND の値で指定されたものです。それ以外の場合、KIND 型パラメーターは、デフォルト整数型のものです。

結果値

結果の値は、STRING 内の末尾ブランクが除去された後の、残りの文字数に等しい値です。この引数に非ブランク文字がない場合、結果はゼロです。

LEN_TRIM ('�A�B�') の値は 4 です。LEN_TRIM ('��') の値は 0 です。

LGAMMA(X) (IBM 拡張)目的

ガンマ関数の対数。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値

結果は logeΓ(X) に等しい値です。

LGAMMA (1.0) の値は 0.0 です。

LGAMMA (10.0) の値は 12.80182743 (近似値) です。

関連関数v F2008 LOG_GAMMA(X) F2008

LGE(STRING_A, STRING_B)目的

ASCII 照合シーケンスに基づいて、あるストリングが字句的に別のストリングより大か等しいかどうかをテストします。

第 14 章 組み込みプロシージャー 705

Page 732: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性STRING_A

INTENT(IN) CHARACTER

STRING_BINTENT(IN) CHARACTER

結果型および属性

デフォルト論理。

結果値v ストリングの比較は、それらの長さが等しくない場合、短い方のストリングの右にブランクを入れて、長い方のストリングの長さになるまで拡張されているものと想定して、行われます。

v どちらかのストリングに ASCII 文字セットに含まれない文字がある場合の結果は未定義です。

v 結果は、両ストリングが等しいか、ASCII 照合シーケンスで STRING_A がSTRING_B の後にある場合は真であり、それ以外の場合は偽です。STRING_A とSTRING_B の両方とも長さがゼロの場合は結果が真になることに注意してください。

LGE ('ONE', 'TWO') の値は .FALSE. です。

特定名 引数の型 結果の型 引数渡し

LGE デフォルト文字 デフォルト論理 はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。

LGT(STRING_A, STRING_B)目的

ASCII 照合シーケンスに基づいて、あるストリングが字句的に別のストリングより大きいかどうかをテストします。

クラス

エレメント型関数

引数型および属性STRING_A

INTENT(IN) CHARACTER

706 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 733: IBM XL Fortran for Linux, V15.1

STRING_BINTENT(IN) CHARACTER

結果型および属性

デフォルト論理。

結果値v ストリングの比較は、それらの長さが等しくない場合、短い方のストリングの右にブランクを入れて、長い方のストリングの長さになるまで拡張されているものと想定して、行われます。

v どちらかのストリングに ASCII 文字セットに含まれない文字がある場合の結果は未定義です。

v 結果は、ASCII 照合シーケンスで STRING_A が STRING_B の後にある場合は真であり、それ以外の場合は偽です。STRING_A と STRING_B の両方とも長さがゼロの場合は結果が偽になることに注意してください。

LGT ('ONE', 'TWO') の値は .FALSE. です。

特定名 引数の型 結果の型 引数渡し

LGT デフォルト文字 デフォルト論理 はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。

LLE(STRING_A, STRING_B)目的

ASCII 照合シーケンスに基づいて、あるストリングが字句的に別のストリングより小か等しいかどうかをテストします。

クラス

エレメント型関数

引数型および属性STRING_A

INTENT(IN) CHARACTER

STRING_BINTENT(IN) CHARACTER

結果型および属性

デフォルト論理。

第 14 章 組み込みプロシージャー 707

Page 734: IBM XL Fortran for Linux, V15.1

結果値v ストリングの比較は、それらの長さが等しくない場合、短い方のストリングの右にブランクを入れて、長い方のストリングの長さになるまで拡張されているものと想定して、行われます。

v どちらかのストリングに ASCII 文字セットに含まれない文字がある場合の結果は未定義です。

v 結果は、両ストリングが等しいか、ASCII 照合シーケンスで STRING_A がSTRING_B の前にある場合は真であり、それ以外の場合は偽です。STRING_A とSTRING_B の両方とも長さがゼロの場合は結果が真になることに注意してください。

LLE ('ONE', 'TWO') の値は .TRUE. です。

特定名 引数の型 結果の型 引数渡し

LLE デフォルト文字 デフォルト論理 はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。

LLT(STRING_A, STRING_B)目的

ASCII 照合シーケンスに基づいて、あるストリングが字句的に別のストリングより小さいかどうかをテストします。

クラス

エレメント型関数

引数型および属性STRING_A

INTENT(IN) CHARACTER

STRING_BINTENT(IN) CHARACTER

結果型および属性

デフォルト論理。

結果値v ストリングの比較は、それらの長さが等しくない場合、短い方のストリングの右にブランクを入れて、長い方のストリングの長さになるまで拡張されているものと想定して、行われます。

v どちらかのストリングに ASCII 文字セットに含まれない文字がある場合の結果は未定義です。

708 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 735: IBM XL Fortran for Linux, V15.1

v 結果は、ASCII 照合シーケンスで STRING_A が STRING_B の前にある場合は真であり、それ以外の場合は偽です。STRING_A と STRING_B の両方とも長さがゼロの場合は結果が偽になることに注意してください。

LLT ('ONE', 'TWO') の値は .TRUE. です。

特定名 引数の型 結果の型 引数渡し

LLT デフォルト文字 デフォルト論理 はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。

LOC(X) (IBM 拡張)目的

整数 POINTER を定義するのに使用できる、X のアドレスを戻します。

クラス

照会関数

引数型および属性X アドレスを検出したいデータ・オブジェクト。対応する実引数は、未定義で

あったり関連付けが解除されていたりする、ポインターまたはパラメーターであってはなりません。 F2008 実引数が配列の場合、その配列は連続している必要があります。 F2008 実引数がゼロ・サイズ配列の場合、その配列は非ゼロ・サイズのストレージ・シーケンスと記憶列結合されている必要があります。実引数が配列セクションの場合は、その配列セクションのストレージは連続している必要があります。

結果型および属性

結果は INTEGER (8) 型です。

結果値

結果は、データ・オブジェクトのアドレスであるか、または、X がポインターである場合は、関連付けられたターゲットのアドレスです。引数が無効である場合の結果は未定義です。

例INTEGER A,BPOINTER (P,I)

P=LOC(A)P=LOC(B)END

第 14 章 組み込みプロシージャー 709

Page 736: IBM XL Fortran for Linux, V15.1

LOG(X)目的

自然対数。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL または COMPLEX

v X が REAL の場合、その値はゼロより大きくなければなりません。

v X が COMPLEX の場合、その値はゼロであってはなりません。

結果型および属性

X と同じです。

結果値v 結果は、logeX の近似値です。

v 複素数の引数の場合、LOG ((a,b)) は、LOG (ABS((a,b))) + ATAN2((b,a)) に近似します。

-qxlf2003=signdzerointr オプションは、 Fortran 2003 動作を使用するかどうかを制御します。「XL Fortran コンパイラー・リファレンス」の『qxlf2003』を参照してください。

v

引数の型が複素数の場合は、結果 は、虚数部 -π < ω ≤ π の範囲内の ω の主値です。引数の実数部がゼロより小さく、虚数部がゼロの場合は、結果の虚数部はπ に近似します。

v

引数の型が複素数の場合は、結果 は、虚数部 -π < ω ≤ π の範囲内の ωの主値です。引数の実数部がゼロより小さく、虚数部がゼロの場合、結果の虚数部は、X の虚数部が正の実数ゼロの場合は π に近似します。X の虚数部が負の実数ゼロの場合は、結果の虚数部は -πに近似します。

LOG (10.0) の値は 2.3025851 (近似値) です。

特定名 引数の型 結果の型 引数渡し

ALOG デフォルト実数 デフォルト実数 はい

DLOG 倍精度実数 倍精度実数 はい

QLOG REAL(16) REAL(16) はい �1�

CLOG デフォルト複素数 デフォルト複素数 はい

CDLOG 倍精度複素数 倍精度複素数 はい �1�

ZLOG 倍精度複素数 倍精度複素数 はい �1�

710 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 737: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

CQLOG COMPLEX(16) COMPLEX(16) はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。

LOG_GAMMA(X) (Fortran 2008)目的

GAMMA 関数の絶対値の対数。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL。この値は、0 より大きくなければなりません。

結果型および属性

X と同じです。

結果値

結果値は、X の GAMMA 関数の絶対値の自然対数、つまり LOG(ABS(GAMMA

(X))) の近似値です。

LOG_GAMMA(1.0) の値は 0.0 (近似値) です。

特定名 引数の型 結果の型 引数渡し

LGAMMA デフォルト実数 デフォルト実数 いいえ

LGAMMA 倍精度実数 倍精度実数 いいえ

ALGAMA �1� �2� デフォルト実数 デフォルト実数 はい

DLGAMA �1� �3� 倍精度実数 倍精度実数 はい

QLGAMA �1� �4� REAL(16) REAL(16) はい

注:

v �1� IBM 拡張

v X は次の不等式を満たしていなければなりません�2� 0 < X ≤ 4.0850E36

�3� 2.3561D-304 ≤ X ≤ 21014

�4� 2.3561Q-304 ≤ X ≤ 21014

loge loge u e du1 u− −

0

x∫∞

(x) =Γ

第 14 章 組み込みプロシージャー 711

Page 738: IBM XL Fortran for Linux, V15.1

関連関数v GAMMA(X)

v LGAMMA(X)

LOG10(X)目的

常用対数。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL。X の値はゼロより大きくなければなりません。

結果型および属性

X と同じです。

結果値

結果は log10X に等しい値です。

LOG10 (10.0) の値は 1.0 です。

特定名 引数の型 結果の型 引数渡し

ALOG10 デフォルト実数 デフォルト実数 はい

DLOG10 倍精度実数 倍精度実数 はい

QLOG10 REAL(16) REAL(16) はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。

LOGICAL(L, KIND)目的

kind 型パラメーター値が異なる論理型のオブジェクト間での変換を行います。

クラス

エレメント型関数

引数型および属性L INTENT(IN) LOGICAL

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

712 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 739: IBM XL Fortran for Linux, V15.1

結果型および属性v 論理。

v KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト論理型のものです。

結果値

値は L の値になります。

LOGICAL (L .OR. .NOT. L) の値は .TRUE. であり、論理変数 L の kind 型パラメーターに関係なく、型はデフォルト論理型です。

LSHIFT(I, SHIFT) (IBM 拡張)目的

左方向への論理シフトを実行します。これは 763ページの『SHIFTL(I, SHIFT)

(Fortran 2008)』 と同じです。

注: 同等の IBM 拡張を使用するよりも、標準組み込みプロシージャーを使用することをお勧めします。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

SHIFT INTENT(IN) INTEGER。その値は負ではなく、BIT_SIZE(I) 以下でなければなりません。

結果型および属性

I と同じです。

結果値v 結果は、I のビットを SHIFT 位置だけ左にシフトすることによって得られる値になります。

v 空になったビットはゼロで埋められます。

v ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

LSHIFT (3, 1) の値は 6 です。

LSHIFT (3, 2) の値は 12 です。

特定名 引数の型 結果の型 引数渡し

LSHIFT 任意の整数 引数と同じ はい

第 14 章 組み込みプロシージャー 713

Page 740: IBM XL Fortran for Linux, V15.1

MASKL(I, KIND) (Fortran 2008)目的

左寄せマスクを実行します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER。その値は負ではなく、結果の kind のビット数以下で

なければなりません。

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性

結果は整数です。 KIND 引数がある場合、その kind は KIND の値によって指定されます。ない場合には、その kind はデフォルトの整数型になります。

結果値

左端 I ビットは 1 に設定され、残りのビットは 0 に設定されます。

MASKL (1) の結果は -2147483648 になります。

MASKR(I, KIND) (Fortran 2008)目的

右寄せマスクを実行します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER。その値は負ではなく、結果の kind のビット数以下で

なければなりません。

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性

結果は整数です。 KIND 引数がある場合、その kind は KIND の値によって指定されます。ない場合には、その kind はデフォルトの整数型になります。

714 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 741: IBM XL Fortran for Linux, V15.1

結果値

右端 I ビットは 1 に設定され、残りのビットは 0 に設定されます。

MASKR (3) の結果は 7 になります。

MATMUL(MATRIX_A, MATRIX_B, MINDIM)目的

マトリックス乗算を実行します。

クラス

変換関数

引数型および属性MATRIX_A

ランク 1 または 2 の NUMERIC または LOGICAL 配列。

MATRIX_Bランク 1 または 2 の NUMERIC または LOGICAL 配列。 MATRIX_A と異なる NUMERIC 型であっても構いませんが、1 つの NUMERIC マトリックスと1 つの LOGICAL マトリックスという使い方はできません。

MINDIM (オプション)マトリックス乗算に Strassen アルゴリズムの Winograd バリエーション (大きいマトリックスの場合は高速) を使用するかどうかを決定する整数。このアルゴリズムは、オペランドのマトリックスを、ほぼ同じ大きさの 4 つの部分に、いずれかのサブマトリックスの範囲が MINDIM より小さくなるまで再帰的に分割します。

注: 入力マトリックスの行または列のスケーリングによっては、Strassen 方式は安定的ではありません。従って、MATRIX_A と MATRIX_B に、発散する指数値が含まれる場合は、Strassen 方式では不正確な結果になることがあります。

MINDIM の値の意味は、次のとおりです。

<=0 Strassen アルゴリズムを使用しません。これはデフォルトです。

1 将来の使用のために予約されています。

>1 引数の配列のすべての次元の最小の範囲がこの値以上である限り、再帰的に Strassen アルゴリズムを適用します。最適のパフォーマンスを得るには、 MINDIM の値を変えて試してみる必要があります。最適な値は、マシン構成、使用可能メモリー、および、配列のサイズ、型、kind 型パラメーターに依存するためです。

デフォルトでは、MATMUL はマトリックス乗算の標準的な O(N**3) 方式を採用します。

libpthreads.a ライブラリーがリンクされている場合は、以下の条件下で、O(N**2.81) Strassen 方式の Winograd バリエーションが採用されます。

第 14 章 組み込みプロシージャー 715

Page 742: IBM XL Fortran for Linux, V15.1

1. MATRIX_A と MATRIX_B の両方が、整数、実数、または複素数であり、kind が同じである。

2. プログラムは、範囲 N の正方マトリックス用の約 (2/3)*(N**2) エレメントを保持するのに十分な、必要な一時ストレージを割り振ることができる。

3. MINDIM 引数は、MATRIX_A および MATRIX_B のすべての範囲の最小より小さいか等しい。

引数のうち少なくとも 1 つは、階数が 2 でなければなりません。MATRIX_B の最初または唯一の次元は、 MATRIX_A の最後または唯一の次元と等しくなければなりません。

結果値

結果は、1 つの配列です。いずれか 1 つの引数の階数が 1 である場合、結果の階数は 1 です。両方の引数とも階数が 2 である場合、結果の階数は 2 です。

結果のデータ型は、 119ページの表 16 および 123ページの表 17 に記述された規則に従って、引数のデータ型に基づいて決まります。

MATRIX_A と MATRIX_B が数値データ型の場合、結果の配列エレメントは、次のようになります。

エレメント (i,j) の値 = SUM( (MATRIX_A の行 i) * (MATRIX_B の列 j) )

MATRIX_A と MATRIX_B が論理型の場合、結果の配列エレメントは、次のようになります。

エレメント (i,j) の値 = ANY( (MATRIX_A の行 i) .AND. (MATRIX_B の列 j) )

例! A is the array | 1 2 3 |, B is the array | 7 10 |! | 4 5 6 | | 8 11 |! | 9 12 |

RES = MATMUL(A, B)! The result is | 50 68 |! | 122 167 |

! HUGE_ARRAY and GIGANTIC_ARRAY in this example are! large arrays of real or complex type, so the operation! might be faster with the Strassen algorithm.

RES = MATMUL(HUGE_ARRAY, GIGANTIC_ARRAY, MINDIM=196)

関連情報

Strassen 方式でのマトリックス乗算の数値的安定度については、以下の資料に説明があります。

716 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 743: IBM XL Fortran for Linux, V15.1

v 『Exploiting Fast Matrix Multiplication Within the Level 3 BLAS』, Nicholas J.

Higham, ACM Transactions on Mathematical Software, Vol. 16, No. 4, December

1990.

v 『GEMMW: A portable level 3 BLAS Winograd variant of Strassen's matrix-matrix

multiply algorithm』, Douglas, C. C., Heroux, M., Slishman, G., and Smith, R. M.,

Journal of Computational Physics, Vol. 110, No. 1, January 1994, pages 1-10

MAX(A1, A2, A3, ...)目的

最大値。

クラス

エレメント型関数

引数型および属性

引数はすべて同じ型 (整数、実数、または文字) でなければならず、 kind 型パラメーターも同じでなければなりません。

結果型および属性

引数が文字型の場合、結果は文字型であり、結果の長さは、最長の引数の長さになります。それ以外の場合、結果の型はその引数の型と同じです。(特定の関数の中には、特定の型の結果を戻すものもあります。)

結果値

結果の値は、最大の引数の値です。引数が文字の場合、比較は ASCII 照合シーケンスを使用して行われます。選択された引数の長さが、最長の引数の長さより短い場合、右にブランク文字を挿入して最長の引数の長さに拡張されたものが結果になります。

MAX (-9.0, 7.0, 2.0) の値は 7.0 です。

MAX ("Z", "BB") の値は "Z" です。

特定名 引数の型 結果の型 引数渡し

AMAX0 任意の整数 �1� デフォルト実数 いいえ

AMAX1 デフォルト実数 デフォルト実数 いいえ

DMAX1 倍精度実数 倍精度実数 いいえ

QMAX1 REAL(16) REAL(16) いいえ

MAX0 任意の整数 �1� 引数と同じ いいえ

MAX1 任意の実数 �2� デフォルト整数 いいえ

第 14 章 組み込みプロシージャー 717

Page 744: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

注:�1� IBM 拡張: デフォルト以外の整数の引数を指定できます。�2� IBM 拡張: デフォルト以外の実数の引数を指定できます。

MAXEXPONENT(X)目的

引数と同じ型および kind 型パラメーターの数値を表すモデルでの最大の指数を戻します。

クラス

照会関数

引数型および属性X INTENT(IN) REAL。スカラーまたは配列値を使用できます。

結果型および属性

デフォルト整数スカラー。

結果値

次の結果を参照してください。

type MAXEXPONENT---------- -----------

real(4) 128real(8) 1024real(16) 1024

X が real(4) 型の場合、MAXEXPONENT(X) = 128 です。

627ページの『実数データ・モデル』を参照してください。

MAXLOC(ARRAY, DIM, MASK, KIND, BACK) またはMAXLOC(ARRAY, MASK, KIND, BACK)

目的

配列内のある次元で、マスク内の対応する値が真になっているすべてのエレメントのうちの最大値を持つ最初のエレメント、 F2008 または最後のエレメント

F2008 を見つけます。MAXLOC は、正整数を使用して、そのエレメントの位置を参照できる指標を戻します。

718 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 745: IBM XL Fortran for Linux, V15.1

クラス

変換関数

引数型および属性ARRAY

INTEGER、REAL、または CHARACTER 配列

DIM INTEGER スカラー。その値は、1≤DIM≤n の範囲内でなければなりません。ここで n は ARRAY のランクです。

MASK (オプション)型 LOGICAL の引数で、形状は ARRAY に合致します。これが指定されていない場合、デフォルトのマスク評価は .TRUE. です。つまり、配列全体が評価の対象になります。

KIND (オプション)INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

F2008 BACK (オプション)型 LOGICAL のスカラーで、ARRAY が検索される向きを制御します。これが .FALSE. であるか、または存在しない場合、配列は先頭から検索されます。 .TRUE. である場合、配列は末尾から検索されます。 F2008

結果型および属性v KIND が指定されている場合、KIND 型パラメーターは KIND の値で指定されたものです。それ以外の場合、KIND 型パラメーターは、デフォルト整数型のものです。

v DIM が指定されていない場合、結果は、ARRAY の階数と同じサイズの、階数 1

の整数配列です。DIM が指定されている場合、結果は、階数が rank(ARRAY)-1

の整数配列であり、ARRAY の階数を n とすると、形状は (s1, ..., sDIM-1, sDIM+1,

..., sn) になります。

v 最大値がない場合 (おそらく、配列がゼロ・サイズであるか、マスク配列がすべて .FALSE. 値になっているか、DIM 引数がないことが原因です)、戻り値は、ゼロ・サイズの 1 次元のエンティティーです。DIM が指定されている場合、結果の形状は、ARRAY の階数に基づきます。

結果値

結果は、ARRAY のマスクされたエレメントのうち最大のエレメントの位置の添え字を示します。ARRAY が文字型の場合、比較は ASCII 照合シーケンスを使用して行われます。 F2008 複数のエレメントがこの最大値と等しく、BACK が存在していないかまたは値 .FALSE. がある場合、この関数は配列エレメント順序の最初のエレメントの場所を検出します。 BACK が値 .TRUE. が指定されて存在する場合、この関数は配列エレメント順序の最後のエレメントの場所を検出します。 F2008

DIM が指定されている場合、結果は、その次元の各ベクトルのうち、マスクされた最大エレメントの場所を示します。

第 14 章 組み込みプロシージャー 719

Page 746: IBM XL Fortran for Linux, V15.1

DIM と MASK はどちらもオプションなので、引数のさまざまな組み合わせが可能です。-qintlog オプションが 2 つの引数と共に指定されている場合、2 番目の引数は、次のいずれかを指します。

v 整数型、論理型、バイト型、または型なしの配列であれば、MASK

v 整数型、バイト型、または型なしのスカラーであれば、DIM

v 論理型スカラーであれば、MASK

例! A is the array | 4 9 8 -7 |! | 2 1 -1 5 |! | 9 5 -1 9 |! | -7 5 5 -7 |

A の最初の最大のエレメントを検出するには、次のようにします。

RES = MAXLOC(A)

最大値 9 が A(3, 1) にあるので、結果は | 3 1 | です。最大値の他のインスタンスも存在していますが、A(3, 1) は桁の大きい順で最初のものです。

F2008 A の最後の最大のエレメントを検出するには、次のようにします。

RES = MAXLOC(A, BACK = .TRUE.)

最大値 9 が A(3, 4) にあるので、結果は | 3 4 | です。最大値の他のインスタンスも存在していますが、A(3, 4) は桁の大きい順で最後のものです。 F2008

A の各列内の 7 より小さい最初の最大エレメントを見つけるには、以下のようにします。

RES = MAXLOC(A, DIM = 1, MASK = A .LT. 7)

結果は | 1 3 4 2 | です。これらは各列で 7 より小さい (値 4、5、5、5 の) 最初の最大値の対応する行位置であるためです。

F2008 A の各列の 7 より小さい最後の最大エレメントを検出するには、次のようにします。

RES = MAXLOC(A, DIM = 1, MASK = A .LT. 7, BACK = .TRUE.)

結果は | 1 4 4 2 | です。これらは各列で 7 より小さい (値 4、5、5、5 の) 最後の最大値の対応する行位置であるためです。 F2008

配列に定義された上限および下限に関係なく、MAXLOC は、下限指標を '1' と決めます。MAXLOC と MINLOC 指標は両方とも正の整数を使用します。実際の指標を検出するには、次のようにします。

INTEGER B(-100:100)! Maxloc views the bounds as (1:201)! If the largest element is located at index '-49'

I = MAXLOC(B)! Will return the index '52'! To return the exact index for the largest element, insert:

INDEX = LBOUND(B) - 1 + I! Which is: INDEX = (-100) - 1 + 52 = (-49)

PRINT*, B(INDEX)

720 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 747: IBM XL Fortran for Linux, V15.1

MAXVAL(ARRAY, DIM, MASK) または MAXVAL(ARRAY,MASK)

目的

配列内のある次元のエレメントのうち、MASK 内の対応する値が真になっているエレメントの最大値を戻します。

クラス

変換関数

引数型および属性ARRAY

INTEGER、REAL、または CHARACTER 配列。

DIM (オプション)INTEGER スカラー。その値は、1 ≤ DIM ≤ rank(ARRAY) の範囲内でなければなりません。

MASK (オプション)形状が ARRAY に合致する LOGICAL 配列。これが指定されていない場合、配列全体が評価の対象になります。

結果値

結果は、階数が rank(ARRAY)-1 で、データ型が ARRAY と同じ配列です。DIMが指定されていないか、ARRAY の階数が 1 の場合、結果はスカラーです。ARRAY が文字型の場合、結果の長さは、ARRAY の長さと同じです。

DIM が指定されている場合、結果値の各エレメントは、MASK で指定された条件を満たす、次元 DIM の各ベクトルのすべてのエレメントの最大値になります。結果の配列エレメントの添え字は、(s1, s2, ..., s(DIM-1), s(DIM+1), ..., sn) です。ここで、n

は ARRAY の階数であり、DIM は DIM で指定された次元です。

DIM が指定されていない場合、この関数は、すべての使用可能なエレメントの最大値を戻します。

ARRAY が文字型の場合、すべての比較は ASCII 照合シーケンスを使用して行われます。

ARRAY がゼロ・サイズか、マスク配列の値がすべて .FALSE. の場合、次のようになります。

v ARRAY が整数または実数型の場合、結果値は、型と kind タイプが ARRAY と同じ、最大絶対値の負の数値です。

v ARRAY が文字型の場合、結果の各文字の値は CHAR(0) です。

DIM と MASK はどちらもオプションなので、引数のさまざまな組み合わせが可能です。-qintlog オプションが 2 つの引数と共に指定されている場合、2 番目の引数は、次のいずれかを指します。

v 整数型、論理型、バイト型、または型なしの配列であれば、MASK

v 整数型、バイト型、または型なしのスカラーであれば、DIM

第 14 章 組み込みプロシージャー 721

Page 748: IBM XL Fortran for Linux, V15.1

v 論理型スカラーであれば、MASK

例! A is the array | -41 33 25 |! | 12 -61 11 |

! What is the largest value in the entire array?RES = MAXVAL(A)

! The result is 33

! What is the largest value in each column?RES = MAXVAL(A, DIM=1)

! The result is | 12 33 25 |

! What is the largest value in each row?RES = MAXVAL(A, DIM=2)

! The result is | 33 12 |

! What is the largest value in each row, considering only! elements that are less than 30?

RES = MAXVAL(A, DIM=2, MASK = A .LT. 30)! The result is | 25 12 |

MERGE(TSOURCE, FSOURCE, MASK)目的

2 つの値から、または、2 つの配列内の対応するエレメントから、選択を行います。論理マスクによって、最初の引数と 2 番目の引数のどちらから各結果エレメントを取り出すのかが決まります。

クラス

エレメント型関数

引数型および属性TSOURCE

マスク内の対応するエレメントが真になっている場合に使用されるソース配列。任意のデータ型の式です。

FSOURCEマスク内の対応するエレメントが偽になっている場合に使用されるソース配列。これは、TSOURCE と同じデータ型および型パラメーターでなければなりません。形状が TSOURCE と合致していなければなりません。

MASK 形状が TSOURCE および FSOURCE と合致している論理式。

結果値

結果の形状、データ型、および型パラメーターは、TSOURCE および FSOURCEと同じです。

MASK 内の対応するエレメントの値が、結果内の各エレメントが TSOURCE (真の場合) または FSOURCE (偽の場合) のどちらから取られるのかを決めます。

722 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 749: IBM XL Fortran for Linux, V15.1

例! TSOURCE is | A D G |, FSOURCE is | a d g |,! | B E H | | b e h |! | C F I | | c f i |!! and MASK is the array | T T T |! | F F F |! | F F F |

! Take the top row of TSOURCE, and the remaining elements! from FSOURCE.

RES = MERGE(TSOURCE, FSOURCE, MASK)! The result is | A D G |! | b e h |! | c f i |

! Evaluate IF (X .GT. Y) THEN! RES=6! ELSE! RES=12! END IF! in a more concise form.

RES = MERGE(6, 12, X .GT. Y)

MERGE_BITS(I, J, MASK) (Fortran 2008)目的

マスクの下でビットをマージします。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER または BOZ リテラル CONSTANT

J INTENT(IN) INTEGER または BOZ リテラル CONSTANT。

I と J の両方が型 INTEGER の場合、それらは同じ kind 型パラメーターでなければなりません。 I と J の両方を BOZ リテラル CONSTANT にしてはなりません。

MASK整数型の引数または BOZ リテラル定数。 MASK が整数型の場合、そのkind は整数型の他の各引数と同じでなければなりません。

結果型および属性

I が整数型の場合、I と同じです。そうでない場合、J と同じです。

結果値

いずれかの引数が BOZ リテラル定数の場合、それはまず結果の型および kind 型パラメーターに変換されます。結果の値は、IOR (IAND (I, MASK),IAND (J, NOT

(MASK))) です。

第 14 章 組み込みプロシージャー 723

Page 750: IBM XL Fortran for Linux, V15.1

MERGE_BITS (5, 10, 41) の結果は 3 です。

MIN(A1, A2, A3, ...)目的

最小値。

クラス

エレメント型関数

引数型および属性

引数はすべて同じ型 (整数、実数、または文字) でなければならず、 kind 型パラメーターも同じでなければなりません。

結果型および属性

引数が文字型の場合、結果は文字型であり、結果の長さは、最長の引数の長さになります。それ以外の場合、結果の型および属性は、その引数の型および属性と同じです。(特定の関数の中には、特定の型の結果を戻すものもあります。)

結果値

結果の値は、最小の引数の値です。引数が文字の場合、比較は ASCII 照合シーケンスを使用して行われます。選択された引数の長さが、最長の引数の長さより短い場合、右にブランク文字を挿入して最長の引数の長さに拡張されたものが結果になります。

MIN (-9.0, 7.0, 2.0) の値は -9.0 です。

MIN ("A", "YY") の値は "A" です。

特定名 引数の型 結果の型 引数渡し

AMIN0 任意の整数 �1� デフォルト実数 いいえ

AMIN1 デフォルト実数 デフォルト実数 いいえ

DMIN1 倍精度実数 倍精度実数 いいえ

QMIN1 REAL(16) REAL(16) いいえ

MIN0 任意の整数 �1� 引数と同じ いいえ

MIN1 任意の実数 �1� デフォルト整数 いいえ

注: �1� 非デフォルトの引数は、IBM 拡張です。

724 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 751: IBM XL Fortran for Linux, V15.1

MINEXPONENT(X)目的

引数と同じ型および kind 型パラメーターの数値を表すモデルでの最小 (最大の負)

の指数を戻します。

クラス

照会関数

引数型および属性X INTENT(IN) REAL。X に対応する実引数は、スカラー値であっても配列値で

あってもかまいません。

結果型および属性

デフォルト整数スカラー。

結果値

次の結果を参照してください。

type MINEXPONENT---------- -----------

real(4) - 125real(8) -1021real(16) -968

real(4) の X の場合、MINEXPONENT(X) = -125 です。

627ページの『実数データ・モデル』を参照してください。

MINLOC(ARRAY, DIM, MASK, KIND, BACK) またはMINLOC(ARRAY, MASK, KIND, BACK)

目的

配列内のある次元で、マスク内の対応する値が真になっているすべてのエレメントのうちの最小値を持つ最初のエレメント、 F2008 または BACK が .TRUE. の場合は最後のエレメント F2008 を見つけます。 MINLOC は、正整数を使用して、そのエレメントの位置を参照できる指標を戻します。

クラス

変換関数

引数型および属性ARRAY

INTEGER、REAL、または CHARACTER 配列。

第 14 章 組み込みプロシージャー 725

Page 752: IBM XL Fortran for Linux, V15.1

DIM INTEGER スカラー。その値は、1≤DIM≤n の範囲内でなければなりません。ここで n は ARRAY のランクです。

MASK (オプション)型 LOGICAL の引数で、形状は ARRAY に合致します。これが指定されていない場合、デフォルトのマスク評価は .TRUE. です。つまり、配列全体が評価の対象になります。

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

F2008 BACK (オプション)型 LOGICAL のスカラーで、ARRAY が検索される向きを制御します。これが .FALSE. であるか、または存在しない場合、配列は先頭から検索されます。 .TRUE. である場合、配列は末尾から検索されます。 F2008

結果型および属性v KIND が指定されている場合、KIND 型パラメーターは KIND の値で指定されたものです。それ以外の場合、KIND 型パラメーターは、デフォルト整数型のものです。

v DIM が指定されていない場合、結果は、ARRAY の階数と同じサイズの、階数 1

の整数配列です。DIM が指定されている場合、結果は、階数が rank(ARRAY)-1

の整数配列であり、ARRAY の階数を n とすると、形状は (s1, ..., sDIM-1, sDIM+1,

..., sn) になります。

v 最小値がない場合 (おそらく、配列がゼロ・サイズであるか、マスク配列がすべて .FALSE. 値になっているか、DIM 引数がないことが原因です)、戻り値は、ゼロ・サイズの 1 次元のエンティティーです。DIM が指定されている場合、結果の形状は、ARRAY の階数に基づきます。

結果値

結果は、ARRAY のマスクされたエレメントのうち最小のエレメントの位置の添え字を示します。ARRAY が文字型の場合、比較は ASCII 照合シーケンスを使用して行われます。 F2008 複数のエレメントがこの最小値と等しく、BACK が存在していないかまたは値 .FALSE. がある場合、この関数は配列エレメント順序の最初のエレメントの場所を検出します。 BACK が値 .TRUE. が指定されて存在する場合、この関数は配列エレメント順序の最後のエレメントの場所を検出します。 F2008

DIM が指定されている場合、結果は、その次元の各ベクトルのうち、マスクされた最小エレメントの場所を示します。

DIM と MASK はどちらもオプションなので、引数のさまざまな組み合わせが可能です。-qintlog オプションが 2 つの引数と共に指定されている場合、2 番目の引数は、次のいずれかを指します。

v 整数型、論理型、バイト型、または型なしの配列であれば、MASK

v 整数型、バイト型、または型なしのスカラーであれば、DIM

v スカラーまたは論理型であれば、MASK

726 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 753: IBM XL Fortran for Linux, V15.1

例! A is the array | 4 9 8 -7 |! | 2 1 -1 5 |! | 9 5 -1 9 |! | -7 5 5 -7 |

A の最初の最小のエレメントを検出するには、次のようにします。

RES = MINLOC(A)

最小値 -7 が A(4, 1) にあるので、結果は | 4 1 | です。最小値の他のインスタンスも存在していますが、A(4, 1) は桁の大きい順で最初のものです。

F2008 A の最後の最小のエレメントを検出するには、次のようにします。

RES = MINLOC(A, BACK = .TRUE.)

最小値 -7 が A(4, 4) にあるので、結果は | 4 4 | です。最小値の他のインスタンスも存在していますが、A(4, 4) は桁の大きい順で最後のものです。 F2008

A の各行の -7 と等しくない最初の最小エレメントを検出するには、次のようにします。

RES = MINLOC(A, DIM = 2, MASK = A .NE. -7)

結果は | 1 3 3 2 | です。これらは各行で -7 と等しくない (値は 4、-1、-1、5) 最初の最小値の対応する列位置であるためです。

F2008 A の各行の -7 と等しくない最後の最小エレメントを検出するには、次のようにします。

RES = MINLOC(A, DIM = 2, MASK = A .NE. -7, BACK = .TRUE.)

結果は | 1 3 3 3 | です。これらは各行で -7 と等しくない (値は 4、-1、-1、5) 最後の最小値の対応する列位置であるためです。 F2008

配列に定義された上限および下限に関係なく、MINLOC は、下限指標を '1' と決めます。MAXLOC と MINLOC 指標は両方とも正の整数を使用します。実際の指標を検出するには、次のようにします。

INTEGER B(-100:100)! Minloc views the bounds as (1:201)! If the smallest element is located at index '-49'

I = MINLOC(B)! Will return the index '52'! To return the exact index for the smallest element, insert:

INDEX = LBOUND(B) - 1 + I! Which is: INDEX = (-100) - 1 + 52 = (-49)

PRINT*, B(INDEX)

MINVAL(ARRAY, DIM, MASK) または MINVAL(ARRAY, MASK)目的

配列内のある次元のエレメントのうち、MASK 内の対応する値が真になっているエレメントの最小値を戻します。

第 14 章 組み込みプロシージャー 727

Page 754: IBM XL Fortran for Linux, V15.1

クラス

変換関数

引数型および属性ARRAY

INTEGER、REAL、または CHARACTER 配列。

DIM (オプション)INTEGER スカラー。その値は、1 ≤ DIM ≤ rank(ARRAY) の範囲内でなければなりません。

MASK (オプション)形状が ARRAY に合致する、LOGICAL 型の配列またはスカラー。これが指定されていない場合、配列全体が評価の対象になります。

結果値

結果は、階数が rank(ARRAY)-1 で、データ型が ARRAY と同じ配列です。DIMが指定されていないか、ARRAY の階数が 1 の場合、結果はスカラーです。ARRAY が文字型の場合、結果の長さは、ARRAY の長さと同じです。

DIM が指定されている場合、結果値の各エレメントは、MASK で指定された条件を満たす、次元 DIM の各ベクトルのすべてのエレメントの最小値になります。結果の配列エレメントの添え字は、(s1, s2, ..., s(DIM-1), s(DIM+1), ..., sn) です。ここで、n

は ARRAY の階数であり、DIM は DIM で指定された次元です。

DIM が指定されていない場合、この関数は、すべての使用可能なエレメントの最小値を戻します。

ARRAY が文字型の場合、すべての比較は ASCII 照合シーケンスを使用して行われます。

ARRAY がゼロ・サイズか、マスク配列の値がすべて .FALSE. の場合、次のようになります。

v ARRAY が整数または実数型の場合、結果値は、型と kind タイプが ARRAY と同じ、最大絶対値の正の数値です。

v ARRAY が文字型の場合、結果の各文字の値は CHAR(127) です。

DIM と MASK はどちらもオプションなので、引数のさまざまな組み合わせが可能です。-qintlog オプションが 2 つの引数と共に指定されている場合、2 番目の引数は、次のいずれかを指します。

v 整数型、論理型、バイト型、または型なしの配列であれば、MASK

v 整数型、バイト型、または型なしのスカラーであれば、DIM

v 論理型スカラーであれば、MASK

例! A is the array | -41 33 25 |! | 12 -61 11 |

! What is the smallest element in A?RES = MINVAL(A)

728 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 755: IBM XL Fortran for Linux, V15.1

! The result is -61

! What is the smallest element in each column of A?RES = MINVAL(A, DIM=1)

! The result is | -41 -61 11 |

! What is the smallest element in each row of A?RES = MINVAL(A, DIM=2)

! The result is | -41 -61 |

! What is the smallest element in each row of A,! considering only those elements that are! greater than zero?

RES = MINVAL(A, DIM=2, MASK = A .GT.0)! The result is | 25 11 |

MOD(A, P)目的

剰余関数です。

クラス

エレメント型関数

引数型および属性A INTENT(IN) INTEGER または REAL

P

A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

コンパイラー・オプション -qport=mod が指定されている場合、kind 型パラメーターは異なっていてもかまいません。

結果型および属性

A と同じです。

結果値v P ≠ 0 の場合、結果は A - INT(A/P) * P です。

v P = 0 の場合の結果は未定義です。

例MOD (3.0, 2.0) の値は 1.0 です。MOD (8, 5) の値は 3 です。MOD (-8, 5) の値は -3 です。MOD (8, -5) の値は 3 です。MOD (-8, -5) の値は -3 です。

特定名 引数の型 結果の型 引数渡し

MOD デフォルト整数 デフォルト整数 はい

AMOD デフォルト実数 デフォルト実数 はい

DMOD 倍精度実数 倍精度実数 はい

QMOD REAL(16) REAL(16) はい �1�

第 14 章 組み込みプロシージャー 729

Page 756: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

注:�1� IBM 拡張: 名前を引数として渡すことができます。

関連情報

プログラムを XL Fortran に移植したときの MOD の代替動作については、「XL

Fortran コンパイラー・リファレンス」の -qport コンパイラー・オプションを参照してください。

MODULO(A, P)目的

モジュロ関数です。

クラス

エレメント型関数

引数型および属性A INTENT(IN) INTEGER または REAL

P A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

結果型および属性

A と同じです。

結果値v ケース (i): A は整数型です。P ≠ 0 の場合、MODULO (A, P) の値は、 A = Q

* P + R (Q は整数) を満たす R です。

P > 0 の場合、不等式 0 ≤ R < P が成立します。

P < 0 の場合、 P < R ≤ 0 が成立します。

P = 0 の場合の結果は未定義です。

v ケース (ii): A は実数型です。P ≠ 0 の場合、結果は A - FLOOR (A / P) * P

です。

P = 0 の場合の結果は未定義です。

例MODULO (8, 5) の値は 3 です。MODULO (-8, 5) の値は 2 です。MODULO (8, -5) の値は -2 です。MODULO (-8, -5) の値は -3 です。

730 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 757: IBM XL Fortran for Linux, V15.1

MOVE_ALLOC(FROM, TO) (Fortran 2003)目的

割り振り状況、動的型、型パラメーター値、境界情報、および値を、1 つのオブジェクトから別のオブジェクトに移動します。

クラス

サブルーチン

引数型および属性FROM

INTENT(INOUT) 引数。対応する実引数は、割り振り可能なオブジェクトである必要があります。実引数は、スカラーであっても配列であってもかまいません。

TO INTENT(INOUT) 引数。対応する実引数は、割り振り可能なオブジェクトである必要があります。FROM と互換性のある型で、ランクが同じでなければなりません。FROM がポリモアフィックである場合は、ポリモアフィックでなければなりません。 TO と関連付けられた実引数の宣言型の各非据え置き型パラメーターは、FROM と関連付けられた実引数の宣言型の対応するパラメーターと同じ値を持つ必要があります。

結果値

FROM が割り振り解除されている場合は、TO の割り振り状況は割り振り解除です。

FROM が割り振られている場合、TO は、FROM と同じ動的型、型パラメーター、配列境界、および値で割り振られます。

TO が TARGET 属性の場合、 FROM と関連付けられたポインターは、それに対応して TO と関連付けられます。

TO が TARGET 属性ではない場合、 FROM と関連付けられたポインターの関連付け状況は、MOVE_ALLOC を呼び出すと未定義になります。

MVBITS(FROM, FROMPOS, LEN, TO, TOPOS)目的

1 つのデータ・オブジェクトから別のデータ・オブジェクトに、ビット・シーケンスをコピーします。

クラス

エレメント型サブルーチン

引数型および属性FROM

INTENT(IN) INTEGER

第 14 章 組み込みプロシージャー 731

Page 758: IBM XL Fortran for Linux, V15.1

FROMPOSINTENT(IN) INTEGER。この値は負数であってはなりません。FROMPOS +

LEN は、BIT_SIZE (FROM) 以下でなければなりません。

LEN INTENT(IN) INTEGER。この値は負数であってはなりません。

TO FROM と同じ kind 型パラメーターを持つ INTENT(INOUT) INTEGER 変数であり、FROM と同じ変数であっても構いません。 TO の設定は、FROM

の位置 FROMPOS から始まる、長さ LEN のビット・シーケンスを、TO

の位置 TOPOS にコピーすることで行われます。TO の他のビットは変更されません。戻るときには、TO の TOPOS から始まる LEN 個のビットは、入り口での FROM の FROMPOS から始まる LEN 個の値と等しくなります。

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

TOPOSINTENT(IN) INTEGER。この値は負数であってはなりません。TOPOS + LEN

は、BIT_SIZE (TO) 以下でなければなりません。

TO の初期値が 6 の場合、次のステートメントの後の TO の値は 5 です。

CALL MVBITS (7, 2, 2, TO, 0)

626ページの『整数ビット・モデル』を参照してください。

NEAREST(X,S)目的

S の符号で示される方向 (正または負の無限大方向) で、プロセッサーで表現可能な、最も近い異なる数を戻します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

S INTENT(IN) REAL。その値をゼロにすることはできません。

結果型および属性

X と同じです。

結果値

結果は、S と同じ符号の無限大方向で、X とは異なり、X に最も近いマシン数値です。

732 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 759: IBM XL Fortran for Linux, V15.1

NEAREST (3.0, 2.0) = 3.0 + 2.0(-22)。 627ページの『実数データ・モデル』を参照してください。

NEW_LINE(A) (Fortran 2003)目的

NEW_LINE 組み込み関数は、改行文字を戻します。

クラス

照会関数

引数型および属性A INTENT(IN) 文字。A に対応する実引数は、スカラーであっても配列であっ

てもかまいません。

結果型および属性

長さ 1 の文字スカラー。

結果値

結果は、ACHAR(10) と同じです。

次の例では、NEW_LINE 組み込み関数をリスト指示出力で使用しています。

character(1) cprint *, 'The first sentence.', NEW_LINE(c), 'The second sentence.'

予期される出力は、次のとおりです。

The first sentence.The second sentence.

次の例では、文字リテラル定数が NEW_LINE 組み込み関数に渡されています。

character(100) lineline = 'IBM' // NEW_LINE('Fortran') // 'XL Fortran Compiler'

予期される出力は、次のとおりです。

IBMXL Fortran Compiler

NINT(A, KIND)目的

最も近い整数。

クラス

エレメント型関数

第 14 章 組み込みプロシージャー 733

Page 760: IBM XL Fortran for Linux, V15.1

引数型および属性A INTENT(IN) REAL

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 整数。

v KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト整数型のものです。

結果値v A > 0 の場合、NINT (A) の値は INT (A + 0.5) です。

v A ≤ 0 の場合、NINT (A) の値は INT (A - 0.5) です。

v 指定された整数型で結果値を表せない場合の結果は未定義です。

NINT (2.789) の値は 3 です。NINT (2.123) の値は 2 です。

特定名 引数の型 結果の型 引数渡し

NINT デフォルト実数 デフォルト整数 はい

IDNINT 倍精度実数 デフォルト整数 はい

IQNINT REAL(16) デフォルト整数 はい �1�

注:�1� IBM 拡張

NOT(I)目的

ビット単位で整数の補数を実行します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

結果型および属性

I と同じです。

結果値

結果の値は、以下の表に従った、ビット単位での I の補数です。

734 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 761: IBM XL Fortran for Linux, V15.1

I の第 i NOT (I) の第 iビット ビット------------------

1 00 1

ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

I がビット・ストリング 01010101 で表される場合、NOT (I) のビット・ストリングは 10101010 です。 626ページの『整数ビット・モデル』を参照してください。

特定名 引数の型 結果の型 引数渡し

NOT 任意の整数 引数と同じ はい �1�

注:�1� IBM 拡張

NULL(MOLD)目的

この関数は、ポインターを戻すか、構造体コンストラクターの割り振り解除された割り振り可能コンポーネントを指定します。戻されるポインターの関連付け状況は、関連付け解除です。

以下のいずれかで使用する場合は、この関数を MOLD 引数なしで使用する必要があります。

v 宣言でのオブジェクトの初期化

v コンポーネントのデフォルト初期化

v DATA ステートメント内

v STATIC ステートメント内

以下のいずれかで使用する場合は、この関数は MOLD 引数を指定しても、指定しなくても使用できます。

v PARAMETER 属性内

v ポインター代入の右辺

v 構造体コンストラクター内

v 実引数として

クラス

変換関数

引数型および属性MOLD (オプション)

INTENT(IN) 引数。対応する実引数は、ポインターまたは割り振り可能でなければなりません。実引数は、任意の型にすることができます。または、プロシージャー・ポインターであってもかまいません。ポインターの関連付け状況は、未定義、関連付け解除、または関連付け済みのいずれかが可能で

第 14 章 組み込みプロシージャー 735

Page 762: IBM XL Fortran for Linux, V15.1

す。実引数の関連付け状況が「関連付け済み」の場合、ターゲットは未定義の可能性があります。実引数が割り振り可能な場合、その割り振り状況は「割り振り済み」であっても「割り振り解除済み」であってもかまいません。

結果型および属性

MOLD が指定されている場合、結果の特性は、MOLD の特性と同じです。MOLDに据え置き型パラメーターがある場合、対応する結果の型パラメーターは据え置かれます。MOLD が指定されていない場合、エンティティーの型、型パラメーター、および階数は、次のように決まります。

v ポインター代入の場合、左辺のポインターと同じ

v 宣言でのオブジェクトの初期化の場合、オブジェクトと同じ

v コンポーネントのデフォルト初期化では、コンポーネントと同じ

v 構造体コンストラクター内では、対応するコンポーネントと同じ

v 実引数として使用される場合は、対応する仮引数と同じ

v DATA ステートメント内では、対応するポインター・オブジェクトと同じ

v STATIC ステートメント内では、対応するポインター・オブジェクトと同じ

結果値

結果は、関連付け状況が未関連付けのポインターか、または、未割り振りの割り振り可能エンティティーです。

例! Using NULL() as an actual argument.INTERFACE

SUBROUTINE FOO(I, PR)INTEGER IREAL, POINTER:: PR

END SUBROUTINE FOOEND INTERFACE

CALL FOO(5, NULL())

NUM_PARTHDS() (IBM 拡張)目的

注: この組み込みプロシージャーは非推奨であり、今後のリリースで削除される可能性があります。

ランタイムがプログラム実行中に作成するべき並列 Fortran スレッドの数を戻します。この値は PARTHDS ランタイム・オプションを使用して設定されます。ユーザーが PARTHDS ランタイム・オプションを設定しない場合は、ランタイムによってPARTHDS のデフォルト値が設定されます。これを行う場合、ランタイムはオプションの設定時に、以下を考慮に入れることがあります。

v マシン上のプロセッサーの数

v 実行時オプション USRTHDS に指定された値

736 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 763: IBM XL Fortran for Linux, V15.1

クラス

照会関数

結果値

デフォルトのスカラー整数

コンパイラー・オプション -qsmp が指定されていない場合、NUM_PARTHDS は常に値 1 を戻します。

例I = NUM_PARTHDS()IF (I == 1) THEN

CALL SINGLE_THREAD_ROUTINE()ELSE

CALL MULTI_THREAD_ROUTINE()

特定名 結果の型 引数渡し

NUM_PARTHDS デフォルトのスカラー整数 いいえ

関連情報

「XL Fortran 最適化およびプログラミング・ガイド」の『parthds』および『XLSMPOPTS』実行時オプションを参照してください。

NUM_USRTHDS() (IBM 拡張)目的

注: この組み込みプロシージャーは非推奨であり、今後のリリースで削除される可能性があります。

プログラムの実行中にユーザーによって明示的に作成されるスレッドの数を返します。この値は USRTHDS ランタイム・オプションを使用して設定されます。

クラス

照会関数

結果値

デフォルトのスカラー整数

値が USRTHDS ランタイム・オプションを使用して明示的に設定されていない場合、デフォルト値は 0 です。

特定名 結果の型 引数渡し

NUM_USRTHDS デフォルトのスカラー整数 いいえ

第 14 章 組み込みプロシージャー 737

Page 764: IBM XL Fortran for Linux, V15.1

関連情報

「XL Fortran 最適化およびプログラミング・ガイド」の『usrthds』および『XLSMPOPTS』実行時オプションを参照してください。

NUMBER_OF_PROCESSORS(DIM) (IBM 拡張)目的

常に値 1 のデフォルト整数型のスカラーを戻します。この組み込み関数は、High

Performance Fortran (HPF) 環境用に作成されたプログラムとの互換性を保証します。

クラス

システム照会関数

引数型および属性DIM (オプション)

値 1 を持つ INTENT(IN) INTEGER スカラー (プロセッサー配列のランク)。

結果型および属性

常に値 1 のデフォルトのスカラー整数。

例I = NUMBER_OF_PROCESSORS() ! 1J = NUMBER_OF_PROCESSORS(DIM=1) ! 1

PACK(ARRAY, MASK, VECTOR)目的

マスクの制御に従って、配列から一部またはすべてのエレメントを取り出し、それらを 1 次元の配列に圧縮します。

クラス

変換関数

引数型および属性ARRAY

ソース配列。この配列のエレメントが結果の一部になります。対応する実引数は、どのようなデータ型であってもかまいません。

MASK ARRAY に合致する型 LOGICAL の引数。これは、ソース配列からどのエレメントが取り出されるのかを決定します。スカラーである場合、その値がARRAY のすべてのエレメントに適用されます。

VECTOR (オプション)埋め込み配列。マスクで選択されるエレメントが十分でない場合に、結果を埋めるためにこの配列のエレメントが使用されます。これは、ARRAY とデータ型および型パラメーターが同じ 1 次元配列であり、MASK で値が真に

738 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 765: IBM XL Fortran for Linux, V15.1

なっている以上のエレメント数がなければなりません。MASK がスカラーで、その値が .TRUE. である場合、VECTOR のエレメント数は ARRAYの配列エレメント数以上でなければなりません。

結果値

結果は、常に、データ型と型パラメーターが ARRAY と同じである 1 次元配列です。

結果のサイズは、オプションの引数によって次のようになります。

v VECTOR が指定されている場合、結果の配列のサイズは、VECTOR のサイズと等しくなります。

v それ以外の場合には、MASK が .TRUE. の値を持つスカラーであれば、MASK

内の真の配列エレメントの数か、または、ARRAY 内のエレメントの数に等しくなります。

ARRAY の配列エレメントが取り出されて、結果の配列エレメントを形成します。MASK 内の対応する配列エレメントが .TRUE. である場合、ARRAY 内のそのエレメントが結果の最後に置かれます。

エレメントが結果内に空のままで残ると (VECTOR が存在し、mask 内の .TRUE.

値よりも多くのエレメントを持っていることが原因)、結果内の残りのエレメントはVECTOR からの対応する値に設定されます。

例! A is the array | 0 7 0 |! | 1 0 3 |! | 4 0 0 |

! Take only the non-zero elements of this sparse array.! If there are less than six, fill in -1 for the rest.RES = PACK(A, MASK= A .NE. 0, VECTOR=(/-1,-1,-1,-1,-1,-1/)! The result is (/ 1, 4, 7, 3, -1, -1 /).

! Elements 1, 4, 7, and 3 are taken in order from A! because the value of MASK is true only for these! elements. The -1s are added to the result from VECTOR! because the length (6) of VECTOR exceeds the number! of .TRUE. values (4) in MASK.

POPCNT(I) (Fortran 2008)目的

設定ビット数

データ・オブジェクト内の設定されたビットの数をカウントします。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

第 14 章 組み込みプロシージャー 739

Page 766: IBM XL Fortran for Linux, V15.1

この引数には、BYTE、LOGICAL、または REAL 型も指定できます。引数の型を REAL 型にする場合、REAL(16) は使用しないでください。

結果型および属性

デフォルトの整数

結果値

I のビット・シーケンス内で 1 に設定されたビットの数。

以下の表に、POPCNT 関数の機能を示します。

整数 ビット表記 POPCNT

0 0000 0

1 0001 1

2 0010 1

3 0011 2

4 0100 1

関連情報

データ表記モデル

POPPAR(I) (Fortran 2008)目的

設定ビットのパリティー

データ・オブジェクトのパリティーを判別します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

この引数には、BYTE、LOGICAL、または REAL 型も指定できます。引数の型を REAL 型にする場合、REAL(16) は使用しないでください。

結果型および属性

デフォルトの整数

740 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 767: IBM XL Fortran for Linux, V15.1

結果値v I に含まれるビットのうち、1 に設定されたビットの数が奇数の場合は 1 を戻します。

v I に含まれるビットのうち、1 に設定されたビットの数が偶数の場合は 0 を戻します。

以下の表に、POPPAR 関数の機能を示します。

整数 ビット表記 POPPAR

0 0000 0

1 0001 1

2 0010 1

3 0011 0

4 0100 1

関連情報

データ表記モデル

PRECISION(X)目的

引数と同じ kind 型パラメーターの実数を表すモデルでの 10 進精度を戻します。

クラス

照会関数

引数型および属性X INTENT(IN) REAL または COMPLEX。X に対応する実引数は、スカラー値で

あっても配列値であってもかまいません。

結果型および属性

デフォルト整数スカラー。

結果値

結果は次のとおりです。

INT( (DIGITS(X) - 1) * LOG10(2) )

この場合は、次のようになります。

型 精度-------------------- ---------real(4) , complex(4) 6real(8) , complex(8) 15real(16) , complex(16) 31

第 14 章 組み込みプロシージャー 741

Page 768: IBM XL Fortran for Linux, V15.1

X の型が real(4) である場合、PRECISION (X) = INT( (24 - 1) *

LOG10(2.) ) = INT(6.92 ...) = 6 です。 627ページの『実数データ・モデル』を参照してください。

PRESENT(A)目的

オプションの引数が存在しているかどうかを判別します。存在しない場合、その引数は、オプションの引数として別のプロシージャーに渡すか、引数としてPRESENT に渡すことしかできません。

クラス

照会関数

引数型および属性A INTENT(IN) 引数。A に対応する実引数は、PRESENT 関数参照が存在する

プロシージャー内でアクセス可能なオプションの仮引数です。

結果型および属性

デフォルト論理スカラー。

結果値

実引数が存在する場合 (つまり、指定された仮引数内の現行プロシージャーに渡された場合) は、結果は .TRUE. になり、それ以外の場合は .FALSE. になります。

例SUBROUTINE SUB (X, Y)

REAL, OPTIONAL :: YIF (PRESENT (Y)) THEN

! In this section, we can use y like any other variable.X = X + YPRINT *, SQRT(Y)

ELSE! In this section, we cannot define or reference y.

X = X + 5! We can pass it to another procedure, but only if! sub2 declares the corresponding argument as optional.

CALL SUB2 (Z, Y)ENDIF

END SUBROUTINE SUB

関連情報

468ページの『OPTIONAL』

742 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 769: IBM XL Fortran for Linux, V15.1

PROCESSORS_SHAPE() (IBM 拡張)目的

ゼロ・サイズ配列を戻します。この組み込み関数は、High Performance Fortran

(HPF) 環境用に作成されたプログラムとの互換性を保証します。

クラス

システム照会関数

結果型および属性

プロセッサー配列の階数に等しいサイズの、階数 1 のデフォルト整数配列。ユニプロセッサー環境の場合、結果は、ゼロ・サイズのベクトルです。

結果値

結果の値は、プロセッサー配列の形状です。

例I=PROCESSORS_SHAPE()! Zero-sized vector of type default integer

PRODUCT(ARRAY, DIM, MASK) または PRODUCT(ARRAY,MASK)

目的

1 つの配列全体のすべてのエレメントを乗算するか、または、指定された配列次元のすべてのベクトルから選択されたエレメントを乗算します。

クラス

変換関数

引数型および属性ARRAY

数値データ型の配列。

DIM (オプション)INTEGER スカラー (指定された次元の ARRAY)。その値は、1 ≤ DIM ≤ rank(ARRAY) の範囲内でなければなりません。

MASK (オプション)ARRAY の形状に合致する LOGICAL 式。 MASK がスカラーである場合、そのスカラー値が ARRAY のすべてのエレメントに適用されます。

結果値

DIM が指定されている場合、結果は、階数が rank(ARRAY)-1 の配列になり、データ型と kind 型パラメーターは ARRAY と同じです。DIM が指定されていない場合、または、MASK の階数が 1 の場合、結果はスカラーです。

第 14 章 組み込みプロシージャー 743

Page 770: IBM XL Fortran for Linux, V15.1

結果は、次のいずれかの方式で計算されます。

方式 1:ARRAY のみが指定されている場合、結果は、すべての配列エレメントの積です。ARRAY がゼロ・サイズ配列である場合、結果は 1 になります。

方式 2:ARRAY と MASK の両方が指定されている場合、結果は、MASK 内で対応する配列エレメントが真になっている ARRAY の配列エレメントの積です。MASK のどのエレメントの値も .TRUE. ではない場合、結果は 1 になります。

方式 3:DIM も指定されていて、ARRAY の階数が 1 の場合、結果は、MASK 内で対応する配列エレメントが .TRUE. になっている ARRAY のすべてのエレメントの積に等しいスカラーです。

DIM も指定されていて、ARRAY の階数が 1 より大きい場合、結果は、次元 DIM が除去された新しい配列です。新しい各配列エレメントは、ARRAY 内の対応するベクトルからのエレメントの積です。そのベクトルの指標値は、DIM を除くすべての次元で、出力エレメントの指標値と一致します。出力エレメントは、MASK 内で対応する配列エレメントが .TRUE.

になっているベクトル・エレメントの積です。

DIM と MASK はどちらもオプションなので、引数のさまざまな組み合わせが可能です。-qintlog オプションが 2 つの引数と共に指定されている場合、2 番目の引数は、次のいずれかを指します。

v 整数型、論理型、バイト型、または型なしの配列であれば、MASK

v 整数型、バイト型、または型なしのスカラーであれば、DIM

v 論理型スカラーであれば、MASK

例v 方式 1:

! Multiply all elements in an array.RES = PRODUCT( (/2, 3, 4/) )

! The result is 24 because (2 * 3 * 4) = 24.

! Do the same for a two-dimensional array A, where! A is the array | 2 3 4 |! | 4 5 6 |

RES = PRODUCT(A)! The result is 2880. All elements are multiplied.

v 方式 2:

! A is the array (/ -3, -7, -5, 2, 3 /)! Multiply all elements of the array that are > -5.

RES = PRODUCT(A, MASK = A .GT. -5)! The result is -18 because (-3 * 2 * 3) = -18.

v 方式 3:

! A is the array | -2 5 7 |! | 3 -4 3 |! Find the product of each column in A.

RES = PRODUCT(A, DIM = 1)! The result is | -6 -20 21 | because (-2 * 3) = -6! ( 5 * -4 ) = -20

744 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 771: IBM XL Fortran for Linux, V15.1

! ( 7 * 3 ) = 21

! Find the product of each row in A.RES = PRODUCT(A, DIM = 2)

! The result is | -70 -36 |! because (-2 * 5 * 7) = -70! (3 * -4 * 3) = -36

! Find the product of each row in A, considering! only those elements greater than zero.

RES = PRODUCT(A, DIM = 2, MASK = A .GT. 0)! The result is | 35 9 | because ( 5 * 7) = 35! (3 * 3) = 9

QCMPLX(X, Y) (IBM 拡張)目的

拡張複素数型に変換します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER、REAL、または COMPLEX

Y (オプション)INTENT(IN) INTEGER または REAL。X が COMPLEX 型である場合は、指定できません。

結果型および属性

拡張複素数型です。

結果値v Y が指定されていなくて、X が複素数でない場合、ゼロ値の Y が指定されているかのように処理されます。

v Y が指定されていなくて、X が複素数の場合、値 AIMAG(X) の Y が指定されていて、値が REAL(X) の X が指定されているかのように処理されます。

v QCMPLX(X, Y) は、実数部が REAL(X, KIND=16)、虚数部が REAL(Y,

KIND=16) の複素数値になります。

QCMPLX (-3) の値は (-3.0Q0, 0.0Q0) です。

特定名 引数の型 結果の型 引数渡し

QCMPLX REAL(16) COMPLEX(16) いいえ

関連情報

651ページの『CMPLX(X, Y, KIND)』、 663ページの『DCMPLX(X, Y) (IBM 拡張)』

第 14 章 組み込みプロシージャー 745

Page 772: IBM XL Fortran for Linux, V15.1

QEXT(A) (IBM 拡張)目的

拡張精度実数型に変換します。

クラス

エレメント型関数

引数型および属性A INTENT(IN) INTEGER または REAL

結果型および属性

拡張精度実数。

結果値v A の型が拡張精度実数である場合、QEXT(A) = A です。

v A の型が整数または実数である場合、結果は、A の拡張精度表現です。

QEXT (-3) の値は -3.0Q0 です。

特定名 引数の型 結果の型 引数渡し

QFLOAT 任意の整数 REAL(16) いいえ

QEXT デフォルト実数 REAL(16) いいえ

QEXTD 倍精度実数 REAL(16) いいえ

RADIX(X)目的

引数と同じ型および kind 型パラメーターの数値を表すモデルの基数を戻します。

クラス

照会関数

引数型および属性X INTENT(IN) INTEGER または REAL。X に対応する実引数は、スカラー値で

あっても配列値であってもかまいません。

結果型および属性

デフォルト整数スカラー。

746 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 773: IBM XL Fortran for Linux, V15.1

結果値

結果は、X と同じ kind および型の数値を表すモデルの基数です。 結果は常に 2 です。 626ページの『データ表記モデル』のモデルを参照してください。

RAND() (IBM 拡張)目的

推奨されません。0.0 以上で 1.0 より小さい正の実数の一様乱数を生成します。この代わりに、標準に準拠する RANDOM_NUMBER(HARVEST) 組み込みサブルーチンを使用してください。

クラス

なし (定義されたカテゴリーのどれにも対応しません)。

結果型および属性

REAL(4) スカラー

関連情報

乱数列のシード値を指定するために 774ページの『SRAND(SEED) (IBM 拡張)』を使用できます。

この関数の結果が配列に割り当てられる場合、すべての配列エレメントが同じ値を受け取ります。

RAND 関数を使用した次のサンプル・プログラムを参照してください。

DO I = 1, 5R = RAND()PRINT *, R

ENDDOEND

上記のプログラムによって生成されたサンプル出力を参照してください。

0.22515869140.82855224610.64562988280.24969482420.2215576172

この関数には特定名は 1 つしかありません。

RANDOM_NUMBER(HARVEST)目的

範囲 0 ≤ x < 1 の一様分布から、1 つの疑似乱数、または、疑似乱数の配列を戻します。

第 14 章 組み込みプロシージャー 747

Page 774: IBM XL Fortran for Linux, V15.1

libpthreads.a ライブラリーがリンクされている場合、乱数生成の並列インプリメンテーションが採用され、SMP マシンでのパフォーマンスが向上します。使用されるスレッド数は、intrinthds=num 実行時オプションによって制御できます。

クラス

サブルーチン

引数型および属性HARVEST

INTENT(OUT) REAL。HARVEST に対応する実引数は、スカラー変数であっても配列変数であってもかまいません。間隔 0 ≤ x < 1 の一様分布からの疑似乱数に設定されます。

例REAL X, Y (10, 10)! Initialize X with a pseudo-random numberCALL RANDOM_NUMBER (HARVEST = X)CALL RANDOM_NUMBER (Y)! X and Y contain uniformly distributed random numbers

RANDOM_SEED(SIZE, PUT, GET, GENERATOR)目的

RANDOM_NUMBER によって使用される疑似乱数発生ルーチンを再始動または照会します。

クラス

サブルーチン

引数型および属性

1 つだけの引数があるか、引数がまったくないかのいずれかでなければなりません。

SIZE (オプション)INTENT(OUT) INTEGER スカラー。8 バイト変数のシード値を保持するのに必要な、デフォルト型整数 (N) の個数に設定されます。

PUT (オプション)ランク 1、サイズ ≥ N の、INTENT(IN) INTEGER 配列。ここから、現行の乱数発生ルーチン用のシードが転送されます。

GET (オプション)ランク 1、サイズ ≥ N の、INTENT(OUT) INTEGER 配列。ここへ、現行の乱数発生ルーチン用のシードが転送されます。

GENERATOR (オプション)INTENT(IN) INTEGER スカラー。この値によって、後続で使用される乱数発生ルーチンが決まります。値は、1 または 2 のいずれかでなければなりません。

748 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 775: IBM XL Fortran for Linux, V15.1

RANDOM_SEED を使用すると、ユーザーは、2 つの乱数発生ルーチンを切り替えることができます。乱数発生ルーチン 1 がデフォルトです。各乱数発生ルーチンは、1 つの専用シードを保守し、通常は、最後の数を生成後にサイクルを再開します。有効なシードは、乱数生成ルーチン 1 の場合は 1.0 から 2147483647.0

(2.0**31-1) の範囲内の整数、乱数生成ルーチン 2 の場合は 1.0 から281474976710656.0 (2.0**48) の範囲内の整数である必要があります。

乱数発生ルーチン 1 は、以下の式を使用する乗算合同式法を使用します。

S(I+1) = ( 16807.0 * S(I) ) mod (2.0**31-1)

および

X(I+1) = S(I+1) / (2.0**31-1)

乱数発生ルーチン 1 は、2**31-2 個の乱数を生成したら循環します。

乱数発生ルーチン 2 は、以下の式を使用する乗算合同式法を使用します。

S(I+1) = ( 44,485,709,377,909.0 * S(I) )mod (2.0**48)

および

X(I+1) = S(I+1) / (2.0**48)

乱数発生ルーチン 2 は、(2**48) 個の乱数を生成したら循環します。デフォルトは乱数発生ルーチン 1 です (下位互換性の理由のため) が、乱数発生ルーチン 2 は、ルーチン 1 よりも通常は高速であり、循環までの間隔も長いので、新しいプログラムではこちらを使用することをお勧めします。

引数が何も指定されていない場合、現在の乱数発生ルーチンのシードはデフォルト値 1d0 に設定されます。

例CALL RANDOM_SEED

! Current generator sets its seed to 1d0CALL RANDOM_SEED (SIZE = K)

! Sets K = 64 / BIT_SIZE( 0 )CALL RANDOM_SEED (PUT = SEED (1 : K))

! Transfer seed to current generatorCALL RANDOM_SEED (GET = OLD (1 : K))

! Transfer seed from current generator

RANGE(X)目的

引数と同じ kind 型パラメーターの整数または実数を表しているモデルで 10 進指数範囲を戻します。

クラス

照会関数

第 14 章 組み込みプロシージャー 749

Page 776: IBM XL Fortran for Linux, V15.1

引数型および属性X INTENT(IN) INTEGER、REAL、または COMPLEX。 X に対応する実引数は、ス

カラー値であっても配列値であってもかまいません。

結果型および属性

デフォルト整数スカラー。

結果値1. 整数の引数の場合、結果は次のようになります。

INT( LOG10( HUGE(X) ) )

2. 実数または複素数の引数の場合、結果は次のようになります。

INT( MIN( LOG10( HUGE(X) ), -LOG10( TINY(X) ) ) )

型と範囲は次のとおりです。

Type RANGE------------------------------integer(1) 2integer(2) 4integer(4) 9integer(8) 18real(4) , complex(4) 37real(8) , complex(8) 307real(16) , complex(16) 291

X は次の実数型です。(4)

HUGE(X) = 0.34E+39

TINY(X) = 0.11E-37

RANGE(X) = 37

626ページの『データ表記モデル』を参照してください。

RANK(A) (TS 29113)目的

想定ランク・オブジェクトなどのデータ・オブジェクトのランクを返します。

クラス

照会関数

引数型および属性A INTENT(IN) 引数。対応する実引数は、任意の型の配列であってもスカラー

であってもかまいません。

750 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 777: IBM XL Fortran for Linux, V15.1

結果型および属性

デフォルト整数スカラー。

結果値

結果は、ランク A です。

例REAL :: a(10, 20)PRINT *, RANK(a)END

出力は次のようになります。

2

REAL(A, KIND)目的

実数型に変換します。

クラス

エレメント型関数

引数型および属性A INTENT(IN) INTEGER、REAL、COMPLEX、または BOZ リテラル CONSTANT

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 実数。

v ケース (i): A の型が整数または実数であり、KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。A の型が整数または実数であり、KIND が指定されていない場合、kind 型パラメーターは、デフォルト実数型の kind 型パラメーターです。

v ケース (ii): A の型が複素数であり、KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。A の型が複素数であり、KIND が指定されていない場合、kind 型パラメーターは、A の kind 型パラメーターです。

v ケース (iii): A が BOZ リテラル 定数であり、 KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。A が BOZ リテラル 定数であり、KIND が指定されていない場合、kind 型パラメーターは、デフォルト実数型のものです。-qxlf2003=nobozlitargs が指定されている場合、BOZ リテラル定数は整数として扱われます。

結果値v ケース (i): A の型が整数または実数である場合、結果は、A に対する、kind に依存する近似値と等しくなります。

第 14 章 組み込みプロシージャー 751

Page 778: IBM XL Fortran for Linux, V15.1

v ケース (ii): A の型が複素数である場合、結果は、A の実数部に対する、kind に依存する近似値と等しくなります。

v ケース (iii): A が BOZ リテラル 定数である場合、結果値は、結果と同じ型および kind 型パラメーターの変数の値が BOZ リテラル 定数で指定されるビット・パターンであったと仮定した場合と同じ値になります。

REAL (-3) の値は -3.0 です。REAL ((3.2, 2.1)) の値は 3.2 です。

特定名 引数の型 結果の型 引数渡し

REAL デフォルト整数 デフォルト実数 いいえ

FLOAT 任意の整数 �1� デフォルト実数 いいえ

SNGL 倍精度実数 デフォルト実数 いいえ

SNGLQ REAL(16) デフォルト実数 いいえ �2�

DREAL 倍精度複素数 倍精度実数 いいえ �2�

QREAL COMPLEX(16) REAL(16) いいえ �2�

注:�1� IBM 拡張: デフォルト以外の整数の引数を指定できます。�2� IBM 拡張: 名前を引数として渡すことができません。

F2008 Fortran 2008 では、designator%RE を使用して、複素数の実数部に直接アクセスできます。例えば、A%RE の値は REAL(A) と同じです。複素数部指定子について詳しくは、『複素数』を参照してください。 F2008

REPEAT(STRING, NCOPIES)目的

いくつかのストリングのコピーを連結します。

クラス

変換関数

引数型および属性STRING

INTENT(IN) CHARACTER スカラー。

NCOPIESINTENT(IN) INTEGER スカラー。値は負であってはなりません。

結果型および属性

STRING と同じ kind 型パラメーターの、長さ NCOPIES * LENGTH(STRING) の文字スカラー。

結果値

結果の値は、NCOPIES 個の STRING のコピーを連結したものです。

752 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 779: IBM XL Fortran for Linux, V15.1

REPEAT ('H', 2) の値は 'HH' です。REPEAT ('XYZ', 0) の値は、ゼロ長のストリングです。

RESHAPE(SOURCE, SHAPE, PAD, ORDER)目的

指定された形状の配列を、所定の配列のエレメントから構成します。

クラス

変換関数

引数型および属性SOURCE

任意の型の配列。この配列が、結果配列のエレメントを供給します。

SHAPEエレメント数が 20 個までの INTEGER 配列。ランクは 1、サイズは一定です。結果配列の形状を定義します。すべてのエレメントが正整数またはゼロのいずれかです。

PAD (オプション)データ型と型パラメーターが SOURCE と同じ配列。 SOURCE の形状が変えられて元の配列より大きな配列になる場合に、余分な値を埋めるのに使用されます。これが指定されていないか、ゼロ・サイズ配列である場合、SOURCE は、それより小さいか同じサイズの別の配列にしか変換できません。

ORDER (オプション)一定サイズでランクが 1 の INTEGER 配列。この配列のエレメントは、 (1,

2, ..., SIZE(SHAPE)) の順列でなければなりません。これを使用して、通常の (1, 2, ..., rank(RESULT)) ではない次元の順序で、結果にエレメントを挿入できます。

結果値

結果は、形状が SHAPE の配列です。これのデータ型と型パラメーターは SOURCE

と同じです。

ORDER で指定された次元の順序に従って、あるいは、ORDER が指定されていない場合は配列エレメントの通常の順序で、SOURCE の配列エレメントが結果内に配置されます。

SOURCE の配列エレメントの後には、配列エレメント順に PAD の配列エレメントが続き、その後に、結果の全エレメントが設定されるまで PAD の追加コピーが続きます。

例! Turn a rank-1 array into a 3x4 array of the! same size.RES= RESHAPE( (/A,B,C,D,E,F,G,H,I,J,K,L/), (/3,4/)

第 14 章 組み込みプロシージャー 753

Page 780: IBM XL Fortran for Linux, V15.1

! The result is | A D G J |! | B E H K |! | C F I L |

! Turn a rank-1 array into a larger 3x5 array.! Keep repeating -1 and -2 values for any! elements not filled by the source array.! Fill the rows first, then the columns.RES= RESHAPE( (/1,2,3,4,5,6/), (/3,5/), &

(/-1,-2/), (/2,1/) )! The result is | 1 2 3 4 5 |! | 6 -1 -2 -1 -2 |! | -1 -2 -1 -2 -1 |

関連情報

761ページの『SHAPE(SOURCE, KIND)』

RRSPACING(X)目的

引数値に近いモデル数値間の相対間隔の逆数を戻します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値

結果は次のとおりです。

ABS(FRACTION(X)) * FLOAT(RADIX(X))DIGITS(X)

RRSPACING (-3.0) = 0.75 * 224 です。 627ページの『実数データ・モデル』を参照してください。

RSHIFT(I, SHIFT) (IBM 拡張)目的

右方向への算術シフトを実行します。これは 762ページの『SHIFTA(I, SHIFT)

(Fortran 2008)』 と同じです。

注: 同等の IBM 拡張を使用するよりも、標準組み込みプロシージャーを使用することをお勧めします。

754 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 781: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

SHIFT INTENT(IN) INTEGER。その値は負ではなく、BIT_SIZE(I) 以下でなければなりません。

結果型および属性

I と同じです。

結果値v 結果は、I のビットを SHIFT 位置だけ右にシフトすることによって得られる値になります。

v 空になったビットは符号ビットで埋められます。

v ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

RSHIFT (3, 1) の結果は 1 です。

RSHIFT (3, 2) の結果は 0 です。

RSHIFT (-1, 32) の結果は -1 です。

特定名 引数の型 結果の型 引数渡し

RSHIFT 任意の整数 引数と同じ はい

SAME_TYPE_AS(A,B) (Fortran 2003)目的

A の動的型が B の動的型と同じかどうかを照会します。

クラス

照会関数

引数型および属性A INTENT(IN) 引数。対応する実引数は、拡張可能な型である必要がありま

す。実引数がポインターである場合、実引数の関連付け状況は未定義であってはいけません。

B INTENT(IN) 引数。対応する実引数は、拡張可能な型である必要があります。実引数がポインターである場合、実引数の関連付け状況は未定義であってはいけません。

第 14 章 組み込みプロシージャー 755

Page 782: IBM XL Fortran for Linux, V15.1

結果型および属性

デフォルト論理スカラー

結果値

A の動的型が B の動的型と同じであれば、結果は真です。

注: 結果は、A と B の動的型によってのみ左右されます。型パラメーターの相違は無視されます。

関連情報v 66ページの『拡張可能派生型 (Fortran 2003)』

SCALE(X,I)目的

位取りした値 (X * 2.0I

) を戻します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

I INTENT(IN) INTEGER

結果型および属性

X と同じです。

結果値

結果 の値は、次のようにして求められます。

X * 2.0I

SCALE (4.0, 3) = 4.0 * (23) = 32.0。 627ページの『実数データ・モデル』を参照してください。

SCAN(STRING, SET, BACK, KIND)目的

ストリングをスキャンして、文字セット中の任意の 1 文字を探します。

クラス

エレメント型関数

756 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 783: IBM XL Fortran for Linux, V15.1

引数型および属性STRING

INTENT(IN) 文字。

SET STRING と同じ kind 型パラメーターの INTENT(IN) 文字。

BACK (オプション)INTENT(IN) 論理型。

KIND (オプション)INTENT(IN) 整数。KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 整数。

v KIND が指定されている場合、KIND 型パラメーターは KIND の値で指定されたものです。それ以外の場合、KIND 型パラメーターは、デフォルト整数型のものです。

結果値v ケース (i): BACK が指定されていないか、値 .FALSE. で指定されている場合で、 SET 中にある文字が STRING に少なくとも 1 字は含まれている場合、結果の値は、SET 中にある文字で STRING 内の一番左にある文字の位置です。

v ケース (ii): BACK が指定されていて、その値が .TRUE. であり、 SET にある文字が STRING に少なくとも 1 字は含まれている場合、結果は、SET 中にある文字で STRING 内の一番右にある文字の位置です。

v ケース (iii): STRING のどの文字も SET には存在していないか、 STRING または SET の長さがゼロである場合、結果の値はゼロです。

例v ケース (i): SCAN ('FORTRAN', 'TR') の値は 3 です。

v ケース (ii): SCAN ('FORTRAN', 'TR', BACK = .TRUE.) は値 5 を持ちます。

v ケース (iii): SCAN ('FORTRAN', 'BCD') の値は 0 です。

SELECTED_CHAR_KIND(NAME) (Fortran 2003)目的

文字データ型の kind 型パラメーター値を戻します。

クラス

変換関数

引数型および属性NAME

INTENT(IN) CHARACTER スカラー

結果型および属性

デフォルト整数スカラー。

第 14 章 組み込みプロシージャー 757

Page 784: IBM XL Fortran for Linux, V15.1

結果値v NAME を ASCII と指定した場合、SELECTED_CHAR_KIND は、 ASCII 文字型の kind 型パラメーターを戻します。

v NAME を DEFAULT と指定した場合、SELECTED_CHAR_KIND は、デフォルト文字型の kind 型パラメーターを戻します。

v それ以外の場合、SELECTED_CHAR_KIND は -1 を戻します。

関連情報

XL Fortran がサポートする kind 型パラメーターは、 19ページの『型宣言: 型パラメーターおよび指定子』に定義されています。

SELECTED_INT_KIND(R)目的

-10R < n < 10R のすべての整数値を表す整数データ型の kind 型パラメーターの値を戻します。

クラス

変換関数

引数型および属性R INTENT(IN) INTEGER

結果型および属性

デフォルト整数スカラー。

結果値v 結果の値は、-10R < n < 10R の範囲のすべての n 値を表す整数データ型の kind

型パラメーターの値に等しいか、または、そのような kind 型パラメーターがない場合は、結果は -1 です。

v 複数の kind 型パラメーターが基準に合致する場合、最小の 10 進指数範囲の値が戻されます。

SELECTED_INT_KIND (9) の値は 4 です。これは、kind 型 4 のINTEGER が 10-9 から 109 までのすべての値を表せることを意味します。

関連情報

XL Fortran がサポートする kind 型パラメーターは、 19ページの『型宣言: 型パラメーターおよび指定子』に定義されています。

758 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 785: IBM XL Fortran for Linux, V15.1

SELECTED_REAL_KIND(P, R, RADIX)目的

最低 P 桁の 10 進精度、最低 R の 10 進指数範囲、 F2008 および RADIX の基数を持つ実数データ型の kind 型パラメーターの値を戻します。 F2008

クラス

変換関数

引数型および属性

少なくとも 1 つの引数が指定されなければなりません。

P (オプション)INTENT(IN) INTEGER スカラー

R (オプション)INTENT(IN) INTEGER スカラー

F2008 RADIX (オプション)INTENT(IN) INTEGER スカラー F2008

結果型および属性

デフォルト整数スカラー。

結果値

P または R を指定しない場合、SELECTED_REAL_KIND は P または R が値 0

で指定されたものとして動作します。RADIX を指定しない場合、選択した kind の基数は、サポートされている値のうちいずれかになります。

結果は、以下の条件を満たす実数データ型の kind 型パラメーターの値です。

v 最低 P 桁の 10 進精度 (PRECISION 関数で返される値) を持つ。

v 最低 R の 10 進指数範囲 (RANGE 関数で返される値) を持つ。

v F2008 RADIX の基数 (RADIX 関数で返される値) を持つ。 F2008

そのような kind 型パラメーターが得られない場合は、以下に示す各種の条件に応じて、それぞれ異なる値が結果として返されます。

v F2008 基数が使用可能で、 F2008 精度が使用可能でなく、指数範囲が使用可能な場合、結果は -1 です。

v F2008 基数が使用可能で、 F2008 指数範囲が使用可能でなく、精度が使用可能な場合、結果は -2 です。

v F2008 基数が使用可能で、 F2008 精度と指数範囲のどちらも使用可能でない場合、結果は -3 です。

v F2008 基数が使用可能で、 F2008 精度と指数範囲の両方が一緒にではなく別個に使用可能である場合、結果は -4 です。

v F2008 基数が使用可能でない場合、結果は -5 です。 F2008

第 14 章 組み込みプロシージャー 759

Page 786: IBM XL Fortran for Linux, V15.1

複数の kind 型パラメーター値が基準に合致する場合、最小の 10 進精度の値が戻されます。ただし、複数の値の最小 10 進精度が同じである場合は、その最小値が戻されます。

F2008 現在、XL Fortran コンパイラーでは、RADIX=2 のみサポートされています。 F2008

以下の例では、SELECTED_REAL_KIND 組み込みプロシージャーの使用方法を示します。

PROGRAM aINTEGER :: i

i = SELECTED_REAL_KIND(6, 70)PRINT *, 'SELECTREALKIND(6, 70) = ', i

END PROGRAM a

このプログラムの出力は、次のようになります。

SELECTREALKIND(6, 70) = 8

SELECTED_REAL_KIND (6, 70) の値は 8 です。

F2008

以下の例では、RADIX 引数を指定して SELECTED_REAL_KIND 組み込みプロシージャーを使用する方法を示します。

PROGRAM aINTEGER :: i

i = SELECTED_REAL_KIND(20, 140, 2)PRINT *, 'SELECTREALKIND(20, 140, 2) = ', i

END PROGRAM a

このプログラムの出力は、次のようになります。

SELECTREALKIND(20, 140, 2) = 16

F2008

関連情報v PRECISION(X)

v RANGE(X)

v 746ページの『RADIX(X)』

v XL Fortran がサポートする kind 型パラメーターは、 19ページの『型宣言: 型パラメーターおよび指定子』に定義されています。

SET_EXPONENT(X,I)目的

小数部分が X のモデル表現の小数部分であり、指数部分が I である数を戻します。

760 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 787: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

I INTENT(IN) INTEGER

結果型および属性

X と同じです。

結果値

IBM 拡張

X = 0 の場合、結果はゼロです。

それ以外の場合、結果は次のとおりです。

FRACTION(X) * 2.0I

IBM 拡張 の終り

IBM 拡張

SET_EXPONENT (10.5, 1) = 0.65625 * 2.01 = 1.3125

627ページの『実数データ・モデル』を参照してください。

IBM 拡張 の終り

SHAPE(SOURCE, KIND)目的

配列またはスカラーの形状を戻します。

クラス

照会関数

引数型および属性SOURCE

INTENT(IN) 引数。対応する実引数は、任意のデータ型の、配列であってもスカラーであってもかまいません。この実引数は、関連付けが解除されたポインター、割り振られていない割り振り可能オブジェクト、または想定サイズ配列であってはいけません。

第 14 章 組み込みプロシージャー 761

Page 788: IBM XL Fortran for Linux, V15.1

KIND (オプション)INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 結果は、ランク 1、サイズ RANK(SOURCE) の配列です。

v 整数型です。

v KIND が指定されている場合、kind 型パラメーターは、KIND の値で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト整数型のものです。

結果値

SOURCE 内の各次元の範囲が、結果配列の対応するエレメントに戻されます。

TS 29113 ARRAY が想定サイズ配列に関連付けられた想定ランク・オブジェクトである場合、結果は [(SIZE(ARRAY, I, KIND), I=1, RANK(ARRAY))] に等しい値になります。 KINDは、SHAPE から省略される場合、SIZE からも省略されます。TS 29113

関連情報

753ページの『RESHAPE(SOURCE, SHAPE, PAD, ORDER)』

例! A is the array | 7 6 3 1 |! | 2 4 0 9 |! | 5 7 6 8 |!

RES = SHAPE( A )! The result is | 3 4 | because A is a rank-2 array! with 3 elements in each column and 4 elements in! each row.

SHIFTA(I, SHIFT) (Fortran 2008)目的

右方向への算術シフトを実行します。これは 754ページの『RSHIFT(I, SHIFT)

(IBM 拡張)』 と同じです。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

SHIFT INTENT(IN) INTEGER。その値は負ではなく、BIT_SIZE(I) 以下でなければなりません。

762 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 789: IBM XL Fortran for Linux, V15.1

結果型および属性

I と同じです。

結果値v 結果は、I のビットを SHIFT 位置だけ右にシフトすることによって得られる値になります。

v 空になったビットは符号ビットで埋められます。左端ビットは I です。

v ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

SHIFTA (-68, 4) の結果は -4 です。

SHIFTL(I, SHIFT) (Fortran 2008)目的

左へのシフトを実行します。これは 713ページの『LSHIFT(I, SHIFT) (IBM 拡張)』 と同じです。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

SHIFT INTENT(IN) INTEGER。その値は負ではなく、BIT_SIZE(I) 以下でなければなりません。

結果型および属性

I と同じです。

結果値v 結果は、I のビットを SHIFT 位置だけ左にシフトすることによって得られる値になります。これは ISHFT(I, SHIFT) と同じです。

v 空になったビットはゼロで埋められます。

v ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

SHIFTL (-8, 2) の結果は -32 です。

SHIFTR(I, SHIFT) (Fortran 2008)目的

右方向への論理シフトを実行します。

第 14 章 組み込みプロシージャー 763

Page 790: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

SHIFT INTENT(IN) INTEGER。その値は負ではなく、BIT_SIZE(I) 以下でなければなりません。

結果型および属性

I と同じです。

結果値v 結果は、I のビットを SHIFT 位置だけ右にシフトすることによって得られる値になります ( 699ページの『ISHFT(I, SHIFT)』と同じです)。

v 空になったビットはゼロで埋められます。

v ビットの番号は、右から左へ、0 から BIT_SIZE(I)-1 です。

SHIFTR (12, 1) の結果は 6 です。

SIGN(A, B)目的

A の絶対値と B の符号を乗算したものを戻します。A がゼロでない場合、結果の符合は B の符号と同じなので、結果を使用して、B が負であるか、負でないかを判別できます。

B を REAL(4) または REAL(8) と宣言し、B が負のゼロ値である場合、結果の符号は、-qxlf90=signedzero コンパイラー・オプションが指定されているかどうかによって異なります。

クラス

エレメント型関数

引数型および属性A INTENT(IN) INTEGER または REAL

B A と同じ型および kind 型パラメーターの引数。

結果型および属性

A と同じです。

結果値

結果は、sgn*|A| で、次のようになります。

v 以下のいずれかが当てはまる場合、sgn = -1 です。

764 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 791: IBM XL Fortran for Linux, V15.1

– B < 0

– B が REAL(4) または REAL(8) の数であり、その値は負のゼロである。かつ、-qxlf90=signedzero オプションが指定されている。

v 上記以外の場合、sgn = 1 です。

正と負の実数ゼロをプロセッサーが区別することは Fortran 90 では許可されていませんでしたが、Fortran 95 では許可されています。-qxlf90=signedzero オプションを使用すると、2 進浮動小数点演算に関する IEEE 標準に準拠した Fortran 95 の動作(REAL(16) の数値の場合を除く) を指定することができます。xlf95、xlf95_r、f2003、および f2008 呼び出しコマンドを使用する場合は、-qxlf90=signedzero がデフォルトです。

SIGN (-3.0, 2.0) の値は 3.0 です。

特定名 引数の型 結果の型 引数渡し

SIGN デフォルト実数 デフォルト実数 はい

ISIGN 任意の整数 �1� 引数と同じ はい

DSIGN 倍精度実数 倍精度実数 はい

QSIGN REAL(16) REAL(16) はい �2�

注:�1� IBM 拡張: デフォルト以外の整数の引数を指定できます。�2� IBM 拡張: 名前を引数として渡すことができます。

関連情報

「XL Fortran コンパイラー・リファレンス」の『-qxlf90』を参照してください。

SIGNAL(I, PROC) (IBM 拡張)目的

SIGNAL プロシージャーを使用すると、特定のオペレーティング・システム・シグナルを受信したときに呼び出されるプロシージャーをプログラムで指定できます。

クラス

サブルーチン

引数型および属性I INTENT(IN) INTEGER。これは動作を起こす基準となるシグナルの値を指定し

ます。使用可能なシグナル値は、 C インクルード・ファイル signal.h に定義され、シグナル値のサブセットが Fortran インクルード・ファイルfexcp.h に定義されます。

PROC 引数 I で指定されたシグナルをプロセスが受信したときに呼び出されるユーザー定義のプロシージャーを指定する、INTENT(IN) 引数。

第 14 章 組み込みプロシージャー 765

Page 792: IBM XL Fortran for Linux, V15.1

例INCLUDE 'fexcp.h'INTEGER SIGUSR1EXTERNAL USRINT

! Set exception handler to produce the traceback code.! The SIGTRAP is defined in the include file fexcp.h.! xl__trce is a procedure in the XL Fortran! run-time library. It generates the traceback code.

CALL SIGNAL(SIGTRAP, XL__TRCE)...

! Use user-defined procedure USRINT to handle the signal! SIGUSR1.

CALL SIGNAL(SIGUSR1, USRINT)...

関連情報

「XL Fortran コンパイラー・リファレンス」の -qsigtrap オプションを使用すると、コンパイラー・オプションを介して SIGTRAP シグナルのハンドラーを設定できます。

SIN(X)目的

サイン (正弦) 関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL または COMPLEX。X は、REAL の場合、ラジアンの値であ

ると見なされます。 X が COMPLEX の場合、実数部と虚数部はラジアンの値であると見なされます。

結果型および属性

X と同じです。

結果値

sin(X) の近似値です。

SIN (1.0) の値は 0.84147098 (近似値) です。

特定名 引数の型 結果の型 引数渡し

SIN デフォルト実数 デフォルト実数 はい

DSIN 倍精度実数 倍精度実数 はい

QSIN REAL(16) REAL(16) はい �1�

CSIN �2a� デフォルト複素数 デフォルト複素数 はい

CDSIN �2b� 倍精度複素数 倍精度複素数 はい �1�

766 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 793: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

ZSIN �2b� 倍精度複素数 倍精度複素数 はい �1�

CQSIN �2b� COMPLEX(16) COMPLEX(16) はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。X が a + bi という形式 (ここで、i = (-1)½) の複素数であるとすると、次のようになります。�2a� abs(b) は 88.7228 以下でなければなりません。a は任意の実数値です。�2b� abs(b) は 709.7827 以下でなければなりません。a は任意の実数値です。

SIND(X) (IBM 拡張)目的

サイン (正弦) 関数です。引数は角度です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値

sin(X) の近似値です。ここで、X は角度の値です。

SIND (90.0) の値は 1.0 です。

特定名 引数の型 結果の型 引数渡し

SIND デフォルト実数 デフォルト実数 はい

DSIND 倍精度実数 倍精度実数 はい

QSIND REAL(16) REAL(16) はい

SINH(X)目的

双曲線サイン関数です。

クラス

エレメント型関数

第 14 章 組み込みプロシージャー 767

Page 794: IBM XL Fortran for Linux, V15.1

引数型および属性X INTENT(IN) REAL F2008 または複素数型。 F2008

結果型および属性

X と同じです。

結果値

結果は、sinh(X) の近似値です。

F2008 X が複素数型の場合、虚数部はラジアンの値であると見なされます。F2008

SINH (1.0) の値は 1.1752012 (近似値) です。

F2008 SINH((1.000000, 0.000000)) の値は (1.175201, 0.000000) (近似値) です。F2008

特定名 引数の型 結果の型 引数渡し

SINH �1� デフォルト実数 デフォルト実数 はい

DSINH �2� 倍精度実数 倍精度実数 はい

QSINH �2� �3� REAL(16) REAL(16) はい

注:�1� abs(X) は 89.4159 以下でなければなりません。�2� abs(X) は 709.7827 以下でなければなりません。�3� IBM 拡張

SIZE(ARRAY, DIM, KIND)目的

指定された次元に沿った配列の範囲、または、配列内のエレメント総数を戻します。

クラス

照会関数

引数型および属性ARRAY

任意のデータ型の配列 TS 29113 または想定ランク・オブジェクト TS 29113 。対応する実引数は、スカラー、関連付けが解除されたポインター、または割り振られていない割り振り可能配列であってはいけません。DIM が指定されており、その値が ARRAY のランクより小さい場合、この実引数は想定サイズ配列であってもかまいません。

DIM (オプション)INTEGER スカラー。その値は、1 ≤ DIM ≤ RANK(ARRAY) の範囲内でな

768 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 795: IBM XL Fortran for Linux, V15.1

ければなりません。 TS 29113 ARRAY がスカラーに関連付けられた想定ラ

ンク・オブジェクトである場合、これは指定できません。 TS 29113

Fortran 2003

KIND (オプション)INTENT(IN) INTEGER スカラー。その値は定数式によって指定する必要があります。

Fortran 2003 の終り

結果型および属性v スカラー整数型です。

Fortran 2003

v KIND が指定されている場合、kind 型パラメーターは、KIND の値で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト整数型のものです。

Fortran 2003 の終り

結果値

結果は、次元 DIM に沿った ARRAY の範囲に等しいか、または、DIM が指定されていない場合は、ARRAY 内の配列エレメントの総数になります。

TS 29113

v ARRAY がスカラーと関連付けられている想定ランク・オブジェクトの場合、結果は 1 になります。

v ARRAY が、想定サイズ配列と関連付けられている想定ランク・オブジェクトである場合、および

– DIM が存在しており、ARRAY のランクと等しい場合、結果は -1 になります。

– DIM が存在していない場合、結果は PRODUCT([(SIZE(ARRAY, I, KIND),

I=1, RANK(ARRAY))]) と等しい負の値になります。

TS 29113

例! A is the array | 1 -4 7 -10 |! | 2 5 -8 11 |! | 3 6 9 -12 |

RES = SIZE( A )! The result is 12 because there are 12 elements in A.

RES = SIZE( A, DIM = 1)! The result is 3 because there are 3 rows in A.

第 14 章 組み込みプロシージャー 769

Page 796: IBM XL Fortran for Linux, V15.1

RES = SIZE( A, DIM = 2)! The result is 4 because there are 4 columns in A.

SIZEOF(A) (IBM 拡張)目的

引数のサイズをバイト数で戻します。

クラス

照会関数

引数型および属性A INTENT(IN) 引数。対応する実引数は、想定サイズ配列であってはいけませ

ん。

結果型および属性

デフォルト整数スカラー。

結果値

バイト数で表した引数のサイズ。

割り振り可能コンポーネントまたは Fortran 90 ポインター・コンポーネントが含まれている派生オブジェクトまたはレコード構造のサイズに含まれるのは、割り振り解除されたオブジェクトまたは関連付けられていないポインター・コンポーネントのサイズのみです (そのコンポーネントが割り振られているか関連付けられている場合であっても、そうです)。

制約事項: SIZEOF を引数としてサブプログラムに渡すことはできません。

次の例では、-qintsize=4 と想定しています。

INTEGER ARRAY(10)INTEGER*8, PARAMETER :: p = 8STRUCTURE /STR/

INTEGER ICOMPLEX C

END STRUCTURERECORD /STR/ RCHARACTER*10 CTYPE DTYPE

INTEGER ARRAY(10)END TYPETYPE (DTYPE) DOBJPRINT *, SIZEOF(ARRAY), SIZEOF (ARRAY(3)), SIZEOF(P) ! Array, array

! element ref,! named constant

PRINT *, SIZEOF (R), SIZEOF(R.C) ! record structure! entity, record! structure! component

770 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 797: IBM XL Fortran for Linux, V15.1

PRINT *, SIZEOF (C(2:5)), SIZEOF(C) ! character! substring,! character! variable

PRINT *, SIZEOF (DOBJ), SIZEOF(DOBJ%ARRAY) ! derived type! object, structure! component

以下に、上記のプログラムによって生成されるサンプル出力を示します。

40 4 816 84 1040 40

関連情報

-qintsize コンパイラー・オプションについて詳しくは、「XL Fortran コンパイラー・リファレンス」を参照してください。

SPACING(X)目的

引数値に近いモデル数値間の絶対間隔を戻します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値

X が 0 でない場合、結果は次のとおりです。

2.0EXPONENT(X) - DIGITS(X)

X が 0 の場合、結果は TINY(X) の結果と同じです。

IBM 拡張

SPACING (3.0) = 2.02 - 24 = 2.0(-22) です。 627ページの『実数データ・モデル』を参照してください。

IBM 拡張 の終り

第 14 章 組み込みプロシージャー 771

Page 798: IBM XL Fortran for Linux, V15.1

SPREAD(SOURCE, DIM, NCOPIES)目的

配列を複製して 1 次元だけ大きい配列を形成します。その際、既存のエレメントがその次元にコピーされます。

クラス

変換関数

引数型および属性SOURCE

INTENT(IN) 引数。対応する実引数は、任意のデータ型の、配列であってもスカラーであってもかまいません。SOURCE のランクの最大値は 19 です。

DIM INTEGER スカラー。その値は、1 ≤ DIM ≤ rank(SOURCE) + 1 の範囲内でなければなりません。他のほとんどの配列組み込み関数とは異なり、SPREAD では DIM 引数は必須です。

NCOPIESINTEGER スカラー。これが、結果に追加される追加次元の範囲になります。

結果型および属性

結果は、階数が rank(SOURCE)+1 で、SOURCE と同じ型および型パラメーターの配列です。

結果値

SOURCE がスカラーの場合、結果は、値が SOURCE の NCOPIES 個のエレメントからなる 1 次元配列です。

SOURCE が配列の場合、結果は、階数が rank(SOURCE) + 1 の配列です。結果の各配列エレメントは、次元 DIM に沿って、SOURCE の対応する配列エレメントに等しくなります。

NCOPIES がゼロ以下の場合、結果はゼロ・サイズの配列です。

例! A is the array (/ -4.7, 6.1, 0.3 /)

RES = SPREAD( A, DIM = 1, NCOPIES = 3 )! The result is | -4.7 6.1 0.3 |! | -4.7 6.1 0.3 |! | -4.7 6.1 0.3 |! DIM=1 extends each column. Each element in RES(:,1)! becomes a copy of A(1), each element in RES(:,2) becomes! a copy of A(2), and so on.

RES = SPREAD( A, DIM = 2, NCOPIES = 3 )! The result is | -4.7 -4.7 -4.7 |! | 6.1 6.1 6.1 |! | 0.3 0.3 0.3 |! DIM=2 extends each row. Each element in RES(1,:)! becomes a copy of A(1), each element in RES(2,:)

772 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 799: IBM XL Fortran for Linux, V15.1

! becomes a copy of A(2), and so on.

RES = SPREAD( A, DIM = 2, NCOPIES = 0 )! The result is (/ /) (a zero-sized array).

SQRT(X)目的

平方根。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL または COMPLEX。X は、COMPLEX ではない場合は、ゼロ

以上の値でなければなりません。

結果型および属性

X と同じです。

結果値v X の平方根と等しい値です。

-qxlf2003=signdzerointr オプションは、 Fortran 2003 動作を使用するかどうかを制御します。「XL Fortran コンパイラー・リファレンス」の『qxlf2003』を参照してください。

v 結果の型が複素数の場合、結果の値は、実数部がゼロ以上の主値です。実数部がゼロの場合、虚数部はゼロ以上です。

Fortran 2003

v 結果の型が複素数の場合、結果の値は、実数部がゼロ以上の主値です。結果の実数部がゼロの場合、虚数部の符号は X の虚数部と同じです。

Fortran 2003 の終り

SQRT (4.0) の値は 2.0 です。

特定名 引数の型 結果の型 引数渡し

SQRT デフォルト実数 デフォルト実数 はい

DSQRT 倍精度実数 倍精度実数 はい

QSQRT REAL(16) REAL(16) はい �1�

CSQRT �2� デフォルト複素数 デフォルト複素数 はい

CDSQRT �2� 倍精度複素数 倍精度複素数 はい �1�

ZSQRT �2� COMPLEX(8) COMPLEX(8) はい �1�

CQSQRT �2� COMPLEX(16) COMPLEX(16) はい �1�

第 14 章 組み込みプロシージャー 773

Page 800: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

注:�1� IBM 拡張: 名前を引数として渡すことができます。�2� X が a + bi という形式 (ここで、i = (-1)½) の複素数であるとすると、abs(X) +

abs(a) は 1.797693 * 10308 以下でなければなりません

SRAND(SEED) (IBM 拡張)目的

乱数発生関数 RAND が使用するシード値を供給します。この組み込みサブルーチンは、推奨されません。標準に準拠する RANDOM_NUMBER(HARVEST) 組み込みサブルーチンを使用してください。

クラス

サブルーチン

引数型および属性SEED

v RAND 関数にシード値を提供するために使用するときの INTENT(IN)

REAL(4) スカラー

v IRAND サービスおよびユーティリティー関数にシード値を提供するために使用するときの INTENT(IN) INTEGER(4) スカラー

SRAND サブルーチンを使用した次のサンプル・プログラムを参照してください。

CALL SRAND(0.5)DO I = 1, 5

R = RAND()PRINT *,R

ENDDOEND

以下に、上記のプログラムによって生成されるサンプル出力を示します。

0.39843750000.40484619140.16448974610.1281738281E-010.2313232422E-01

STORAGE_SIZE (A, KIND) (Fortran 2008)目的

動的型および A の型パラメーターを持つ配列のエレメントのストレージ・サイズ(ビット単位) を戻します。

クラス

照会関数

774 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 801: IBM XL Fortran for Linux, V15.1

引数型および属性A 任意の型のデータ・オブジェクト。

A がポリモアフィックである場合、未定義のポインターにすることはできません。A が無制限のポリモアフィックであるか、または任意の据え置き型パラメーターを持つ場合、割り振られていない割り振り可能変数にすることも、関連付けが解除されたポインターまたは未定義のポインターにすることもできません。

KIND (オプション)INTENT(IN) スカラー INTEGER。 KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 結果は、整数型のスカラーです。

v KIND が指定されている場合、kind 型パラメーターは、KIND で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト整数型のものです。

結果値

結果値は、動的型および A の型パラメーターを持つ配列のエレメントのストレージ・サイズ (ビット単位) です。

以下の例は、i がデフォルトの整数サイズの値を割り当てられていることを示しています。

PROGRAM main

IMPLICIT NONE

INTEGER i, j

i = STORAGE_SIZE(j)PRINT i

END

SUM(ARRAY, DIM, MASK) または SUM(ARRAY, MASK)目的

配列内の選択されたエレメントの合計を計算します。

クラス

変換関数

引数型および属性ARRAY

エレメントの合計を求めたい NUMERIC 配列。

第 14 章 組み込みプロシージャー 775

Page 802: IBM XL Fortran for Linux, V15.1

DIM (オプション)INTEGER スカラー。その値は、1 ≤ DIM ≤ rank(ARRAY) の範囲内でなければなりません。

MASK (オプション)論理式です。配列である場合、ARRAY と適合する形状でなければなりません。MASK がスカラーである場合、そのスカラー値が ARRAY のすべてのエレメントに適用されます。

結果値

DIM が指定されている場合、結果は、階数が rank(ARRAY)-1 の配列になり、データ型と kind 型パラメーターは ARRAY と同じです。DIM が指定されていない場合、または、MASK の階数が 1 の場合、結果はスカラーです。

結果は、次のいずれかの方式で計算されます。

方式 1:ARRAY のみが指定されている場合、結果は、ARRAY のすべての配列エレメントの合計に等しくなります。ARRAY がゼロ・サイズ配列の場合、結果はゼロになります。

方式 2:ARRAY と MASK の両方が指定されている場合、結果は、 MASK 内で対応するエレメントが .TRUE. 値になっている ARRAY の配列エレメントの合計です。MASK のどのエレメントの値も .TRUE. ではない場合、結果はゼロになります。

方式 3:DIM も指定されている場合、結果値は、MASK 内で対応する配列エレメントが真になっている ARRAY の配列エレメントを次元 DIM に沿って合計した値です。

DIM と MASK はどちらもオプションなので、引数のさまざまな組み合わせが可能です。-qintlog オプションが 2 つの引数と共に指定されている場合、2 番目の引数は、次のいずれかを指します。

v 整数型、論理型、バイト型、または型なしの配列であれば、MASK

v 整数型、バイト型、または型なしのスカラーであれば、DIM

v 論理型スカラーであれば、MASK

方式 1:

! Sum all the elements in an array.RES = SUM( (/2, 3, 4 /) )

! The result is 9 because (2+3+4) = 9

方式 2:

! A is the array (/ -3, -7, -5, 2, 3 /)! Sum all elements that are greater than -5.

RES = SUM( A, MASK = A .GT. -5 )! The result is 2 because (-3 + 2 + 3) = 2

776 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 803: IBM XL Fortran for Linux, V15.1

方式 3:

! B is the array | 4 2 3 |! | 7 8 5 |

! Sum the elements in each column.RES = SUM(B, DIM = 1)

! The result is | 11 10 8 | because (4 + 7) = 11! (2 + 8) = 10! (3 + 5) = 8

! Sum the elements in each row.RES = SUM(B, DIM = 2)

! The result is | 9 20 | because (4 + 2 + 3) = 9! (7 + 8 + 5) = 20

! Sum the elements in each row, considering only! those elements greater than two.

RES = SUM(B, DIM = 2, MASK = B .GT. 2)! The result is | 7 20 | because (4 + 3) = 7! (7 + 8 + 5) = 20

SYSTEM(CMD, RESULT) (IBM 拡張)目的

実行のためにコマンドをオペレーティング・システムに渡します。現行プロセスは、そのコマンドが完了して、制御がオペレーティング・システムから戻るまで一時停止します。このサブルーチンにオプションの引数を追加すると、オペレーティング・システムからの戻りコード情報のリカバリーを実行できます。

クラス

サブルーチン

引数型および属性CMD INTENT(IN) CHARACTER スカラー。これは実行するコマンドと任意のコマン

ド行引数を指定します。

RESULT (オプション)INTENT(OUT) INTEGER(4) スカラー。この引数が INTEGER(4) 変数でない場合、コンパイラーは (S) レベルのエラー・メッセージを生成します。RESULT に戻される情報のフォーマットは、wait システム呼び出しで戻されるものと同じです。

例INTEGER ULIMITCHARACTER(32) CMD...

! Check the system ulimit.CMD = 'ulimit > ./fort.99'CALL SYSTEM(CMD)READ(99, *) ULIMITIF (ULIMIT .LT. 2097151) THEN

...

INTEGER RCRC=99CALL SYSTEM("/bin/test 1 -EQ 2",RC)IF (IAND(RC,'ff'z) .EQ. 0) then

第 14 章 組み込みプロシージャー 777

Page 804: IBM XL Fortran for Linux, V15.1

RC = IAND( ISHFT(RC,-8), 'ff'z )ELSE

RC = -1ENDIF

SYSTEM_CLOCK(COUNT, COUNT_RATE, COUNT_MAX)目的

リアルタイム・クロックから数値データを戻します。

クラス

サブルーチン

引数型および属性COUNT (オプション)

INTENT(OUT) INTEGER。COUNT の初期値は、プロセッサー・クロックの現行値に依存し、範囲は 0 から COUNT_MAX までです。COUNT は、COUNT_MAX 値になるまで各クロック・カウントごとに 1 ずつ増分されます。COUNT_MAX の次のクロック・カウントで、COUNT の値はゼロにリセットされます。

COUNT_RATE (オプション)INTENT(OUT) INTEGER または REAL スカラー。デフォルトである 100 分の1 秒のレゾリューションを使用する場合、COUNT_RATE は、プロセッサー・クロックの 1 秒当たりのカウント数を指すか、または、クロックがない場合はゼロになります。

-qsclk=micro を使用してレゾリューションをマイクロ秒と指定すると、COUNT_RATE の値は、1 秒当たり 1 000 000 クロック・カウントになります。

COUNT_MAX (オプション)INTENT(OUT) INTEGER スカラー。デフォルトである 100 分の 1 秒のレゾリューションを使用する場合、COUNT_MAX は、プロセッサー・クロックの最大クロック・カウント数です。

-qsclk=micro を使用してマイクロ秒のレゾリューションを指定し、COUNT_MAX の型が INTEGER(4) である場合、COUNT_MAX の値は 1 799 999 999 クロック・カウント (約 30 分) です。

-qsclk=micro を使用してマイクロ秒のレゾリューションを指定し、COUNT_MAX の型が INTEGER(8) の場合、COUNT_MAX の値は 86 399

999 999 クロック・カウント (約 24 時間) です。

次の例では、クロックは 24 時間クロックです。SYSTEM_CLOCK が呼び出された後、COUNT には、1 秒当たりのクロックの刻みの数で表した時刻が入っています。1 秒当たりの刻みの数は、COUNT_RATE に入っています。COUNT_RATE 値は、インプリメンテーションに依存します。

INTEGER, DIMENSION(8) :: IVTIME_SYNC: DOCALL DATE_AND_TIME(VALUES=IV)

778 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 805: IBM XL Fortran for Linux, V15.1

IHR = IV(5)IMIN = IV(6)ISEC = IV(7)CALL SYSTEM_CLOCK(COUNT=IC, COUNT_RATE=IR, COUNT_MAX=IM)CALL DATE_AND_TIME(VALUES=IV)

IF ((IHR == IV(5)) .AND. (IMIN == IV(6)) .AND. &(ISEC == IV(7))) EXIT TIME_SYNC

END DO TIME_SYNC

IDAY_SEC = 3600*IHR + IMIN*60 + ISECIDAY_TICKS = IDAY_SEC * IR

IF (IDAY_TICKS /= IC) THENSTOP 'clock error'

ENDIFEND

TAN(X)目的

タンジェント関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL F2008 または複素数型。 F2008

結果型および属性

X と同じです。

結果値

結果は、tan(X) の近似値です。

v X が実数型の場合、ラジアンの値であると見なされます。

v F2008 X が複素数型の場合、実数部はラジアンの値であると見なされます。F2008

TAN (1.0) の値は 1.5574077 (近似値) です。

F2008 TAN((1.000000, 0.000000)) の値は (1.557408, 0.000000) (近似値) です。F2008

特定名 引数の型 結果の型 引数渡し

TAN デフォルト実数 デフォルト実数 はい

DTAN 倍精度実数 倍精度実数 はい

QTAN REAL(16) REAL(16) はい �1�

第 14 章 組み込みプロシージャー 779

Page 806: IBM XL Fortran for Linux, V15.1

特定名 引数の型 結果の型 引数渡し

注:�1� IBM 拡張: 名前を引数として渡すことができます。

TAND(X) (IBM 拡張)目的

タンジェント関数です。引数は角度です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL

結果型および属性

X と同じです。

結果値

結果は tan(X) の近似値です。ここで、X は角度の値です。

TAND (45.0) の値は 1.0 です。

特定名 引数の型 結果の型 引数渡し

TAND デフォルト実数 デフォルト実数 はい

DTAND 倍精度実数 倍精度実数 はい

QTAND REAL(16) REAL(16) はい

TANH(X)目的

双曲線タンジェント関数です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL F2008 または複素数型。 F2008

結果型および属性

X と同じです。

780 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 807: IBM XL Fortran for Linux, V15.1

結果値

結果は tanh(X) の近似値です。

F2008 X が複素数型の場合、虚数部はラジアンの値であると見なされます。F2008

TANH (1.0) の値は 0.76159416 (近似値) です。

F2008 TANH((1.000000, 0.000000)) の値は (0.761594, 0.000000) (近似値) です。F2008

特定名 引数の型 結果の型 引数渡し

TANH デフォルト実数 デフォルト実数 はい

DTANH 倍精度実数 倍精度実数 はい

QTANH REAL(16) REAL(16) はい �1�

注:�1� IBM 拡張: 名前を引数として渡すことができます。

TINY(X)目的

引数と同じ型および kind 型パラメーターの数値を表すモデルでの最小の正の数を戻します。

クラス

照会関数

引数型および属性X INTENT(IN) 実数。対応する実引数は、スカラーであっても配列となりま

す。

結果型および属性

X と同じ型および kind 型パラメーターのスカラー。

結果値

結果は次のとおりです。

実数 X に対して、2.0(MINEXPONENT(X)-1)

TINY (X) = float(2)(-126) = 1.17549351e-38 です。 627ページの『実数データ・モデル』を参照してください。

第 14 章 組み込みプロシージャー 781

Page 808: IBM XL Fortran for Linux, V15.1

TRAILZ(I) (Fortran 2008)目的

整数の 2 進表記における末尾ゼロ・ビットの数を戻します。

クラス

エレメント型関数

引数型および属性I INTENT(IN) INTEGER

結果型および属性

I と同じです。

結果値

結果は、I の右端にある 1 のビットの右側にある、ゼロのビットの数です。I の値がゼロの場合、結果は BIT_SIZE(I) となります。

例I = TRAILZ(0_4) ! I=32J = TRAILZ(4_4) ! J=2K = TRAILZ(-1) ! K=0M = TRAILZ(0_8) ! M=64N = TRAILZ(1_8) ! N=0

関連情報v 649ページの『BIT_SIZE(I)』

v 703ページの『LEADZ(I) (Fortran 2008)』

TRANSFER(SOURCE, MOLD, SIZE)目的

物理表現は SOURCE と同一だが MOLD の型と型パラメーターで解釈された結果を戻します。

符号拡張、丸め、ブランク埋め込み、あるいは、他の変換方法を使用した場合は行われる可能性のあるその他の変換を行わずに、型の低レベル変換を実行します。

クラス

変換関数

引数型および属性SOURCE

ビット単位の値を異なる型に変換したいデータ・エンティティー。型は任意であり、スカラーでも配列でもかまいません。

MOLD結果に望む型特性を持つデータ・エンティティー。MOLD に対応する実引

782 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 809: IBM XL Fortran for Linux, V15.1

数が変数である場合、その値を定義する必要はありません。この実引数は、任意の型でかまいません。また、スカラーであっても配列であってもかまいません。この実引数の値は使用されず、この実引数の型特性のみが使用されます。

SIZE (オプション)出力結果のエレメント数。スカラー整数でなければなりません。対応する実引数は、オプションの仮引数であってはなりません。

結果型および属性

MOLD と同じ型と型パラメーター。

MOLD がスカラーであり、SIZE が指定されていない場合、結果はスカラーです。

MOLD が配列値であり、SIZE が指定されていない場合、結果は、 SOURCE を保持するのに物理的に十分な範囲で可能な最小サイズの、階数 1 の配列です。

SIZE が指定されている場合、結果は、階数が 1、サイズが SIZE の配列値です。

結果値

結果の物理表現は SOURCE と同じで、結果の方が小さい場合は切り捨てられ、結果の方が大きい場合の末尾部分は未定義です。

物理表現は変わらないので、結果が切り捨てられていない限り、 TRANSFER の結果を元に戻すことが可能です。

REAL(4) X /3.141/DOUBLE PRECISION I, J(6) /1,2,3,4,5,6/

! Because x is transferred to a larger representation! and then back, its value is unchanged.

X = TRANSFER( TRANSFER( X, I ), X )

! j is transferred into a real(4) array large enough to! hold all its elements, then back into an array of! its original size, so its value is unchanged too.

J = TRANSFER( TRANSFER( J, X ), J, SIZE=SIZE(J) )

TRANSFER (1082130432, 0.0) は 4.0 です。

TRANSFER ((/1.1,2.2,3.3/), (/(0.0,0.0)/)) は、複素数で階数 1、長さ 2 の配列であり、最初のエレメントの値は (1.1, 2.2)、2 番目のエレメントの実数部の値は 3.3 です。2 番目のエレメントの虚数部は未定義です。

TRANSFER ((/1.1,2.2,3.3/), (/(0.0,0.0)/), 1) の値は (/(1.1,2.2)/) です。

TRANSPOSE(MATRIX)目的

2 次元配列の各列を行に、各行を列に入れ換えます。

第 14 章 組み込みプロシージャー 783

Page 810: IBM XL Fortran for Linux, V15.1

クラス

変換関数

引数型および属性MATRIX

任意のデータ型のランク 2 の配列。

結果値

結果は、データ型と型パラメーターが MATRIX と同じである 2 次元配列です。

結果の形状は、MATRIX の形状を (m,n) とすると、(n,m) です。例えば、MATRIX

の形状が (2,3) の場合、結果の形状は (3,2) です。

結果の各エレメント (i,j) の値は MATRIX (j,i) です。ここで、i の範囲は 1-n であり、j の範囲は 1-m です。

結果型および属性

MATRIX と同じデータ型と型パラメーターの 2 次元配列。

例! A is the array | 0 -5 8 -7 |! | 2 4 -1 1 |! | 7 5 6 -6 |! Transpose the columns and rows of A.

RES = TRANSPOSE( A )! The result is | 0 2 7 |! | -5 4 5 |! | 8 -1 6 |! | -7 1 -6 |

TRIM(STRING)目的

末尾ブランク文字を除去した引数を戻します。

クラス

変換関数

引数型および属性STRING

INTENT(IN) CHARACTER スカラー

結果型および属性

kind 型パラメーターが STRING と同じで、長さが STRING の長さよりも STRING

内の末尾ブランクの数だけ少ない文字。

784 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 811: IBM XL Fortran for Linux, V15.1

結果値v 結果の値は、末尾ブランクが除去されることを除いて、STRING と同じです。

v STRING 中に非ブランク文字がない場合、結果はゼロ長です。

TRIM (' A B ') の値は、' A B' になります。

UBOUND(ARRAY, DIM, KIND)目的

配列の各次元の上限または指定された次元の上限を戻します。

クラス

照会関数

引数型および属性ARRAY

上限を判別したい配列。この配列の境界が定義されている必要があります。つまり、対応する実引数は、関連付けが解除されたポインターや割り振られていない割り振り可能な配列であってはならず、この配列のサイズが想定サイズである場合は、1 つの次元のみを調べることができます。ARRAY が想定サイズ配列である場合、DIM が指定され、その値は ARRAY のランクより小さい値である必要があります。

DIM (オプション)INTEGER スカラー。その値は、1 ≤ DIM ≤ RANK(ARRAY) の範囲内でなければなりません。対応する実引数は、オプションの仮引数であってはなり

ません。 TS 29113 ARRAY がスカラーに関連付けられた想定ランク・オブ

ジェクトである場合、DIM 引数は指定できません。 TS 29113

KIND (オプション)INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

結果型および属性v 結果は整数型です。

v KIND が指定されている場合、kind 型パラメーターは、KIND の値で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルトの整数型のものです。

v DIM が指定されている場合、結果はスカラーです。指定されていない場合、結果は、ARRAY の各次元ごとにエレメントが 1 つある 1 次元配列です。

vTS 29113 ARRAY がスカラーに関連付けられた想定ランク・オブジェクトである

場合、結果はゼロ・サイズ配列です。 TS 29113

vTS 29113 ARRAY が、想定サイズ配列に関連付けられた想定ランク・オブジェクトである場合、UBOUND(ARRAY, RANK(ARRAY), KIND) の結果は、

第 14 章 組み込みプロシージャー 785

Page 812: IBM XL Fortran for Linux, V15.1

LBOUND(ARRAY, RANK(ARRAY), KIND) から 2 を減算した値と等しくなります。このコンテキストで、KIND が UBOUND(ARRAY, RANK(ARRAY),

KIND) について省略される場合、KIND は、対応する LBOUND(ARRAY,

RANK(ARRAY), KIND) についても省略されます。 TS 29113

結果値

結果の各エレメントが、ARRAY の 1 つの次元に対応します。これらの値は、ARRAY が全体的な配列または配列構造コンポーネントである場合、上限に等しくなります。ARRAY が全体的な配列または配列構造コンポーネントではない配列セクションまたは式である場合、これらの値は、各次元のエレメント数を表し、元の配列の宣言された上限とは異なる可能性があります。ゼロ・サイズの次元がある場合、結果内の対応するエレメントは、上限の値に関係なくゼロです。

例! This array illustrates the way UBOUND works with! different ranges for dimensions.

REAL A(1:10, -4:5, 4:-5)

RES=UBOUND( A )! The result is (/ 10, 5, 0 /).

RES=UBOUND( A(:,:,:) )! The result is (/ 10, 10, 0 /) because the argument! is an array section.

RES=UBOUND( A(4:10,-4:1,:) )! The result is (/ 7, 6, 0 /), because for an array section,! it is the number of elements in the corresponding dimensions.

UNPACK(VECTOR, MASK, FIELD)目的

1 次元配列から一部またはすべてのエレメントを取り出し、別の配列 (より大きい配列) に再配置します。

クラス

変換関数

引数型および属性VECTOR

任意のデータ型の 1 次元配列。VECTOR のエレメント数は、MASK 内の.TRUE. 値の数以上でなければなりません。

MASK LOGICAL 配列。これは VECTOR のエレメントがアンパックされた場合に置かれる場所を決定します。

FIELD形状は MASK 引数と同じであり、データ型および型パラメーターはVECTOR と同じである引数。これのエレメントが、対応する MASK エレメントの値が .FALSE. になっていれば、結果配列に挿入されます。

786 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 813: IBM XL Fortran for Linux, V15.1

結果値

結果のエレメントが、配列エレメント順序で埋められていきます。MASK 内の対応するエレメントが .TRUE. である場合、結果エレメントには VECTOR の次のエレメントが入り、それ以外の場合は、FIELD の対応するエレメントが入ります。

結果型および属性

MASK と同じ形状で VECTOR と同じデータ型および型パラメーターの配列。

例! VECTOR is the array (/ 5, 6, 7, 8 /),! MASK is | F T T |, FIELD is | -1 -4 -7 |! | T F F | | -2 -5 -8 |! | F F T | | -3 -6 -9 |

! Turn the one-dimensional vector into a two-dimensional! array. The elements of VECTOR are placed into the .TRUE.! positions in MASK, and the remaining elements are! made up of negative values from FIELD.

RES = UNPACK( VECTOR, MASK, FIELD )! The result is | -1 6 7 |! | 5 -5 -8 |! | -3 -6 8 |

! Do the same transformation, but using all zeros for the! replacement values of FIELD.

RES = UNPACK( VECTOR, MASK, FIELD = 0 )! The result is | 0 6 7 |! | 5 0 0 |! | 0 0 8 |

VERIFY(STRING, SET, BACK, KIND)目的

文字のセットに、1 つのストリング中のすべての文字が含まれていることを検査します。そのために、指定された文字のセットに含まれていない文字が文字ストリング内で最初に出現する位置を識別します。

クラス

エレメント型関数

引数型および属性STRING

INTENT(IN) CHARACTER

SET STRING と同じ kind 型パラメーターの INTENT(IN) CHARACTER。

BACK (オプション)INTENT(IN) LOGICAL

KIND (オプション)INTENT(IN) INTEGER スカラー。KIND に対応する実引数は、定数式である必要があります。

第 14 章 組み込みプロシージャー 787

Page 814: IBM XL Fortran for Linux, V15.1

結果型および属性v 整数型です。

v KIND が指定されている場合、kind 型パラメーターは、KIND の値で指定されたものです。それ以外の場合、kind 型パラメーターは、デフォルト整数型のものです。

結果値v ケース (i): BACK が指定されていないか、値 .FALSE. で指定されている場合で、 SET 中にない文字が STRING に少なくとも 1 字は含まれている場合、結果の値は、SET 中にない文字で STRING 内の一番左にある文字の位置です。

v ケース (ii): BACK が指定されていて、その値が .TRUE. であり、 SET にない文字が STRING に少なくとも 1 字は含まれている場合、結果の値は、SET 中にない文字で STRING 内の一番右にある文字の位置です。

v ケース (iii): STRING 内のすべての文字が SET に含まれているか、STRING がゼロ長である場合、結果の値はゼロです。

例v ケース (i): VERIFY ('ABBA', 'A') の値は 2 です。

v ケース (ii): VERIFY ('ABBA', 'A', BACK = .TRUE.) の値は 3 です。

v ケース (iii): VERIFY ('ABBA', 'AB') の値は 0 です。

788 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 815: IBM XL Fortran for Linux, V15.1

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張)

このセクションでは、ハードウェア固有の組み込み関数をアルファベット順に解説します。これらの組み込み関数の多くがアクセスするハードウェア命令は、使用法によっては、IEEE の浮動小数点に関する意味的規則に完全には準拠しないこともあります。IEEE 浮動小数点規則に厳密に準拠することがアプリケーションにとって重要である場合は、注意が必要です。組み込みプロシージャーは、そうではないと注記されていない限り、サポートされるすべてのハードウェアで機能します。

暗号化のプロシージャー

拡張暗号化標準のプロシージャー

VCIPHER(STATE_ARRAY, ROUND_KEY)目的

連邦情報処理標準 Publication 197 (FIPS-197) で定義された AES 暗号操作の 1 ラウンドを、指定された ROUND_KEY を使用して中間状態 STATE_ARRAY に対して実行します。

クラス

エレメント型関数

引数型および属性

STATE_ARRAYINTENT(IN) UNSIGNED(1) ベクトル。

ROUND_KEYINTENT(IN) UNSIGNED(1) ベクトル。

結果の型および属性

UNSIGNED(1) ベクトル。

結果値

結果の中間状態を返します。

VCIPHERLAST(STATE_ARRAY, ROUND_KEY)目的

連邦情報処理標準 Publication 197 (FIPS-197) で定義された AES 暗号操作の最終ラウンドを、指定された ROUND_KEY を使用して中間状態 STATE_ARRAY に対して実行します。

© Copyright IBM Corp. 1996, 2015 789

Page 816: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性

STATE_ARRAYINTENT(IN) UNSIGNED(1) ベクトル。

ROUND_KEYINTENT(IN) UNSIGNED(1) ベクトル。

結果の型および属性

UNSIGNED(1) ベクトル。

結果値

結果として得られる最終状態を返します。

VNCIPHER(STATE_ARRAY, ROUND_KEY)目的

連邦情報処理標準 Publication 197 (FIPS-197) で定義された AES 逆暗号操作の 1

ラウンドを、指定された ROUND_KEY を使用して中間状態 STATE_ARRAY に対して実行します。

クラス

エレメント型関数

引数型および属性

STATE_ARRAYINTENT(IN) UNSIGNED(1) ベクトル。

ROUND_KEYINTENT(IN) UNSIGNED(1) ベクトル。

結果の型および属性

UNSIGNED(1) ベクトル。

結果値

結果の中間状態を返します。

VNCIPHERLAST (STATE_ARRAY, ROUND_KEY)目的

連邦情報処理標準 Publication 197 (FIPS-197) で定義された AES 逆暗号操作の最終ラウンドを、指定された ROUND_KEY を使用して中間状態 STATE_ARRAY に対して実行します。

790 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 817: IBM XL Fortran for Linux, V15.1

クラス

エレメント型関数

引数型および属性

STATE_ARRAYINTENT(IN) UNSIGNED(1) ベクトル。

ROUND_KEYINTENT(IN) UNSIGNED(1) ベクトル。

結果の型および属性

UNSIGNED(1) ベクトル。

結果値

結果として得られる最終状態を返します。

VSBOX(STATE_ARRAY)目的

指定された STATE_ARRAY に対して SubBytes 演算を実行します。この演算は、連邦情報処理標準 Publication 197 (FIPS-197) で定義されています。

クラス

エレメント型関数

引数型および属性

STATE_ARRAYINTENT(IN) UNSIGNED(1) ベクトル。

結果の型および属性

UNSIGNED(1) ベクトル。

結果値

演算の結果を返します。

セキュア・ハッシュ・アルゴリズムのプロシージャー

VSHASIGMAD(X, TYPE, MASK)目的

セキュア・ハッシュ標準の仕様書である、連邦情報処理標準資料 FIPS-180-3 のサポートを提供します。

クラス

エレメント型関数

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 791

Page 818: IBM XL Fortran for Linux, V15.1

引数型および属性

X INTENT(IN) UNSIGNED(8) ベクトル。

TYPE INTENT(IN) 整数。対応する実引数は、0 または 1 の値を持つ定数式である必要があります。TYPE によって、関数型が選択されます (これは小文字のシグマであっても大文字のシグマであってもかまいません)。

MASK INTENT(IN) 整数。対応する実引数は、0 から 15 の範囲内の値を持つ定数式である必要があります。MASK によって、関数のサブタイプが選択されます (これは sigma-0 であっても sigma-1 であってもかまいません)。

結果の型および属性

UNSIGNED(8) ベクトル。

結果値

X の各エレメント i (i=0,1) について、戻り値のエレメント i は、以下の結果SHA-512 関数です。

v TYPE が 0 であり、MASK のビット 2*i が 0 である場合、結果の SHA-512 関数は sigma0(X(i)) です。

v TYPE が 0 であり、MASK のビット 2*i が 1 である場合、結果の SHA-512 関数は sigma1(X(i)) です。

v TYPE がゼロ以外であり、MASK のビット 2*i が 0 である場合、結果のSHA-512 関数は Sigma0(X(i)) です。

v TYPE がゼロ以外であり、MASK のビット 2*i が 1 である場合、結果のSHA-512 関数は Sigma1(X(i)) です。

VSHASIGMAW(X, TYPE, MASK)目的

セキュア・ハッシュ標準の仕様書である、連邦情報処理標準資料 FIPS-180-3 のサポートを提供します。

クラス

エレメント型関数

引数型および属性

X An INTENT(IN) UNSIGNED(4) vector.

TYPE INTENT(IN) 整数。対応する実引数は、0 または 1 の値を持つ定数式である必要があります。TYPE によって、関数型が選択されます (これは小文字のシグマであっても大文字のシグマであってもかまいません)。

MASK INTENT(IN) 整数。対応する実引数は、0 から 15 の範囲内の値を持つ定数式である必要があります。MASK によって、関数のサブタイプが選択されます (これは sigma-0 であっても sigma-1 であってもかまいません)。

結果の型および属性

UNSIGNED(4) ベクトル。

792 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 819: IBM XL Fortran for Linux, V15.1

結果値

X の各エレメント i (i=0,1,2,3) について、戻り値のエレメント i は、以下の結果SHA-256 関数です。

v TYPE が 0 であり、MASK のビット i が 0 である場合、結果の SHA-256 関数は sigma0(x(i)) です。

v TYPE が 0 であり、MASK のビット i が 1 である場合、結果の SHA-256 関数は sigma1(x(i)) です。

v TYPE がゼロ以外であり、MASK のビット i が 0 である場合、結果の SHA-256

関数は Sigma0(x(i)) です。

v TYPE がゼロ以外であり、MASK のビット i が 1 である場合、結果の SHA-256

関数は Sigma1(x(i)) です。

その他のプロシージャー

VPERMXOR(A, B, MASK)目的

2 つのバイト・ベクトルに対して、順序を変える、排他 OR 演算を適用します。

クラス

エレメント型関数

引数型および属性

A INTENT(IN) UNSIGNED(1) ベクトル。

B INTENT(IN) UNSIGNED(1) ベクトル。

MASK INTENT(IN) UNSIGNED(1) ベクトル。

結果の型および属性

UNSIGNED(1) ベクトル。

結果値

それぞれの i (0 <= i < 16) について、indexA を MASK のバイト・エレメント i

のビット 0 から 3 になるようにして、indexB を MASK のバイト・エレメント i

のビット 4 から 7 になるようにします。

結果のバイト・エレメント i は、A のバイト・エレメント indexA と B のバイト・エレメント indexB の排他 OR に設定されます。

関連情報:

-qaltivec

ベクトル・エレメント順序の切り替え

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 793

Page 820: IBM XL Fortran for Linux, V15.1

VPMSUMB(A, B)目的

対応するエレメントの多項式乗算結果の、偶数/奇数の各ペアに、排他 OR 演算を実行します。

クラス

エレメント型関数

引数型および属性

A INTENT(IN) UNSIGNED(1) ベクトル。

B INTENT(IN) UNSIGNED(1) ベクトル。

結果の型および属性

UNSIGNED(1) ベクトル。

結果値

それぞれの i (0 <= i < 16) について、prod(i) を、A および B のバイト・エレメント i の多項式乗算の結果になるようにします。

それぞれの i (0 <= i < 8) について、結果の各ハーフワード・エレメント i は次のように設定されます。

v ビット 0 は、0 に設定されます。

v ビット 1 から 15 は prod(2*i) (xor) prod(2*i+1) に設定されます。

VPMSUMD(A, B)目的

対応するエレメントの多項式乗算結果の、偶数/奇数の各ペアに、排他 OR 演算を実行します。

クラス

エレメント型関数

引数型および属性

A INTENT(IN) UNSIGNED(8) ベクトル。

B INTENT(IN) UNSIGNED(8) ベクトル。

結果の型および属性

UNSIGNED(8) ベクトル。

結果値

それぞれの i (0 <= i < 2) について、prod(i) を、A および B のダブルワード・エレメント i の多項式乗算の結果になるようにします。

794 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 821: IBM XL Fortran for Linux, V15.1

結果のビット 0 は、0 に設定されます。

結果のビット 1 から 127 は prod(0) (xor) prod(1) に設定されます。

VPMSUMH(A, B)目的

対応するエレメントの多項式乗算結果の、偶数/奇数の各ペアに、排他 OR 演算を実行します。

クラス

エレメント型関数

引数型および属性

A INTENT(IN) UNSIGNED(2) ベクトル。

B INTENT(IN) UNSIGNED(2) ベクトル。

結果の型および属性

UNSIGNED(2) ベクトル。

結果値

それぞれの i (0 <= i < 8) について、prod(i) を、A および B のハーフワード・エレメント i の多項式乗算の結果になるようにします。

それぞれの i (0 <= i < 4) について、結果の各ワード・エレメント i は次のように設定されます。

v ビット 0 は、0 に設定されます。

v ビット 1 から 31 は prod(2*i) (xor) prod(2*i+1) に設定されます。

VPMSUMW(A, B)目的

対応するエレメントの多項式乗算結果の、偶数/奇数の各ペアに、排他 OR 演算を実行します。

クラス

エレメント型関数

引数型および属性

A INTENT(IN) UNSIGNED(4) ベクトル。

B INTENT(IN) UNSIGNED(4) ベクトル。

結果の型および属性

UNSIGNED(4) ベクトル。

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 795

Page 822: IBM XL Fortran for Linux, V15.1

結果値

それぞれの i (0 <= i < 4) について、prod(i) を、A および B のワード・エレメント i の多項式乗算の結果になるようにします。

それぞれの i (0 <= i < 2) について、結果の各ダブルワード・エレメント i は次のように設定されます。

v ビット 0 は、0 に設定されます。

v ビット 1 から 63 は prod(2*i) (xor) prod(2*i+1) に設定されます。

BPERMD(MASK, SOURCE)目的

ビット置換ダブルワード

ビット置換演算の結果を返します。

クラス

関数

引数型および属性MASK INTENT(IN) INTEGER(8)

SOURCEINTENT(IN) INTEGER(8)

結果型および属性

結果は INTEGER(8) です。

結果値

8 ビットが戻され、各ビットは、SOURCE 内の 1 ビットに対応します。この 8 ビットは、MASK の 1 バイトによって選択されたものです。MASK のバイト i が 64

よりも小さい場合、置換対象ビット i は、 MASK のバイト i が指定するソースのビットに設定されます。64 以上の場合、置換対象ビット i は 0 に設定されます。置換対象ビットは、結果値の最下位バイト内に配置され、残りのビットは 0 で埋められます。

MASK のバイト 2 の値が 53 であり、64 より小さい場合には、SOURCE 内のビット 53 が RES のビット 2 にコピーされます。MASK のバイト 4 の値が 68 であり、64 より大きい場合は、0 が RES のビット 4 にコピーされます。

INTEGER(8) :: MASK, SOURCE, RESRES = BPERMD(MASK, SOURCE)END

796 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 823: IBM XL Fortran for Linux, V15.1

CMPB(X,Y)目的

バイトの比較

8 バイトの X の各バイトを、Y の対応するバイトと比較します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER(8)

Y INTENT(IN) INTEGER(8)

結果型および属性

結果は INTEGER(8) です。

結果値

X のバイト i と Y のバイト i が等しければ、結果の対応するバイトに 0xFF が設定され、等しくなければ、結果の対応するバイトに 0x00 が設定されます。

.

INTEGER(8) :: X, Y, RESX = 11259375 ! X = 0xABCDEFY = 11268045 ! Y = 0xABEFCDRES = CMPB ( X, Y ) ! RES = 0xFF0000END

DIVDE(X,Y)目的

ダブルワード拡張除算

ダブルワード拡張除算の結果を戻します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER(8)

Y INTENT(IN) INTEGER(8)

結果型および属性

結果は INTEGER(8) です。

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 797

Page 824: IBM XL Fortran for Linux, V15.1

結果値

結果は、X/Y に等しい値です。

注: 除算の結果が 32 ビットよりも大きい場合、または除数が 0 の場合、関数の戻り値は未定義になります。

DIVWE(X,Y)目的

ワード拡張除算

ワード拡張除算の結果を戻します。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER(4)

Y INTENT(IN) INTEGER(4)

結果型および属性

結果は INTEGER(4) です。

結果値

結果は、X/Y に等しい値です。

注: 除数が 0 (ゼロ) の場合、関数の戻り値は未定義になります。

FCFI(I)目的

整数から浮動小数点への変換

浮動小数点変数に入っている整数値を浮動小数点値に変換します。

注: FCFI は FCFID の別名です。詳しくは、 799ページの『FCFID(I)』 を参照してください。

クラス

関数

引数型および属性I INTENT(IN) REAL(8)

798 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 825: IBM XL Fortran for Linux, V15.1

結果型および属性

結果は REAL(8) です。

結果値

I の倍精度浮動小数点値。

例...REAL*8 :: R8, RESINTEGER*8 :: I8EQUIVALENCE(R8, I8)

I8 = 89RES = FCFI(R8) ! RES = 89.0...

FCFID(I)目的

符号付き整数のダブルワードから浮動小数点への変換

ダブルワードで格納されている 64 ビット符号付き整数を倍精度浮動小数点値に変換します。

注: FCFID(I) は 798ページの『FCFI(I)』 の別名です。

クラス

関数

引数型および属性I INTENT(IN) REAL(8)

結果型および属性

結果の型は、I と同じです。

FCFUD(I)目的

符号なし整数のダブルワードからの浮動小数点変換

ダブルワードで保管された 64 ビット符号なし整数を倍精度浮動小数点値に変換します。

クラス

関数

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 799

Page 826: IBM XL Fortran for Linux, V15.1

引数型および属性I INTENT(IN) REAL(8)

結果型および属性

結果の型は、I と同じです。

FCTID(X)目的

浮動小数点から整数への変換

現行の丸めモードを使用して、浮動小数点オペランドを、64 ビットの符号付き固定小数点整数に変換します。

クラス

関数

引数型および属性X INTENT(IN) REAL(8)

結果型および属性

結果の型は、X と同じです。

結果値

結果は、浮動小数点の結果に入れられた固定小数点整数です。

例use, intrinsic :: ieee_arithmeticreal(8) :: x, yinteger(8) :: iequivalence (y, i)x = 1234.5678D0if (ieee_support_datatype(x)) then

call ieee_set_rounding_mode(ieee_nearest)y = fctid(x)print *, icall ieee_set_rounding_mode(ieee_up)y = fctid(x)print *, icall ieee_set_rounding_mode(ieee_down)y = fctid(x)print *, icall ieee_set_rounding_mode(ieee_to_zero)y = fctid(x)print *, i

endifend

上記のプログラムで生成される出力例は次のとおりです。

800 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 827: IBM XL Fortran for Linux, V15.1

1235123512341234

FCTIDZ(X)目的

浮動小数点を整数に変換し、ゼロ方向に丸めます。

浮動小数点オペランドを、64 ビットの符号付き固定小数点整数に変換し、ゼロ方向に丸めます。

クラス

関数

引数型および属性X INTENT(IN) REAL(8)

結果型および属性

結果の型は、X と同じです。

結果値

結果は、浮動小数点の結果に入れられた、ゼロ方向に丸められた固定小数点整数です。

FCTIW(X)目的

浮動小数点から整数への変換

現行の丸めモードを使用して、浮動小数点オペランドを、32 ビットの符号付き固定小数点整数に変換します。

クラス

関数

引数型および属性X INTENT(IN) REAL(8)

結果型および属性

結果の型は、X と同じです。

結果値

結果は、浮動小数点の結果に入れられた固定小数点整数です。

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 801

Page 828: IBM XL Fortran for Linux, V15.1

FCTIWZ(X)目的

浮動小数点を整数に変換し、ゼロ方向に丸めます。

浮動小数点オペランドを、32 ビットの符号付き固定小数点整数に変換し、ゼロ方向に丸めます。

クラス

関数

引数型および属性X INTENT(IN) REAL(8)

結果型および属性

結果の型は、X と同じです。

結果値

結果は、浮動小数点の結果に入れられた、ゼロ方向に丸められた固定小数点整数です。

FCTUDZ(X)目的

ゼロの方向への丸めを伴う、符号なし整数のダブルワードへの浮動小数点変換

浮動小数点値を符号なし整数のダブルワードに変換し、ゼロに向けて丸めます。

クラス

関数

引数型および属性X INTENT(IN) REAL(8)

結果型および属性

結果の型は、X と同じです。

結果値

結果は、符号なし浮動小数点の結果に入れられた、ゼロ方向に丸められた固定小数点整数です。

802 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 829: IBM XL Fortran for Linux, V15.1

FCTUWZ(X)目的

浮動小数点から符号なし整数のワードへの変換 (ゼロ方向に丸め)

浮動小数点数を 32 ビットの符号なし整数に変換し、ゼロに向けて丸めます。この関数は、STFI 組み込みサブルーチンと組み合わせて使用することを意図しています。

クラス

関数

引数型および属性X INTENT(IN) REAL(8)

結果型および属性

結果は REAL(8) 型です。

結果値

結果は、REAL(8) 値です。結果の下位 32 ビットには、X を、ゼロ方向に丸められた負でない INTEGER(4) に変換して得られた結果が含まれています。結果の上位 32

ビットには、未定義の値が含まれています。

以下の例は、この関数の使用法を示しています。

IMPLICIT NONEREAL(8) x, resultINTEGER(4) yx = -1.5D0result = FCTUWZ(x)CALL SFTI(y, result)PRINT *, y ! prints 0

x= 1.5D0result = FCTUWZ(x)CALL SFTI(y, result)PRINT *, y ! prints 1END

FMADD(A, X, Y)目的

浮動小数点の乗算加算

浮動小数点の乗算加算の結果を戻します。

クラス

関数

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 803

Page 830: IBM XL Fortran for Linux, V15.1

引数型および属性A INTENT(IN) REAL(4) または REAL(8)。

X A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

Y A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

結果型および属性

結果の型は、A、X、および Y と同じです。

結果値

結果は、A*X + Y に等しい値です。

例REAL(4) :: A, B, C, RES1REAL(8) :: D, E, F, RES2

RES1 = FMADD(A, B, C)RES2 = FMADD(D, E, F)END

FMSUB(A, X, Y)目的

浮動小数点の乗算減算

浮動小数点の乗算減算の結果を戻します。

クラス

関数

引数型および属性A INTENT(IN) REAL(4) または REAL(8)。

X A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

Y A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

結果型および属性

結果の型は、A、X、および Y と同じです。

結果値

結果は、A*X - Y に等しい値です。

FNABS(X)目的

負の浮動小数点値 -|X| を戻します。

804 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 831: IBM XL Fortran for Linux, V15.1

クラス

関数

引数型および属性X INTENT(IN) REAL

結果型および属性

結果の型は、X と同じです。

結果値

結果は、X の負の浮動小数点値である -|X| です。

変数 A および D の内容の絶対値が負にされています。

REAL(4) :: A, RES1REAL(8) :: D, RES2

RES1 = FNABS(A)RES2 = FNABS(D)

FNMADD(A, X, Y)目的

浮動小数点の負の乗算加算

浮動小数点の負の乗算加算の結果を戻します。

クラス

関数

引数型および属性A INTENT(IN) REAL(4) または REAL(8)。

X A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

Y A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

結果型および属性

結果の型は、X と同じです。

結果値

結果は、-(A*X + Y) に等しい値です。

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 805

Page 832: IBM XL Fortran for Linux, V15.1

FNMSUB(A, X, Y)目的

浮動小数点の負の乗算減算

浮動小数点の負の乗算減算の結果を戻します。

クラス

関数

引数型および属性A INTENT(IN) REAL(8)

X A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

Y A と同じ型および kind 型パラメーターの INTENT(IN) 引数。

結果型および属性

結果の型は、A、X、および Y と同じです。

結果値

結果は、-(A*X - Y) に等しい値です。

FNMSUB の結果の型は REAL(4) です。これが REAL(8) に変換されてから RES

に代入されます。

REAL(4) :: A, B, CREAL(8) :: RES

RES = FNMSUB(A, B, C)END

FRE(X)目的

浮動小数点逆数概算

浮動小数点の逆数演算の概算値を戻します。

クラス

関数

引数型および属性X INTENT(IN) REAL(8)

結果型および属性

結果の型は、X と同じです。

806 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 833: IBM XL Fortran for Linux, V15.1

結果値

結果は、1/X の倍精度概算値です。

FRES(X)目的

単精度の浮動小数点逆数概算

浮動小数点の逆数演算の概算値を戻します。

拡張グラフィックス命令コードを備えた任意の PowerPC で有効です。「XL Fortran

最適化およびプログラミング・ガイド」の『ターゲット・アーキテクチャーに合わせたチューニング』を参照してください。

クラス

関数

引数型および属性X INTENT(IN) REAL(4)

結果型および属性

結果の型は、X と同じです。

結果値

結果は、1/X の単精度概算値です。

FRIC(A)目的

現在の丸めモードで浮動小数点を整数に丸める

現在の丸めモードで、倍精度浮動小数点値を整数に丸めます。

クラス

関数

引数型および属性A INTENT(IN) REAL(8)

結果型および属性

結果の型は、A と同じです。

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 807

Page 834: IBM XL Fortran for Linux, V15.1

FRIM(A)目的

浮動小数点を負の方向に整数に丸めます。

クラス

関数

引数型および属性A INTENT(IN) REAL(4) または REAL(8)

結果型および属性

結果の型は、A と同じです。

結果値

結果は、A 以下で最も大きい整数に等しい値です。

FRIN(A)目的

浮動小数点を最も近い整数に丸めます。

クラス

関数

引数型および属性A INTENT(IN) REAL(4) または REAL(8)

結果型および属性

結果の型は、A と同じです。

結果値

A > 0 の場合、FRIN(A) の値は FRIM(A + 0.5) です。

A <= 0 の場合、FRIN(A) の値は FRIM(A - 0.5) です。

FRIP(A)目的

浮動小数点を正の方向に整数に丸めます。

クラス

関数

808 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 835: IBM XL Fortran for Linux, V15.1

引数型および属性A INTENT(IN) REAL(4) または REAL(8)

結果型および属性

結果の型は、A と同じです。

結果値

結果は、A 以上で最も小さい整数に等しい値です。

FRIZ(A)目的

浮動小数点をゼロ方向に整数に丸めます。

クラス

関数

引数型および属性A INTENT(IN) REAL(4) または REAL(8)

結果型および属性

結果の型は、A と同じです。

結果値

A > 0 の場合、FRIZ(A) の値は FRIM(A) です。

A <= 0 の場合、FRIZ(A) の値は FRIP(A) です。

FRSQRTE(X)目的

浮動小数点の平方根の逆数概算

平方根の逆数演算の結果を戻します。

拡張グラフィックス命令コードを備えた任意の PowerPC で有効です。「XL Fortran

最適化およびプログラミング・ガイド」の『ターゲット・アーキテクチャーに合わせたチューニング』を参照してください。

クラス

関数

引数型および属性X INTENT(IN) REAL(8)

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 809

Page 836: IBM XL Fortran for Linux, V15.1

結果型および属性

結果の型は、X と同じです。

結果値

結果は、X の平方根の逆数の倍精度概算値です。

FRSQRTES(X)目的

単精度の浮動小数点の平方根の逆数概算

平方根の逆数演算の結果を戻します。

クラス

関数

引数型および属性X INTENT(IN) REAL(4)

結果型および属性

結果の型は、X と同じです。

結果値

結果は、X の平方根の逆数の単精度概算値です。

FSEL(X,Y,Z)目的

浮動小数点選択

浮動小数点選択演算の結果を戻します。この結果は、 X の値をゼロと比較することで決まります。

拡張グラフィックス命令コードを備えた任意の PowerPC で有効です。「XL Fortran

最適化およびプログラミング・ガイド」の『ターゲット・アーキテクチャーに合わせたチューニング』を参照してください。

クラス

関数

引数型および属性X INTENT(IN) REAL(4) または REAL(8)

Y X と同じ型および kind 型パラメーターの INTENT(IN) 引数。

Z X と同じ型および kind 型パラメーターの INTENT(IN) 引数。

810 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 837: IBM XL Fortran for Linux, V15.1

結果型および属性

結果の型は、X、Y、および Z と同じです。

結果値v X の値がゼロ以上である場合、Y の値が戻されます。

v X の値がゼロより小さいか NaN である場合、Z の値が戻されます。

ゼロ値は符号なしと見なされます。つまり、+0 と -0 の両方ともゼロに等しいと見なされます。

LOAD2R(X)目的

バイト反転で 2 バイト整数をロードします。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER(2)。

結果型および属性

結果は、X と同じ型で、同じ型パラメーターです。

結果値

バイト反転順序での X の値です。

例INTEGER(2) x, yx = 1y = LOAD2R(x)PRINT 10, x !prints 0001PRINT 10, y !prints 0100

10 FORMAT (z4.4)END

関連情報

LOAD4R(X)

LOAD8R(X)

REVERSE_BYTE_ORDER(X)

VEC_REVB(ARG1)

VEC_REVE(ARG1)

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 811

Page 838: IBM XL Fortran for Linux, V15.1

LOAD4R(X)目的

バイト反転で 4 バイト整数をロードします。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER(4)。

結果型および属性

結果は、X と同じ型で、同じ型パラメーターです。

結果値

バイト反転順序での X の値です。

例INTEGER(4) x, yx = 1y = LOAD4R(x)PRINT 10, x !prints 00000001PRINT 10, y !prints 01000000

10 FORMAT (z8.8)END

関連情報

LOAD2R(X)

LOAD8R(X)

REVERSE_BYTE_ORDER(X)

VEC_REVB(ARG1)

VEC_REVE(ARG1)

LOAD8R(X)目的

バイト反転で 8 バイト整数をロードします。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER(8)。

812 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 839: IBM XL Fortran for Linux, V15.1

結果型および属性

結果は、X と同じ型で、同じ型パラメーターです。

結果値

バイト反転順序での X の値です。

例INTEGER(8) x, yx = 1y = LOAD8R(x)PRINT 10, x !prints 0000000000000001PRINT 10, y !prints 0100000000000000

10 FORMAT (z16.16)END

関連情報

LOAD2R(X)

LOAD4R(X)

REVERSE_BYTE_ORDER(X)

VEC_REVB(ARG1)

VEC_REVE(ARG1)

MTFSF(MASK, R)目的

浮動小数点状況および制御レジスター (FPSCR) フィールドへの移動

MASK に指定されたフィールド・マスクの制御下で R の内容が FPSCR に入れられます。

クラス

サブルーチン

引数型および属性MASK INTENT(IN) INTEGER(4)。MASK に対応する実引数は、0 から 7 の範囲内

の値を持つ定数式である必要があります。

R INTENT(IN) REAL(8)。

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 813

Page 840: IBM XL Fortran for Linux, V15.1

MTFSFI(BF, I)目的

浮動小数点状況および制御レジスター (FPSCR) フィールドへの即値移動

BF に指定された FPSCR フィールドに I の値が入れられます。

クラス

サブルーチン

引数型および属性BF INTENT(IN) INTEGER(4)。BF に対応する実引数は、0 から 7 の範囲内の値

を持つ定数式である必要があります。

I INTENT(IN) INTEGER(4)。I に対応する実引数は、0 から 15 の範囲内の値を持つ定数式である必要があります。

MULHY(RA, RB)目的

オペランド RA と RB の上位 32 ビットまたは 64 ビット (64 ビットまたは 128

ビットの積のうち) を返します。

クラス

関数

引数型および属性RA INTENT(IN) INTEGER(4) または INTEGER(8)。

RB RA と同じ型および kind 型パラメーターの INTENT(IN) 引数。

結果型および属性

結果の型は、RA、RB と同じです。

結果値

オペランド RA と RB の上位 32 ビットまたは 64 ビットの積

POPCNTB(I)目的

設定ビット数。

I の各バイトの設定されたビット数をカウントします。

クラス

エレメント型関数

814 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 841: IBM XL Fortran for Linux, V15.1

引数型および属性I

INTENT(IN) INTEGER(4) または INTEGER(8)。

結果型および属性

結果は INTEGER(8) です。

結果値

各バイト中でオンに設定されているビットの数が、そのバイトの位置に置かれます。

例INTEGER II = x'010300ff'WRITE(*, '(z8.8)') POPCNTB(I)END

予期される出力は、次のとおりです。

01020008

関連情報

データ表記モデル

REVERSE_BYTE_ORDER(X)目的

整数値のバイト・オーダーを反転します。

この関数は、load2r、load4、および load8r の汎用形式です。

クラス

エレメント型関数

引数型および属性X INTENT(IN) INTEGER(2)、INTEGER(4)、または INTEGER(8)。

結果型および属性

結果は、X と同じ型で、同じ型パラメーターです。

結果値

バイト反転順序での X の値です。

例INTEGER(2) y2INTEGER(4) y4INTEGER(8) y8

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 815

Page 842: IBM XL Fortran for Linux, V15.1

PRINT '(z4.4)', REVERSE_BYTE_ORDER(1_2)PRINT '(z8.8)', REVERSE_BYTE_ORDER(1_4)PRINT '(z16.16)', REVERSE_BYTE_ORDER(1_8)END

予期される出力は、次のとおりです。

0100010000000100000000000000

関連情報

LOAD2R(X)

LOAD4R(X)

LOAD8R(X)

VEC_REVB(ARG1)

VEC_REVE(ARG1)

ROTATELI(RS, IS, SHIFT, MASK)目的

即値を左方向に循環させて MASK 挿入

RS の値を、SHIFT に指定されたビット数だけ左に循環させます。この関数は、次に、ビット・マスク MASK に従って RS を IS に挿入します。

クラス

関数

引数型および属性RS INTENT(IN) INTEGER。

IS INTENT(IN) INTEGER。

SHIFT INTENT(IN) INTEGER。4 バイト RS 値の場合、SHIFT 値は最後の 5 ビットに切り捨てられます。8 バイト RS 値の場合、SHIFT 値は最後の 6 ビットに切り捨てられます。

MASK INTENT(IN) INTEGER。

結果型および属性

結果の型は、RS と同じです。

結果値

SHIFT に指定されたビット数だけ RS を左方向に循環させ、その結果をビット・マスク MASK に従って IS に挿入します。

816 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 843: IBM XL Fortran for Linux, V15.1

ROTATELM(RS, SHIFT, MASK)目的

左方項へ循環させて MASK と AND 演算

RS の値を、SHIFT に指定されたビット数だけ左に循環させます。循環させたデータを MASK と AND 演算し、結果として戻します。

クラス

関数

引数型および属性RS INTENT(IN) INTEGER。

SHIFT INTENT(IN) INTEGER。4 バイト RS 値の場合、SHIFT 値は最後の 5 ビットに切り捨てられます。8 バイト RS 値の場合、SHIFT 値は最後の 6 ビットに切り捨てられます。

MASK INTENT(IN) INTEGER。

結果型および属性

結果の型は、RS と同じです。

結果値

循環させたデータが MASK と AND 演算されます。

SETFSB0(BT)目的

浮動小数点状況および制御レジスター (FPSCR) ビットに 0 を移動します。

FPSCR のビット BT が 0 に設定されます。

クラス

サブルーチン

引数型および属性BT INTENT(IN) INTEGER(4)。BT に対応する実引数は、0 から 31 の範囲内の

値を持つ定数式である必要があります。

SETFSB1(BT)目的

1 を FPSCR ビットに移動します。

FPSCR のビット BT が 1 に設定されます。

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 817

Page 844: IBM XL Fortran for Linux, V15.1

クラス

サブルーチン

引数型および属性BT INTENT(IN) INTEGER(4)。BT に対応する実引数は、0 から 31 の範囲内の

値を持つ定数式である必要があります。

SFTI(M, Y)目的

整数への浮動小数点の保管

Y の下位 32 ビットの内容が無変換で M に保管されます。

クラス

サブルーチン

引数型および属性M INTENT(INOUT) INTEGER(4)。

Y INTENT(IN) REAL(8)。

例...integer*4 :: mreal*8 :: x

x = z"00000000abcd0001"call sfti(m, x) ! m = z"abcd0001"..

SWDIV(X,Y)目的

ソフトウェアによる浮動小数点除算。

この関数は、浮動小数点除算の結果を戻し、アプリケーションがループ内で除算を繰り返し実行する場合、普通の除算演算子よりもパフォーマンスを向上させることができます。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL(4) または REAL(8)。

Y X と同じ型および kind 型パラメーターの INTENT(IN) 引数。

818 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 845: IBM XL Fortran for Linux, V15.1

結果型および属性

結果の型は、X および Y と同じです。

結果値

結果は、X/Y に等しい値です。

プログラムを -qarch=pwr8 オプションを指定してコンパイルし、POWER8 プロセッサー上で実行したとき:

v -qstrict=ieeefp または -qstrict=exceptions が有効な場合、結果は IEEE 除算とビット単位で同一です。

v -qstrict=noieeefp または -qstrict=noexceptions が有効な場合、結果は IEEE 結果と少し異なることがあります。

SWDIV_NOCHK(X,Y)目的

ソフトウェアによる浮動小数点除算と無効な引数の検査。

この関数は、浮動小数点除算の結果を戻し、アプリケーションがループ内で除算を繰り返し実行し、引数が許容される範囲内にある場合、普通の除算演算子またはSWDIV 組み込み関数よりもパフォーマンスを向上させることができます。

クラス

エレメント型関数

引数型および属性X INTENT(IN) REAL(4) または REAL(8)。

Y X と同じ型および kind 型パラメーターの INTENT(IN) 引数。

演算が正しく行われるためには、REAL(4) の引数は、以下の条件を満たさなければなりません。

v 2**(-125) <= |Y| <= 2**124

v X ゼロでない場合は次のとおりです。

2**(-102) <= |X| < Inf

2**(-124) <= |X/Y| <= 2**126

演算が正しく行われるためには、REAL(8) の引数は、以下の条件を満たさなければなりません。

v 2**(-1021) <= |Y| <= 2**1020

v X ゼロでない場合は次のとおりです。

2**(-969) <= |X| < Inf

2**(-1020) <= |X/Y| <= 2**1022

結果型および属性

結果の型は、X および Y と同じです。

第 15 章 ハードウェア固有の組み込みプロシージャー (IBM 拡張) 819

Page 846: IBM XL Fortran for Linux, V15.1

結果値

結果は、X/Y に等しい値です。

プログラムを -qarch=pwr8 オプションを指定してコンパイルし、POWER8 プロセッサー上で実行したとき:

v -qstrict=ieeefp または -qstrict=exceptions が有効な場合、結果は IEEE 除算とビット単位で同一です。

v -qstrict=noieeefp または -qstrict=noexceptions が有効な場合、結果は IEEE 結果と少し異なることがあります。

TRAP(A, B, TO)目的

オペランド A がオペランド B と比較されます。この比較の結果は 5 つの状態になり、それが TO と AND 演算されます。結果が 0 以外の場合、システム・トラップ・ハンドラーが起動されます。

A および B オペランドの両方が、INTEGER(4) 型または INTEGER(8) 型でなければなりません。

クラス

サブルーチン

引数型および属性A INTENT(IN) INTEGER。

B INTENT(IN) INTEGER。

TO INTENT(IN) INTEGER(4)。TO に対応する実引数は、0 から 31 の範囲内の値を持つ定数式である必要があります。

820 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 847: IBM XL Fortran for Linux, V15.1

第 16 章 TRANSACTIONAL_MEMORY 組み込みモジュール(IBM 拡張)

TRANSACTIONAL_MEMORY 組み込みモジュールは、並列プログラミングに使用されます。このモジュールで提供される関数を使用すると、原子的に処理される命令やステートメントのブロックを指定できます。このような原子的ブロックは、トランザクションと呼ばれます。スレッドによってトランザクションが実行されると、そのトランザクション内のすべてのメモリー操作は、他のスレッドからは同時に実行されているように見えます。

一部の種類の並列プログラムについては、トランザクションの実装は、ロックなどの他の実装方法よりも効率的な場合があります。これらの組み込みプロシージャーを使用して、トランザクションの開始と終了を示したり、エラーの原因を診断したりできます。

トランザクション状態は、TM_BEGIN または TM_SIMPLE_BEGIN が正常に呼び出された後に開始されて、TM_END、TM_ABORT、TM_NAMED_ABORT、またはトランザクション・エラーによって終了します。

トランザクション・エラーが発生するのは、次のいずれかの条件に一致した場合です。

v トランザクション状態でアクセスされたメモリーが、そのトランザクションが完了する前に、別のスレッドによってアクセスされた場合

v 1 トランザクション内で、メモリー・アクセスのためのアーキテクチャー定義のフットプリントを超過しています。

v ネストされたトランザクションのアーキテクチャー定義のネスト制限を超過しています。

トランザクションはネストすることができます。トランザクション状態で TM_BEGIN

または TM_SIMPLE_BEGIN を使用できます。TM_BEGIN を使用して開始された最外部のトランザクション内で、ネストされたトランザクションは、TM_SIMPLE_BEGIN を使用して開始されるか、そのトランザクションが含まれる最外部の同じバッファーを使用して TM_BEGIN によって開始される必要があります。

ネストされたトランザクションは、そのトランザクションが含まれるトランザクションに従属します。したがって、ネストされたトランザクションのエラーは、そのトランザクションが含まれるすべてのすべてのトランザクションのエラーとして扱われ、ネストされたトランザクションが完了するのは、そのトランザクションが含まれるすべてのトランザクションが完了したときのみです。

TRANSACTIONAL_MEMORY モジュールは、次の派生型を提供します。

TM_BUFF_TYPEトランザクション状況を保管するために使用される不透明派生型。

© Copyright IBM Corp. 1996, 2015 821

Page 848: IBM XL Fortran for Linux, V15.1

名前付き定数

TRANSACTIONAL_MEMORY モジュールは、次の名前付き定数を提供します。

TM_SUCCESSトランザクションの開始関数と終了関数によって返される整数定数。TM_SUCCESS が TM_BEGIN または TM_SIMPLE_BEGIN によって返される場合は、トランザクションが正常に開始されたということになります。TM_SUCCESS が TM_END によって返される場合は、TM_END が呼び出されたときにスレッドがトランザクション状態であったことになります。TM_SUCCESS

の kind 型パラメーター値は 8 です。

マイグレーションに関する考慮事項: TM_SUCCESS の数値は、XL Fortran for

Linux V15.1.2 (リトル・エンディアン・ディストリビューション) 以降に変更されています。名前付き定数 TM_SUCCESS を使用してコード内のトランザクションの開始関数または終了関数の戻り値を検査する場合、この変更はコードの正確性には影響しません。

プロシージャー

TRANSACTIONAL_MEMORY モジュールは、以下のプロシージャーを提供します。

v 『トランザクション開始/終了関数』

v 823ページの『トランザクション打ち切り関数』

v 824ページの『トランザクション照会関数』

トランザクション開始/終了関数

TM_SIMPLE_BEGIN()目的

トランザクションの開始を示します。

クラス

関数

結果型および属性v INTEGER(8)

結果値

トランザクションが正常に開始された場合は、TRANSACTIONAL_MEMORY モジュールから TM_SUCCESS を返します。

注: TM_SIMPLE_BEGIN を使用して開始されたトランザクションのトランザクション状況は、トランザクション照会関数を使用して照会することはできません。

822 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 849: IBM XL Fortran for Linux, V15.1

TM_BEGIN(TM_BUFF)目的

トランザクションの開始を示します。

クラス

関数

引数の型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(OUT) 引数。

結果型および属性v INTEGER(8)

結果値

トランザクションが正常に開始された場合は、TRANSACTIONAL_MEMORY モジュールから TM_SUCCESS を返します。

トランザクションの状況は、TM_BUFF 引数に保管されます。この状況を照会するには、トランザクション照会関数を使用します。

TM_END()目的

トランザクションの終了を示します。

クラス

関数

結果の型および属性v INTEGER(8)

結果値

TM_END の開始時にスレッドがトランザクション状態であった場合は、TRANSACTIONAL_MEMORY モジュールから TM_SUCCESS を返します。

トランザクション打ち切り関数

TM_ABORT()目的

トランザクションが打ち切られ、エラー・コード 0 が出されます。

第 16 章 TRANSACTIONAL_MEMORY 組み込みモジュール (IBM 拡張) 823

Page 850: IBM XL Fortran for Linux, V15.1

クラス

サブルーチン

TM_NAMED_ABORT(CODE)目的

code で指定された障害コードのトランザクションを中止します。

クラス

サブルーチン

引数の型および属性code INTENT(IN) 整数。対応する実引数の値は、0 から 255 の範囲内である必要

があります。

トランザクション照会関数

TM_IS_USER_ABORT(TM_BUFF)目的

ユーザー要求が原因でトランザクションが中止されたのかどうかを照会します。

クラス

関数

引数型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

結果の型および属性

デフォルト論理

結果値

TM_BUFF 引数に状況が保管されているトランザクションがユーザーによって中止された場合は、.TRUE. を返します。そうでない場合は、.FALSE. を返します。

TM_IS_NAMED_USER_ABORT(TM_BUFF, CODE)目的

ユーザー要求が原因でトランザクションが中止されたのかどうかを照会して、そのユーザーによって指定された障害コードを取得します。

824 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 851: IBM XL Fortran for Linux, V15.1

クラス

関数

引数の型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

code INTENT(OUT) 整数。

結果の型および属性

デフォルト論理

結果値

TM_BUFF 引数に状況が保管されているトランザクションがユーザーによって中止された場合は、.TRUE. を返します。そうでない場合は、.FALSE. を返します。code

には、そのトランザクションが中止されたときにユーザーによって指定された障害コードが代入されます。ユーザーが障害コードを指定しなかった場合は、0 になります。

TM_IS_ILLEGAL(TM_BUFF)目的

不適切な処理を試行したことが原因でトランザクションが中止されたのかどうかを照会します。

クラス

関数

引数型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

結果型および属性

デフォルト論理

結果値

TM_BUFF 引数に状況が保管されているトランザクションが、不適切な処理を試行したことが原因で中止された場合は、.TRUE. を返します。例えば、トランザクション・モードで許可されていない命令を実行しようとした場合などです。そうでない場合は、.FALSE. を返します。

第 16 章 TRANSACTIONAL_MEMORY 組み込みモジュール (IBM 拡張) 825

Page 852: IBM XL Fortran for Linux, V15.1

TM_IS_FOOTPRINT_EXCEEDED(TM_BUFF)目的

キャッシュ・ラインの最大数を超過したことが原因でトランザクションが中止されたのかどうかを照会します。

クラス

関数

引数の型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

結果の型および属性

デフォルト論理

結果値

キャッシュ・ラインの最大数を超過したことが原因でトランザクションが中止された場合は、.TRUE. を返します。そうでない場合は、.FALSE. を返します。

TM_NESTING_DEPTH(TM_BUFF)目的

現在のネスト深度を取得します。または、トランザクション・モードでない場合は、最新のトランザクションが中止された深度を取得します。

クラス

関数

結果の型および属性

デフォルトの整数

引数の型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

結果値

TM_BUFF 引数に状況が保管されているトランザクションの現在のネスト深度を返します。または、トランザクション・モードでない場合は、このトランザクションが中止された深度を返します。このトランザクションが正常に完了した場合は、0

が返されます。

826 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 853: IBM XL Fortran for Linux, V15.1

TM_IS_NESTED_TOO_DEEP(TM_BUFF)目的

最大ネスト深度を超過しようとしたために、トランザクションが中止されたのかどうかを照会します。

クラス

関数

引数の型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

結果の型および属性

デフォルト論理

結果値

TM_BUFF 引数に状況が保管されているトランザクションが、最大ネスト深度を超過しようとしたために中止された場合は、.TRUE. を返します。そうでない場合は、.FALSE. を返します。

TM_IS_CONFLICT(TM_BUFF)目的

競合が原因でトランザクションが中止されたのかどうかを照会します。

クラス

関数

引数の型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

結果の型および属性

デフォルト論理

戻り値

TM_BUFF 引数に状況が保管されているトランザクションが競合が原因で中止された場合は、.TRUE. を返します。そうでない場合は、.FALSE. を返します。

第 16 章 TRANSACTIONAL_MEMORY 組み込みモジュール (IBM 拡張) 827

Page 854: IBM XL Fortran for Linux, V15.1

TM_IS_FAILURE_PERSISTENT(TM_BUFF)目的

永続的な原因でトランザクションが中止されたのかどうかを照会します。

クラス

関数

引数の型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

結果の型および属性

デフォルト論理

結果値

TM_BUFF 引数に状況が保管されているトランザクションが永続的な原因で中止された場合は、.TRUE. を返します。そうでない場合は、.FALSE. を返します。

TM_FAILURE_ADDRESS()目的

最新のトランザクションが打ち切られたコード・アドレスを取得します。

クラス

関数

引数の型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

結果の型および属性v INTEGER(8)

結果値

TM_BUFF 引数に状況が保管されているトランザクションが中止されたアドレスを返します。

TM_FAILURE_CODE(TM_BUFF)目的

トランザクションのロー障害コードを取得します。

828 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 855: IBM XL Fortran for Linux, V15.1

クラス

関数

引数の型および属性TM_BUFF

TRANSACTIONAL_MEMORY モジュールからの TM_BUFF_TYPE 型のINTENT(IN) 引数。

結果の型および属性

INTEGER(8)

結果値

TM_BUFF 引数に保管されている TEXASR レジスターの内容を返します。戻り値の解釈方法については、ハードウェア仕様を参照してください。

第 16 章 TRANSACTIONAL_MEMORY 組み込みモジュール (IBM 拡張) 829

Page 856: IBM XL Fortran for Linux, V15.1

830 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 857: IBM XL Fortran for Linux, V15.1

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張)

ベクトルの個々のエレメントには、記憶関連付け、TRANSFER 組み込み関数、または Vector Multimedia Extension (VMX) および Vector Scalar Extension (VSX) 組み込み関数を使用してアクセスできます。このセクションでは、VMX および VSX

組み込み関数をアルファベット順に説明します。これらの組み込み関数を使用して、ベクトルを操作できます。

注:

v 組み込み関数を使用する際には、お使いのアーキテクチャーに合った適切なコンパイラー・オプションを使用するようにしてください。

v INTEGER(8)、UNSIGNED(8)、または REAL(8) ベクトル型を使用するか、または結果がこのベクトル型になる組み込み関数には、 のような VSX 命令セット拡張に対応するアーキテクチャーが必要です。

関連情報:

-qaltivec

VEC_ABS(ARG1)

目的

指定されたベクトルの内容の絶対値が入っているベクトルを返します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) INTEGER(1)、INTEGER(2)、INTEGER(4)、UNSIGNED(1)、UNSIGNED(2)、UNSIGNED(4)、REAL(4)、または REAL(8) ベクトル

結果型および属性

結果型は ARG1 と同じです。

結果値

結果の各エレメントの値は、ARG1 の対応するエレメントの絶対値です。整数ベクトルの場合、演算はモジュラーです。

© Copyright IBM Corp. 1996, 2015 831

Page 858: IBM XL Fortran for Linux, V15.1

VEC_ABSS(ARG1)目的

これは、指定されたベクトルのエレメントの飽和絶対値が入ったベクトルを返します。

クラス

エレメント型関数

引数型および属性ARG1エレメントの kind が 1、2、または 4 である、INTENT(IN) 整数ベクトル

結果型および属性

結果型は ARG1 と同じです。

結果値

結果の各エレメントの値は、ARG1 の対応するエレメントの飽和絶対値です。

VEC_ADD(ARG1, ARG2)

目的

指定されたベクトル同士の対応する各エレメント・セットの和が入っているベクトルを返します。

注: INTEGER(8) ベクトルの場合には、この関数は演算をエミュレートします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果型は ARG1 と同じです。

結果値

結果の各エレメントの値は、ARG1 と ARG2 の対応するエレメントの和です。整数ベクトルおよび符号なしベクトルの場合、算術計算はモジュラーです。

832 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 859: IBM XL Fortran for Linux, V15.1

VEC_ADD_U128 (ARG1, ARG2)目的

符号なし 4 倍長ワード値を加算します。

この関数は、ベクトルを 128 ビットの符号なし整数として演算します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) VECTOR(UNSIGNED(1))

ARG2INTENT(IN) VECTOR(UNSIGNED(1))

結果型および属性

ARG1 と同じ。

結果値

a および b を、それぞれ ARG1 および ARG2 とストレージ関連付けされた 128

ビット整数にします。

結果値は、a + b です。

VEC_ADDC_U128 (ARG1, ARG2)目的

2 つの 4 倍長ワード値の 128 ビット加算のキャリー・ビットを取得します。

この関数は、ベクトルを 128 ビットの符号なし整数として演算します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) VECTOR(UNSIGNED(1))

ARG2INTENT(IN) VECTOR(UNSIGNED(1))

結果型および属性

ARG1 と同じ。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 833

Page 860: IBM XL Fortran for Linux, V15.1

結果値

a および b を、それぞれ ARG1 および ARG2 とストレージ関連付けされた 128

ビット整数にします。

結果値は、a + b の桁上げです。

VEC_ADDE_U128 (ARG1, ARG2, ARG3)目的

直前の演算からのキャリー・ビットを持つ、符号なし 4 倍長ワード値を加算します。

この関数は、ベクトルを 128 ビットの符号なし整数として演算します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) VECTOR(UNSIGNED(1))

ARG2INTENT(IN) VECTOR(UNSIGNED(1))

ARG3INTENT(IN) VECTOR(UNSIGNED(1))

結果型および属性

ARG1 と同じ。

結果値

a、b、および c を、それぞれ ARG1、ARG2、および ARG3 とストレージ関連付けされた 128 ビット整数にします。

結果値は、a + b + iand(c, 1) です。

VEC_ADDEC_U128 (ARG1, ARG2, ARG3)目的

直前の演算からのキャリー・ビットを持つ、2 つの 4 倍長ワード値の 128 ビット加算のキャリー・ビットを取得します。

この関数は、ベクトルを 128 ビットの符号なし整数として演算します。

クラス

エレメント型関数

834 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 861: IBM XL Fortran for Linux, V15.1

引数型および属性ARG1

INTENT(IN) VECTOR(UNSIGNED(1))

ARG2INTENT(IN) VECTOR(UNSIGNED(1))

ARG3INTENT(IN) VECTOR(UNSIGNED(1))

結果型および属性

ARG1 と同じ。

結果値

a、b、および c を、それぞれ ARG1、ARG2、および ARG3 とストレージ関連付けされた 128 ビット整数にします。

結果値は、a + b + iand(c, 1) の桁上げです。

VEC_ADDC(ARG1, ARG2)目的

これは、対応する 2 つの指定ベクトルのエレメントからなる各セットを加算することで生じた桁上がりが入ったベクトルを返します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) UNSIGNED(4) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果型は ARG1 と同じです。

結果値

対応する ARG1 および ARG2 のエレメントを加算することによって桁上がりが生じる場合、対応する結果エレメントは 1 であり、それ以外の場合は 0 です。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 835

Page 862: IBM XL Fortran for Linux, V15.1

VEC_ADDS(ARG1, ARG2)目的

これは、対応する 2 つの指定ベクトルのエレメントからなる各セットの飽和加算の結果が入ったベクトルを返します。

クラス

エレメント型関数

引数型および属性ARG1エレメントの kind が 1、2、または 4 である、INTENT(IN) 整数または符号なしベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果型は ARG1 と同じです。

結果値

結果の各エレメントの値は、ARG1 と ARG2 の対応するエレメントの飽和合計です。

VEC_ALL_EQ(ARG1, ARG2)目的

指定されたベクトルの対応するエレメントからなるセットのすべてが等しいかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 の各エレメントが ARG2 の対応するエレメントと等しければ、結果は 1 です。それ以外の場合、結果は 0 です。

836 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 863: IBM XL Fortran for Linux, V15.1

VEC_ALL_GE(ARG1, ARG2)目的

最初の引数のすべてのエレメントが 2 番目の引数の対応するエレメント以上かどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のすべてのエレメントが ARG2 の対応するエレメント以上であれば、結果は 1

です。それ以外の場合、結果は 0 です。

VEC_ALL_GT(ARG1, ARG2)目的

最初の引数のすべてのエレメントが 2 番目の引数の対応するエレメントより大きいかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のすべてのエレメントが ARG2 の対応するエレメントより大きければ、結果は1 です。それ以外の場合、結果は 0 です。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 837

Page 864: IBM XL Fortran for Linux, V15.1

VEC_ALL_IN(ARG1, ARG2)目的

指定されたベクトルの各エレメントが、指定された範囲内にあるかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) REAL(4) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のすべてのエレメントが ARG2 の対応するエレメントの値以下であり、かつ、ARG2 の対応するエレメントの値を負にした値以上であれば、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ALL_LE(ARG1, ARG2)目的

最初の引数のすべてのエレメントが 2 番目の引数の対応するエレメント以下かどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

838 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 865: IBM XL Fortran for Linux, V15.1

結果値

ARG1 のすべてのエレメントが ARG2 の対応するエレメント以下であれば、結果は 1

です。それ以外の場合、結果は 0 です。

VEC_ALL_LT(ARG1, ARG2)目的

最初の引数のすべてのエレメントが 2 番目の引数の対応するエレメントより小さいかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のすべてのエレメントが ARG2 の対応するエレメントより小さければ、結果は1 です。それ以外の場合、結果は 0 です。

VEC_ALL_NAN(ARG1)目的

指定されたベクトルの各エレメントが NaN かどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

結果型および属性

結果は INTEGER(4) です。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 839

Page 866: IBM XL Fortran for Linux, V15.1

結果値

ARG1 の各エレメントが NaN であれば、結果は 1 です。それ以外の場合、結果は 0

です。

VEC_ALL_NE(ARG1, ARG2)目的

指定されたベクトルの対応するエレメントからなるセットのすべてが等しくないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 の各エレメントが ARG2 の対応するエレメントと等しくなければ、結果は 1

です。それ以外の場合、結果は 0 です。

VEC_ALL_NGE(ARG1, ARG2)目的

最初の引数の各エレメントが 2 番目の引数の対応するエレメント以上でないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

840 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 867: IBM XL Fortran for Linux, V15.1

結果値

ARG1 の各エレメントが ARG2 の対応するエレメント以上でなければ、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ALL_NGT(ARG1, ARG2)目的

最初の引数の各エレメントが 2 番目の引数の対応するエレメントより大きくないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 の各エレメントが ARG2 の対応するエレメントより大きくなければ、結果は 1

です。それ以外の場合、結果は 0 です。

VEC_ALL_NLE(ARG1, ARG2)目的

最初の引数の各エレメントが 2 番目の引数の対応するエレメント以下でないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 841

Page 868: IBM XL Fortran for Linux, V15.1

結果値

ARG1 の各エレメントが ARG2 の対応するエレメント以下でなければ、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ALL_NLT(ARG1, ARG2)目的

最初の引数の各エレメントが 2 番目の引数の対応するエレメントより小さくないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 の各エレメントが ARG2 の対応するエレメントより小さくなければ、結果は 1

です。それ以外の場合、結果は 0 です。

VEC_ALL_NUMERIC(ARG1)目的

指定されたベクトルの各エレメントが数値である (NaN ではない) かどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

結果型および属性

結果は INTEGER(4) です。

842 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 869: IBM XL Fortran for Linux, V15.1

結果値

ARG1 の各エレメントが数値である (NaN ではない) 場合、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_AND(ARG1, ARG2)

目的

指定されたベクトル同士のビット単位の AND 演算を行います。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果型は ARG1 と同じです。

結果値

結果は、ARG1 と ARG2 のビット単位の AND です。

VEC_ANDC(ARG1, ARG2)

目的

第 1 引数と、第 2 引数のビット単位の補数をビット単位で AND 演算します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果型は ARG1 と同じです。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 843

Page 870: IBM XL Fortran for Linux, V15.1

結果値

結果は、ARG1 と、ARG2 のビット単位の補数をビット単位で AND した値です。

VEC_ANY_EQ(ARG1, ARG2)目的

指定されたベクトルの対応するエレメントからなるセットのいずれかが等しいかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメントと等しければ、結果は1 です。それ以外の場合、結果は 0 です。

VEC_ANY_GE(ARG1, ARG2)目的

最初の引数のいずれかのエレメントが 2 番目の引数の対応するエレメント以上かどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

844 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 871: IBM XL Fortran for Linux, V15.1

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメント以上であれば、結果は1 です。それ以外の場合、結果は 0 です。

VEC_ANY_GT(ARG1, ARG2)目的

最初の引数のいずれかのエレメントが 2 番目の引数の対応するエレメントより大きいかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメントより大きければ、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ANY_LE(ARG1, ARG2)目的

最初の引数のいずれかのエレメントが 2 番目の引数の対応するエレメント以下かどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 845

Page 872: IBM XL Fortran for Linux, V15.1

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメント以下であれば、結果は1 です。それ以外の場合、結果は 0 です。

VEC_ANY_LT(ARG1, ARG2)目的

最初の引数のいずれかのエレメントが 2 番目の引数の対応するエレメントより小さいかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメントより小さければ、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ANY_NAN(ARG1)目的

指定されたベクトルのいずれかのエレメントが NaN かどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

結果型および属性

結果は INTEGER(4) です。

846 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 873: IBM XL Fortran for Linux, V15.1

結果値

ARG1 のいずれかのエレメントが NaN であれば、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ANY_NE(ARG1, ARG2)目的

指定されたベクトルの対応するエレメントからなるセットのいずれかが等しくないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメントと等しくなければ、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ANY_NGE(ARG1, ARG2)目的

最初の引数のいずれかのエレメントが 2 番目の引数の対応するエレメント以上でないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 847

Page 874: IBM XL Fortran for Linux, V15.1

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメント以上でなければ、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ANY_NGT(ARG1, ARG2)目的

最初の引数のいずれかのエレメントが 2 番目の引数の対応するエレメントより大きくないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメントより大きくなければ、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ANY_NLE(ARG1, ARG2)目的

最初の引数のいずれかのエレメントが 2 番目の引数の対応するエレメント以下でないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

848 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 875: IBM XL Fortran for Linux, V15.1

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメント以下でなければ、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ANY_NLT(ARG1, ARG2)目的

最初の引数のいずれかのエレメントが 2 番目の引数の対応するエレメントより小さくないかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

ARG1 のいずれかのエレメントが ARG2 の対応するエレメントより小さくなければ、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ANY_NUMERIC(ARG1)目的

指定されたベクトルのいずれかのエレメントが数値である (NaN ではない) かどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

結果型および属性

結果は INTEGER(4) です。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 849

Page 876: IBM XL Fortran for Linux, V15.1

結果値

ARG1 のいずれかのエレメントが数値である (NaN ではない) 場合、結果は 1 です。それ以外の場合、結果は 0 です。

VEC_ANY_OUT(ARG1, ARG2)目的

指定されたベクトルのいずれかのエレメントの値が、指定された範囲の外側にあるかどうかをテストします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) REAL(4) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) です。

結果値

任意の ARG1 エレメントの絶対値が、対応する ARG2 エレメントの値より大きいか、または対応する ARG2 エレメントの値を負にした値より小さい場合、結果は 1

です。それ以外の場合、結果は 0 です。

VEC_AVG(ARG1, ARG2)目的

これは、対応する 2 つの指定ベクトルのエレメントからなる各セットを丸めた平均が入ったベクトルを返します。

クラス

エレメント型関数

引数型および属性ARG1エレメントの kind が 1、2、または 4 である、INTENT(IN) 整数または符号なしベクトル。

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

850 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 877: IBM XL Fortran for Linux, V15.1

結果型および属性

結果は、ARG1 と同じ型のベクトルです。

結果値

結果の各エレメントの値は、対応する ARG1 および ARG2 のエレメントの値を丸めた平均です。

VEC_BPERM (ARG1, ARG2)目的

これは、4 倍長ワードから最大 16 個の 1 ビット値を指定の順序で収集し、その値を結果ベクトル・レジスターの左端ダブル・ワードの右端 16 ビットに指定の順序で配置し、結果の残り部分をゼロにします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) VECTOR(UNSIGNED(1))

ARG2INTENT(IN) VECTOR(UNSIGNED(1))

結果型および属性

ARG1 と同じ。

結果値

a および b を、それぞれ ARG1 および ARG2 とストレージ関連付けされた 128

ビット整数にします。

それぞれの i (0 <= i < 16) について、index が b の i 番目のエレメントのバイト値を示すようにします。

index が 128 以上の場合、結果のビット 48+i は 0 に設定されます。

index が 128 より小さい場合、結果のビット 48+i は、入力 a の index 番目の値に設定されます。

VEC_CEIL(ARG1)

目的

指定されたベクトルの対応するエレメントの値以上で、表現可能な最小の浮動小数点整数値が入っているベクトルを返します。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 851

Page 878: IBM XL Fortran for Linux, V15.1

注: VEC_CEIL は、VEC_ROUNDP のもう 1 つの名前です。詳しくは、 902ページの『VEC_ROUNDP(ARG1)』を参照してください。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

結果型および属性

結果は、ARG1 と同じ型のベクトルです。

結果値

結果の各エレメントには、ARG1 の対応するエレメントの値以上の最小の表現可能な浮動小数点整数値が入ります。

VEC_CIPHER_BE(ARG1,ARG2)

目的

これは、連邦情報処理標準 Publication 197 (FIPS-197) で定義された AES 暗号操作の 1 ラウンドを、指定されたラウンド・キー ARG2 を使用して、中間状態の ARG1

に対して実行します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) UNSIGNED(1) ベクトル

ARG2INTENT(IN) UNSIGNED(1) ベクトル

結果型および属性

UNSIGNED(1) ベクトル

結果値

結果の中間状態を返します。

852 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 879: IBM XL Fortran for Linux, V15.1

VEC_CIPHERLAST_BE(ARG1,ARG2)

目的

これは、連邦情報処理標準 Publication 197 (FIPS-197) で定義された AES 暗号操作の最終ラウンドを、指定されたラウンド・キー ARG2 を使用して、中間状態の ARG1

に対して実行します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) UNSIGNED(1) ベクトル

ARG2INTENT(IN) UNSIGNED(1) ベクトル

結果型および属性

UNSIGNED(1) ベクトル

結果値

結果として得られる最終状態を返します。

VEC_CMPB(ARG1, ARG2)目的

指定されたベクトルの対応するエレメントからなる各セットについて、境界の比較を実行します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) REAL(4) ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果は INTEGER(4) ベクトルです。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 853

Page 880: IBM XL Fortran for Linux, V15.1

結果値

結果の各エレメントの値は、ARG1 の対応するエレメントの値が ARG2 の対応するエレメントの値以下であり、かつ、ARG2 の対応するエレメントの値を負にした値以上であれば、0 です。それ以外の場合、結果は以下のように決定されます。

v ARG2 のエレメントのうちゼロ以上のエレメントについては、結果の対応するエレメントの値は、ARG1 の対応するエレメントの絶対値が ARG2 の対応するエレメントの値と等しければ 0 であり、 ARG2 の対応するエレメントの値より大きければ負であり、 ARG2 の対応するエレメントの値より小さければ正です。

v ARG2 のエレメントがゼロより小さい場合に、対応する ARG1 エレメントの値がARG2 のエレメントの値以下であると、結果のエレメントの値は正数になり、それ以外の場合は負数になります。

VEC_CMPEQ(ARG1, ARG2)

目的

指定されたベクトルの対応する各エレメント・セットについて、それらが等しいかどうかを比較した結果が入っているベクトルを返します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

以下の表は、VEC_CMPEQ() の結果型を示しています。

表 60. VEC_CMPEQ() の結果型

ARG1 結果型

VECTOR(INTEGER(1)) VECTOR(UNSIGNED(1))

VECTOR(UNSIGNED(1))

VECTOR(INTEGER(2)) VECTOR(UNSIGNED(2))

VECTOR(UNSIGNED(2))

VECTOR(INTEGER(4)) VECTOR(UNSIGNED(4))

VECTOR(UNSIGNED(4))

VECTOR(REAL(4))

VECTOR(INTEGER(8)) VECTOR(UNSIGNED(8))

VECTOR(UNSIGNED(8))

VECTOR(REAL(8))

854 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 881: IBM XL Fortran for Linux, V15.1

結果値

ARG1 およびARG2 の対応するエレメントが等しければ、結果の各エレメントは、各ビットの値が 1 です。そうでない場合、各ビットの値は 0 です。

VEC_CMPGE(ARG1, ARG2)目的

指定されたベクトルの対応するエレメントからなる各セットの、以上かどうかの比較の結果が入ったベクトルを戻します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) VECTOR(INTEGER(8))、VECTOR(UNSIGNED(8))、または実数ベクトル。

ARG2ARG1 と同じ型の INTENT(IN) ベクトル。

結果型および属性

結果は、ARG1 が REAL(4) ベクトルであれば、UNSIGNED(4) ベクトルになります。

結果は、ARG1 が INTEGER(8)、UNSIGNED(8)、または REAL(8) ベクトルであれば、UNSIGNED(8) ベクトルになります。

結果値

結果の各エレメントでは、ARG1 の対応するエレメントの値が ARG2 の対応するエレメントの値以上であれば、各ビットの値は 1 になります。それ以外の場合、各ビットの値は 0 です。

VEC_CMPGT(ARG1, ARG2)

目的

指定されたベクトルの対応する各エレメント・セットについて、一方が他方より大きいかどうかを比較した結果が入っているベクトルを返します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 855

Page 882: IBM XL Fortran for Linux, V15.1

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

以下の表は、VEC_CMPGT() の結果型を示しています。

表 61. VEC_CMPGT() の結果型

ARG1 結果型

VECTOR(INTEGER(1)) VECTOR(UNSIGNED(1))

VECTOR(UNSIGNED(1))

VECTOR(INTEGER(2)) VECTOR(UNSIGNED(2))

VECTOR(UNSIGNED(2))

VECTOR(INTEGER(4)) VECTOR(UNSIGNED(4))

VECTOR(UNSIGNED(4))

VECTOR(REAL(4))

VECTOR(INTEGER(8)) VECTOR(UNSIGNED(8))

VECTOR(UNSIGNED(8))

VECTOR(REAL(8))

結果値

結果の各エレメントについて、ARG1 の対応するエレメントの値が ARG2 の対応するエレメントの値より大きい場合、各ビットの値は 1 になります。そうでない場合、各ビットの値は 0 です。

VEC_CMPLE(ARG1, ARG2)目的

指定されたベクトルの対応するエレメントからなる各セットの、以下かどうかの比較の結果が入ったベクトルを戻します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) VECTOR(INTEGER(8))、VECTOR(UNSIGNED(8))、または実数ベクトル。

ARG2ARG1 と同じ型の INTENT(IN) ベクトル。

結果型および属性

結果は、ARG1 が REAL(4) ベクトルであれば、UNSIGNED(4) ベクトルになります。

結果は、ARG1 が INTEGER(8)、UNSIGNED(8)、または REAL(8) ベクトルであれば、UNSIGNED(8) ベクトルになります。

856 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 883: IBM XL Fortran for Linux, V15.1

結果値

結果の各エレメントでは、ARG1 の対応するエレメントの値が ARG2 の対応するエレメントの値以下であれば、各ビットの値は 1 になります。それ以外の場合、各ビットの値は 0 です。

VEC_CMPLT(ARG1, ARG2)

目的

指定されたベクトルの対応する各エレメント・セットについて、一方が他方より小さいかどうかを比較した結果が入っているベクトルを返します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

以下の表は、VEC_CMPLT() の結果型を示しています。

表 62. VEC_CMPLT() の結果型

ARG1 結果型

VECTOR(INTEGER(1)) VECTOR(UNSIGNED(1))

VECTOR(UNSIGNED(1))

VECTOR(INTEGER(2)) VECTOR(UNSIGNED(2))

VECTOR(UNSIGNED(2))

VECTOR(INTEGER(4)) VECTOR(UNSIGNED(4))

VECTOR(UNSIGNED(4))

VECTOR(REAL(4))

VECTOR(INTEGER(8)) VECTOR(UNSIGNED(8))

VECTOR(UNSIGNED(8))

VECTOR(REAL(8))

結果値

結果の各エレメントについて、ARG1 の対応するエレメントの値が ARG2 の対応するエレメントの値より小さい場合、各ビットの値は 1 になります。そうでない場合、各ビットの値は 0 です。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 857

Page 884: IBM XL Fortran for Linux, V15.1

VEC_CNTLZ(ARG1)目的

入力の各エレメントの先行ゼロ・ビットの数を計算します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトルまたは符号なしベクトル。

結果型および属性

ARG1 と同じ種類の符号なしベクトルの結果。

結果値

結果の各エレメントは、ARG1 の対応するエレメントの先行ゼロの数に設定されます。

VEC_CONVERT(V, MOLD)目的

ベクトルを、指定された型のベクトルに変換します。

クラス

純粋関数

引数型および属性V INTENT(IN) ベクトル

MOLDINTENT(IN) ベクトル

変数である場合、定義される必要はありません。

結果型および属性

結果は、MOLD と同じ型のベクトルです。

結果値

結果は、右辺に V がある組み込み代入式の左辺にあるかのようなものになります。

858 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 885: IBM XL Fortran for Linux, V15.1

VEC_CPSGN(ARG1, ARG2)

目的

ベクトル ARG1 のエレメントの符号をベクトル ARG2 の対応するエレメントの符号にコピーして、ベクトルを返します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果型は ARG1 と同じです。

VEC_CTD(ARG1, ARG2)目的

整数ベクトルを REAL(8) ベクトルに変換します。

結果値

結果のエレメントごとに、ARG1 の対応するエレメントを REAL(8) に変換し、結果を、2 の ARG2 乗で割ります。

注: ARG1 の 2 番目および 4 番目のエレメントは、ARG1 が INTEGER(4) ベクトルまたは UNSIGNED(4) ベクトルである場合、使用されません。

クラス

エレメント型関数

引数型および属性ARG1エレメントの kind が 4 または 8 である、INTENT(IN) 整数または符号なしベクトル。

ARG2INTENT(IN) 整数。この値は、0 から 31 の範囲内の値を持つ定数式によって指定する必要があります。

結果型および属性

結果は REAL(8) ベクトルです。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 859

Page 886: IBM XL Fortran for Linux, V15.1

VEC_CTF(ARG1, ARG2)目的

整数ベクトルを REAL(4) ベクトルに変換します。

クラス

エレメント型関数

引数型および属性ARG1エレメントの kind が 4 または 8 である、INTENT(IN) 整数または符号なしベクトル。

ARG2INTENT(IN) 整数。この値は、0 から 31 の範囲内の値を持つ定数式によって指定する必要があります。

結果型および属性

結果は REAL(4) ベクトルです。

結果値

結果の各エレメントの値は、ARG1 の対応するエレメントの値を 2 の ARG2 乗で除算した値に最も近い浮動小数点概算値です。

注: ARG1 のエレメントが kind 8 である場合、結果ベクトルの2 番目と 4 番目のエレメントは未定義です。

VEC_CTS(ARG1, ARG2)目的

実数ベクトルを INTEGER(4) ベクトルに変換します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2INTENT(IN) 整数。この値は、0 から 31 の範囲内の値を持つ定数式によって指定する必要があります。

結果型および属性

結果は INTEGER(4) ベクトルです。

860 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 887: IBM XL Fortran for Linux, V15.1

結果値

結果の各エレメントの値は、ARG1 の対応するエレメントの値と 2 の ARG2 乗との乗算で得られる飽和値です。

注: ARG1 が REAL(8) ベクトルの場合、結果ベクトルの 2 番目および 4 番目のエレメントは未定義になります。

VEC_CTSL(ARG1, ARG2)目的

実数ベクトルを INTEGER(8) ベクトルに変換します。

結果値

結果の各エレメントの値は、ARG1 の対応するエレメントの値と 2 の ARG2 乗を乗算し、結果を整数に変換した飽和値です。

注: ARG1 が REAL(4) ベクトルである場合、この関数は、ARG1 の 2 番目と 4 番目のエレメントを使用しません。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

ARG2INTENT(IN) 整数。この値は、0 から 31 の範囲内の値を持つ定数式によって指定する必要があります。

結果型および属性

結果は INTEGER(8) ベクトルです。

VEC_CTU(ARG1, ARG2)目的

実数ベクトルを UNSIGNED(4) ベクトルに変換します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 861

Page 888: IBM XL Fortran for Linux, V15.1

ARG2INTENT(IN) 整数。この値は、0 から 31 の範囲内の値を持つ定数式によって指定する必要があります。

結果型および属性

結果は UNSIGNED(4) ベクトルです。

結果値

結果の各エレメントの値は、ARG1 の対応するエレメントの値と 2 の ARG2 乗との乗算で得られる飽和値です。

注: ARG1 が REAL(8) ベクトルの場合、結果ベクトルの 2 番目および 4 番目のエレメントは未定義になります。

VEC_CTUL(ARG1, ARG2)目的

実数ベクトルを UNSIGNED(8) ベクトルに変換します。

結果値

結果の各エレメントの値は、ARG1 の対応するエレメントを 2 の ARG2 乗で乗算して得られた飽和値です。

注: ARG1 が REAL(8) ベクトルの場合、結果ベクトルの 2 番目および 4 番目のエレメントは未定義になります。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル。

ARG2INTENT(IN) 整数。この値は、0 から 31 の範囲内の値を持つ定数式によって指定する必要があります。

結果型および属性

結果は UNSIGNED(8) ベクトルです。

VEC_CVF(ARG1)目的

REAL(4) ベクトルを REAL(8) ベクトルに変換し、その逆の変換も行います。

862 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 889: IBM XL Fortran for Linux, V15.1

結果値

ARG1 が REAL(4) ベクトルの場合、結果の各エレメントは ARG1 の対応するエレメントと同じであり、REAL(8) に変換されます。 ARG1 の 2 番目および 4 番目のエレメントは使用されません。

ARG1 が REAL(8) ベクトルの場合、結果の最初および 3 番目のエレメントは ARG1

の対応するエレメントと同じであり、REAL(4) に変換されます。結果ベクトルの 2

番目および 4 番目のエレメントの値は未定義です。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 実数ベクトル

結果型および属性

結果は、ARG1 が REAL(4) ベクトルの場合に REAL(8) ベクトル、ARG1 が REAL(8)

ベクトルの場合に REAL(4) ベクトルです。

VEC_DIV(ARG1, ARG2)目的

ベクトル ARG1 内のエレメントをベクトル ARG2 内の対応するエレメントで割り、その結果を結果ベクトル内の対応するエレメントに代入します。

注: 整数ベクトルと符号なしベクトルの場合には、この関数は演算をエミュレートします。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトル、符号なしベクトル、または実数ベクトル

ARG2ARG1 と同じ型の INTENT(IN) ベクトル

結果型および属性

結果の型は、ARG1 と同じです。

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 863

Page 890: IBM XL Fortran for Linux, V15.1

VEC_DSS(ARG1)目的

ARG1 で指定されたデータ・ストリーム読み取りを停止します。

クラス

サブルーチン

引数型および属性ARG1

INTENT(IN) 整数です。これは、0 から 3 までの範囲にある値を持つ定数式で指定する必要があります。

VEC_DSSALL目的

すべてのデータ・ストリーム読み取りを停止します。

クラス

サブルーチン

VEC_DST(ARG1, ARG2, ARG3)目的

キャッシュへの行のデータ読み取りを、読み取りに最も効率的な状態で開始します。

ARG3 で指定されたデータ・ストリームが、ARG2 で指定された制御ワードを使用して、ARG1 で指定されたアドレスを開始位置にして読み取られます。この組み込みプロシージャーを使用するときに指定されるデータ・ストリームは比較的永続的な性質のものとなります。

クラス

サブルーチン

引数型および属性ARG1以下のいずれかの型の INTENT(IN) 変数。

v INTEGER(1)、INTEGER(2)、INTEGER(4)、または REAL(4)

v VECTOR(INTEGER(1))、VECTOR(INTEGER(2))、または VECTOR(INTEGER(4))

v VECTOR(UNSIGNED(1))、VECTOR(UNSIGNED(2))、または VECTOR(UNSIGNED(4))

v VECTOR(REAL(4))

v VECTOR(PIXEL)

864 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 891: IBM XL Fortran for Linux, V15.1

ARG2INTENT(IN) 整数

ARG3INTENT(IN) 整数

これは、0 から 3 までの範囲にある値を持つ定数式で指定する必要があります。

VEC_DSTST(ARG1, ARG2, ARG3)目的

キャッシュへの行のデータ読み取りを、書き込みに最も効率的な状態で開始します。

ARG3 で指定されたデータ・ストリームが、ARG2 で指定された制御ワードを使用して、ARG1 で指定されたアドレスを開始位置にして読み取られます。この組み込みプロシージャーを使用するときに指定されるデータ・ストリームは比較的永続的な性質のものとなります。

クラス

サブルーチン

引数型および属性ARG1以下のいずれかの型の INTENT(IN) 変数。

v INTEGER(1)、INTEGER(2)、INTEGER(4)、または REAL(4)

v VECTOR(INTEGER(1))、VECTOR(INTEGER(2))、または VECTOR(INTEGER(4))

v VECTOR(UNSIGNED(1))、VECTOR(UNSIGNED(2))、または VECTOR(UNSIGNED(4))

v VECTOR(REAL(4))

v VECTOR(PIXEL)

ARG2INTENT(IN) 整数

ARG3INTENT(IN) 整数

これは、0 から 3 までの範囲にある値を持つ定数式で指定する必要があります。

VEC_DSTSTT(ARG1, ARG2, ARG3)目的

キャッシュへの行のデータ読み取りを、書き込みに最も効率的な状態で開始します。

ARG3 で指定されたデータ・ストリームが、ARG2 で指定された制御ワードを使用して、ARG1 で指定されたアドレスを開始位置にして読み取られます。この組み込みプ

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 865

Page 892: IBM XL Fortran for Linux, V15.1

ロシージャーを使用するときに指定されるデータ・ストリームは比較的一時的な性質のものとなります。

クラス

サブルーチン

引数型および属性ARG1以下のいずれかの型の INTENT(IN) 変数。

v INTEGER(1)、INTEGER(2)、INTEGER(4)、または REAL(4)

v VECTOR(INTEGER(1))、VECTOR(INTEGER(2))、または VECTOR(INTEGER(4))

v VECTOR(UNSIGNED(1))、VECTOR(UNSIGNED(2))、または VECTOR(UNSIGNED(4))

v VECTOR(REAL(4))

v VECTOR(PIXEL)

ARG2INTENT(IN) 整数

ARG3INTENT(IN) 整数

これは、0 から 3 までの範囲にある値を持つ定数式で指定する必要があります。

VEC_DSTT(ARG1, ARG2, ARG3)目的

キャッシュへの行のデータ読み取りを、読み取りに最も効率的な状態で開始します。

ARG3 で指定されたデータ・ストリームが、ARG2 で指定された制御ワードを使用して、ARG1 で指定されたアドレスを開始位置にして読み取られます。この組み込みプロシージャーを使用するときに指定されるデータ・ストリームは比較的一時的な性質のものとなります。

クラス

サブルーチン

引数型および属性ARG1以下のいずれかの型の INTENT(IN) 変数。

v INTEGER(1)、INTEGER(2)、INTEGER(4)、または REAL(4)

v VECTOR(INTEGER(1))、VECTOR(INTEGER(2))、または VECTOR(INTEGER(4))

v VECTOR(UNSIGNED(1))、VECTOR(UNSIGNED(2))、または VECTOR(UNSIGNED(4))

v VECTOR(REAL(4))

v VECTOR(PIXEL)

866 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 893: IBM XL Fortran for Linux, V15.1

ARG2INTENT(IN) 整数

ARG3INTENT(IN) 整数

これは、0 から 3 までの範囲にある値を持つ定数式で指定する必要があります。

VEC_EQV(ARG1, ARG2)目的

入力ベクトルのビット単位の等価演算を行います。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトルまたは符号なしベクトル。

ARG2ARG1 と同じ型の INTENT(IN) ベクトル。

結果型および属性

結果型は ARG1 と同じです。

結果値

結果の各ビットは、ARG1 および ARG2 の対応するビットの、ビット単位演算 (ARG1

== ARG2) の結果に設定されます。0 <= i < 128 の場合、結果のビット i は、ARG1

のビット i が ARG2 のビット i と等しい場合にのみ、1 に設定されます。

VEC_EXPTE(ARG1)目的

指定されたベクトルの対応する値だけ 2 を累乗した値の概算値が入ったベクトルを戻します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) REAL(4) ベクトル

第 17 章 ベクトルの組み込みプロシージャー (IBM 拡張) 867

Page 894: IBM XL Fortran for Linux, V15.1

結果型および属性

結果は、ARG1 と同じ型のベクトルです。

結果値

結果の各エレメントには、対応する ARG1 エレメントの値を 2 乗した推定値が含まれます。

VEC_EXTRACT(ARG1, ARG2)

目的

ベクトル ARG1 からエレメント ARG2 の値を返します。

クラス

エレメント型関数

引数型および属性ARG1

INTENT(IN) 整数ベクトルまたは実数ベクトル

ARG2INTENT(IN) 整数

結果型および属性

結果の型と kind は、ARG1 のエレメントと同じです。

結果値

この関数は、ARG2 に対するモジュロ演算を使用して、エレメント番号を判別します。例えば、ARG2 が範囲外の場合、コンパイラーは ARG2 に対するベクトル内のエレメント数のモジュロを計算して、エレメントの位置を判別します。

VEC_FLOOR(ARG1)

目的

指定されたベクトルの対応するエレメントの値以下で、表現可能な最大の浮動小数点整数値が入っているベクトルを返します。

注: VEC_FLOOR は、VEC_ROUNDM のもう 1 つの名前です。詳しくは、 901ページの『VEC_ROUNDM(ARG1)』を参照してください。

クラス

エレメント型関数

868 XL Fortran: ランゲージ・リファレンス (リトル・エンディアン・ディストリビューション用)

Page 895: IBM XL Fortran for Linux, V15.1
Page 896: IBM XL Fortran for Linux, V15.1
Page 897: IBM XL Fortran for Linux, V15.1
Page 898: IBM XL Fortran for Linux, V15.1
Page 899: IBM XL Fortran for Linux, V15.1
Page 900: IBM XL Fortran for Linux, V15.1
Page 901: IBM XL Fortran for Linux, V15.1
Page 902: IBM XL Fortran for Linux, V15.1
Page 903: IBM XL Fortran for Linux, V15.1
Page 904: IBM XL Fortran for Linux, V15.1
Page 905: IBM XL Fortran for Linux, V15.1
Page 906: IBM XL Fortran for Linux, V15.1
Page 907: IBM XL Fortran for Linux, V15.1
Page 908: IBM XL Fortran for Linux, V15.1
Page 909: IBM XL Fortran for Linux, V15.1
Page 910: IBM XL Fortran for Linux, V15.1
Page 911: IBM XL Fortran for Linux, V15.1
Page 912: IBM XL Fortran for Linux, V15.1
Page 913: IBM XL Fortran for Linux, V15.1
Page 914: IBM XL Fortran for Linux, V15.1
Page 915: IBM XL Fortran for Linux, V15.1
Page 916: IBM XL Fortran for Linux, V15.1
Page 917: IBM XL Fortran for Linux, V15.1
Page 918: IBM XL Fortran for Linux, V15.1
Page 919: IBM XL Fortran for Linux, V15.1
Page 920: IBM XL Fortran for Linux, V15.1
Page 921: IBM XL Fortran for Linux, V15.1
Page 922: IBM XL Fortran for Linux, V15.1
Page 923: IBM XL Fortran for Linux, V15.1
Page 924: IBM XL Fortran for Linux, V15.1
Page 925: IBM XL Fortran for Linux, V15.1
Page 926: IBM XL Fortran for Linux, V15.1
Page 927: IBM XL Fortran for Linux, V15.1
Page 928: IBM XL Fortran for Linux, V15.1
Page 929: IBM XL Fortran for Linux, V15.1
Page 930: IBM XL Fortran for Linux, V15.1
Page 931: IBM XL Fortran for Linux, V15.1
Page 932: IBM XL Fortran for Linux, V15.1
Page 933: IBM XL Fortran for Linux, V15.1
Page 934: IBM XL Fortran for Linux, V15.1
Page 935: IBM XL Fortran for Linux, V15.1
Page 936: IBM XL Fortran for Linux, V15.1
Page 937: IBM XL Fortran for Linux, V15.1
Page 938: IBM XL Fortran for Linux, V15.1
Page 939: IBM XL Fortran for Linux, V15.1
Page 940: IBM XL Fortran for Linux, V15.1
Page 941: IBM XL Fortran for Linux, V15.1
Page 942: IBM XL Fortran for Linux, V15.1
Page 943: IBM XL Fortran for Linux, V15.1
Page 944: IBM XL Fortran for Linux, V15.1
Page 945: IBM XL Fortran for Linux, V15.1
Page 946: IBM XL Fortran for Linux, V15.1
Page 947: IBM XL Fortran for Linux, V15.1
Page 948: IBM XL Fortran for Linux, V15.1
Page 949: IBM XL Fortran for Linux, V15.1
Page 950: IBM XL Fortran for Linux, V15.1
Page 951: IBM XL Fortran for Linux, V15.1
Page 952: IBM XL Fortran for Linux, V15.1
Page 953: IBM XL Fortran for Linux, V15.1
Page 954: IBM XL Fortran for Linux, V15.1
Page 955: IBM XL Fortran for Linux, V15.1
Page 956: IBM XL Fortran for Linux, V15.1
Page 957: IBM XL Fortran for Linux, V15.1
Page 958: IBM XL Fortran for Linux, V15.1
Page 959: IBM XL Fortran for Linux, V15.1
Page 960: IBM XL Fortran for Linux, V15.1
Page 961: IBM XL Fortran for Linux, V15.1
Page 962: IBM XL Fortran for Linux, V15.1
Page 963: IBM XL Fortran for Linux, V15.1
Page 964: IBM XL Fortran for Linux, V15.1
Page 965: IBM XL Fortran for Linux, V15.1
Page 966: IBM XL Fortran for Linux, V15.1
Page 967: IBM XL Fortran for Linux, V15.1
Page 968: IBM XL Fortran for Linux, V15.1
Page 969: IBM XL Fortran for Linux, V15.1
Page 970: IBM XL Fortran for Linux, V15.1
Page 971: IBM XL Fortran for Linux, V15.1
Page 972: IBM XL Fortran for Linux, V15.1
Page 973: IBM XL Fortran for Linux, V15.1
Page 974: IBM XL Fortran for Linux, V15.1
Page 975: IBM XL Fortran for Linux, V15.1
Page 976: IBM XL Fortran for Linux, V15.1
Page 977: IBM XL Fortran for Linux, V15.1
Page 978: IBM XL Fortran for Linux, V15.1
Page 979: IBM XL Fortran for Linux, V15.1
Page 980: IBM XL Fortran for Linux, V15.1
Page 981: IBM XL Fortran for Linux, V15.1
Page 982: IBM XL Fortran for Linux, V15.1
Page 983: IBM XL Fortran for Linux, V15.1
Page 984: IBM XL Fortran for Linux, V15.1
Page 985: IBM XL Fortran for Linux, V15.1
Page 986: IBM XL Fortran for Linux, V15.1
Page 987: IBM XL Fortran for Linux, V15.1
Page 988: IBM XL Fortran for Linux, V15.1
Page 989: IBM XL Fortran for Linux, V15.1
Page 990: IBM XL Fortran for Linux, V15.1
Page 991: IBM XL Fortran for Linux, V15.1
Page 992: IBM XL Fortran for Linux, V15.1
Page 993: IBM XL Fortran for Linux, V15.1
Page 994: IBM XL Fortran for Linux, V15.1
Page 995: IBM XL Fortran for Linux, V15.1
Page 996: IBM XL Fortran for Linux, V15.1
Page 997: IBM XL Fortran for Linux, V15.1
Page 998: IBM XL Fortran for Linux, V15.1
Page 999: IBM XL Fortran for Linux, V15.1
Page 1000: IBM XL Fortran for Linux, V15.1
Page 1001: IBM XL Fortran for Linux, V15.1
Page 1002: IBM XL Fortran for Linux, V15.1
Page 1003: IBM XL Fortran for Linux, V15.1
Page 1004: IBM XL Fortran for Linux, V15.1
Page 1005: IBM XL Fortran for Linux, V15.1
Page 1006: IBM XL Fortran for Linux, V15.1
Page 1007: IBM XL Fortran for Linux, V15.1
Page 1008: IBM XL Fortran for Linux, V15.1
Page 1009: IBM XL Fortran for Linux, V15.1
Page 1010: IBM XL Fortran for Linux, V15.1
Page 1011: IBM XL Fortran for Linux, V15.1
Page 1012: IBM XL Fortran for Linux, V15.1
Page 1013: IBM XL Fortran for Linux, V15.1
Page 1014: IBM XL Fortran for Linux, V15.1
Page 1015: IBM XL Fortran for Linux, V15.1
Page 1016: IBM XL Fortran for Linux, V15.1
Page 1017: IBM XL Fortran for Linux, V15.1
Page 1018: IBM XL Fortran for Linux, V15.1
Page 1019: IBM XL Fortran for Linux, V15.1
Page 1020: IBM XL Fortran for Linux, V15.1
Page 1021: IBM XL Fortran for Linux, V15.1
Page 1022: IBM XL Fortran for Linux, V15.1
Page 1023: IBM XL Fortran for Linux, V15.1
Page 1024: IBM XL Fortran for Linux, V15.1
Page 1025: IBM XL Fortran for Linux, V15.1
Page 1026: IBM XL Fortran for Linux, V15.1
Page 1027: IBM XL Fortran for Linux, V15.1
Page 1028: IBM XL Fortran for Linux, V15.1
Page 1029: IBM XL Fortran for Linux, V15.1
Page 1030: IBM XL Fortran for Linux, V15.1
Page 1031: IBM XL Fortran for Linux, V15.1
Page 1032: IBM XL Fortran for Linux, V15.1
Page 1033: IBM XL Fortran for Linux, V15.1
Page 1034: IBM XL Fortran for Linux, V15.1
Page 1035: IBM XL Fortran for Linux, V15.1
Page 1036: IBM XL Fortran for Linux, V15.1
Page 1037: IBM XL Fortran for Linux, V15.1
Page 1038: IBM XL Fortran for Linux, V15.1
Page 1039: IBM XL Fortran for Linux, V15.1
Page 1040: IBM XL Fortran for Linux, V15.1
Page 1041: IBM XL Fortran for Linux, V15.1
Page 1042: IBM XL Fortran for Linux, V15.1
Page 1043: IBM XL Fortran for Linux, V15.1
Page 1044: IBM XL Fortran for Linux, V15.1
Page 1045: IBM XL Fortran for Linux, V15.1
Page 1046: IBM XL Fortran for Linux, V15.1
Page 1047: IBM XL Fortran for Linux, V15.1
Page 1048: IBM XL Fortran for Linux, V15.1
Page 1049: IBM XL Fortran for Linux, V15.1
Page 1050: IBM XL Fortran for Linux, V15.1
Page 1051: IBM XL Fortran for Linux, V15.1
Page 1052: IBM XL Fortran for Linux, V15.1
Page 1053: IBM XL Fortran for Linux, V15.1
Page 1054: IBM XL Fortran for Linux, V15.1
Page 1055: IBM XL Fortran for Linux, V15.1
Page 1056: IBM XL Fortran for Linux, V15.1
Page 1057: IBM XL Fortran for Linux, V15.1
Page 1058: IBM XL Fortran for Linux, V15.1
Page 1059: IBM XL Fortran for Linux, V15.1
Page 1060: IBM XL Fortran for Linux, V15.1
Page 1061: IBM XL Fortran for Linux, V15.1
Page 1062: IBM XL Fortran for Linux, V15.1
Page 1063: IBM XL Fortran for Linux, V15.1
Page 1064: IBM XL Fortran for Linux, V15.1
Page 1065: IBM XL Fortran for Linux, V15.1
Page 1066: IBM XL Fortran for Linux, V15.1
Page 1067: IBM XL Fortran for Linux, V15.1
Page 1068: IBM XL Fortran for Linux, V15.1
Page 1069: IBM XL Fortran for Linux, V15.1
Page 1070: IBM XL Fortran for Linux, V15.1
Page 1071: IBM XL Fortran for Linux, V15.1
Page 1072: IBM XL Fortran for Linux, V15.1
Page 1073: IBM XL Fortran for Linux, V15.1
Page 1074: IBM XL Fortran for Linux, V15.1
Page 1075: IBM XL Fortran for Linux, V15.1
Page 1076: IBM XL Fortran for Linux, V15.1
Page 1077: IBM XL Fortran for Linux, V15.1
Page 1078: IBM XL Fortran for Linux, V15.1
Page 1079: IBM XL Fortran for Linux, V15.1
Page 1080: IBM XL Fortran for Linux, V15.1
Page 1081: IBM XL Fortran for Linux, V15.1
Page 1082: IBM XL Fortran for Linux, V15.1
Page 1083: IBM XL Fortran for Linux, V15.1
Page 1084: IBM XL Fortran for Linux, V15.1
Page 1085: IBM XL Fortran for Linux, V15.1
Page 1086: IBM XL Fortran for Linux, V15.1
Page 1087: IBM XL Fortran for Linux, V15.1
Page 1088: IBM XL Fortran for Linux, V15.1
Page 1089: IBM XL Fortran for Linux, V15.1
Page 1090: IBM XL Fortran for Linux, V15.1
Page 1091: IBM XL Fortran for Linux, V15.1
Page 1092: IBM XL Fortran for Linux, V15.1
Page 1093: IBM XL Fortran for Linux, V15.1
Page 1094: IBM XL Fortran for Linux, V15.1
Page 1095: IBM XL Fortran for Linux, V15.1
Page 1096: IBM XL Fortran for Linux, V15.1
Page 1097: IBM XL Fortran for Linux, V15.1
Page 1098: IBM XL Fortran for Linux, V15.1
Page 1099: IBM XL Fortran for Linux, V15.1
Page 1100: IBM XL Fortran for Linux, V15.1
Page 1101: IBM XL Fortran for Linux, V15.1
Page 1102: IBM XL Fortran for Linux, V15.1
Page 1103: IBM XL Fortran for Linux, V15.1
Page 1104: IBM XL Fortran for Linux, V15.1
Page 1105: IBM XL Fortran for Linux, V15.1
Page 1106: IBM XL Fortran for Linux, V15.1
Page 1107: IBM XL Fortran for Linux, V15.1
Page 1108: IBM XL Fortran for Linux, V15.1
Page 1109: IBM XL Fortran for Linux, V15.1
Page 1110: IBM XL Fortran for Linux, V15.1
Page 1111: IBM XL Fortran for Linux, V15.1
Page 1112: IBM XL Fortran for Linux, V15.1
Page 1113: IBM XL Fortran for Linux, V15.1
Page 1114: IBM XL Fortran for Linux, V15.1
Page 1115: IBM XL Fortran for Linux, V15.1
Page 1116: IBM XL Fortran for Linux, V15.1
Page 1117: IBM XL Fortran for Linux, V15.1
Page 1118: IBM XL Fortran for Linux, V15.1
Page 1119: IBM XL Fortran for Linux, V15.1
Page 1120: IBM XL Fortran for Linux, V15.1
Page 1121: IBM XL Fortran for Linux, V15.1
Page 1122: IBM XL Fortran for Linux, V15.1
Page 1123: IBM XL Fortran for Linux, V15.1
Page 1124: IBM XL Fortran for Linux, V15.1
Page 1125: IBM XL Fortran for Linux, V15.1
Page 1126: IBM XL Fortran for Linux, V15.1
Page 1127: IBM XL Fortran for Linux, V15.1
Page 1128: IBM XL Fortran for Linux, V15.1
Page 1129: IBM XL Fortran for Linux, V15.1
Page 1130: IBM XL Fortran for Linux, V15.1
Page 1131: IBM XL Fortran for Linux, V15.1
Page 1132: IBM XL Fortran for Linux, V15.1
Page 1133: IBM XL Fortran for Linux, V15.1
Page 1134: IBM XL Fortran for Linux, V15.1
Page 1135: IBM XL Fortran for Linux, V15.1
Page 1136: IBM XL Fortran for Linux, V15.1
Page 1137: IBM XL Fortran for Linux, V15.1
Page 1138: IBM XL Fortran for Linux, V15.1
Page 1139: IBM XL Fortran for Linux, V15.1
Page 1140: IBM XL Fortran for Linux, V15.1
Page 1141: IBM XL Fortran for Linux, V15.1
Page 1142: IBM XL Fortran for Linux, V15.1
Page 1143: IBM XL Fortran for Linux, V15.1
Page 1144: IBM XL Fortran for Linux, V15.1
Page 1145: IBM XL Fortran for Linux, V15.1
Page 1146: IBM XL Fortran for Linux, V15.1
Page 1147: IBM XL Fortran for Linux, V15.1
Page 1148: IBM XL Fortran for Linux, V15.1
Page 1149: IBM XL Fortran for Linux, V15.1
Page 1150: IBM XL Fortran for Linux, V15.1
Page 1151: IBM XL Fortran for Linux, V15.1
Page 1152: IBM XL Fortran for Linux, V15.1
Page 1153: IBM XL Fortran for Linux, V15.1
Page 1154: IBM XL Fortran for Linux, V15.1
Page 1155: IBM XL Fortran for Linux, V15.1
Page 1156: IBM XL Fortran for Linux, V15.1
Page 1157: IBM XL Fortran for Linux, V15.1
Page 1158: IBM XL Fortran for Linux, V15.1
Page 1159: IBM XL Fortran for Linux, V15.1
Page 1160: IBM XL Fortran for Linux, V15.1
Page 1161: IBM XL Fortran for Linux, V15.1
Page 1162: IBM XL Fortran for Linux, V15.1
Page 1163: IBM XL Fortran for Linux, V15.1
Page 1164: IBM XL Fortran for Linux, V15.1
Page 1165: IBM XL Fortran for Linux, V15.1
Page 1166: IBM XL Fortran for Linux, V15.1
Page 1167: IBM XL Fortran for Linux, V15.1
Page 1168: IBM XL Fortran for Linux, V15.1
Page 1169: IBM XL Fortran for Linux, V15.1
Page 1170: IBM XL Fortran for Linux, V15.1
Page 1171: IBM XL Fortran for Linux, V15.1
Page 1172: IBM XL Fortran for Linux, V15.1
Page 1173: IBM XL Fortran for Linux, V15.1
Page 1174: IBM XL Fortran for Linux, V15.1
Page 1175: IBM XL Fortran for Linux, V15.1
Page 1176: IBM XL Fortran for Linux, V15.1
Page 1177: IBM XL Fortran for Linux, V15.1
Page 1178: IBM XL Fortran for Linux, V15.1
Page 1179: IBM XL Fortran for Linux, V15.1
Page 1180: IBM XL Fortran for Linux, V15.1
Page 1181: IBM XL Fortran for Linux, V15.1
Page 1182: IBM XL Fortran for Linux, V15.1
Page 1183: IBM XL Fortran for Linux, V15.1
Page 1184: IBM XL Fortran for Linux, V15.1
Page 1185: IBM XL Fortran for Linux, V15.1
Page 1186: IBM XL Fortran for Linux, V15.1
Page 1187: IBM XL Fortran for Linux, V15.1
Page 1188: IBM XL Fortran for Linux, V15.1
Page 1189: IBM XL Fortran for Linux, V15.1
Page 1190: IBM XL Fortran for Linux, V15.1
Page 1191: IBM XL Fortran for Linux, V15.1
Page 1192: IBM XL Fortran for Linux, V15.1
Page 1193: IBM XL Fortran for Linux, V15.1
Page 1194: IBM XL Fortran for Linux, V15.1
Page 1195: IBM XL Fortran for Linux, V15.1
Page 1196: IBM XL Fortran for Linux, V15.1

Recommended