共通ブロック (COMMON 文),構造型データ,および Compaq Fortran 記録構造体 (RECORD 文) は,通常は大きな構造中に複数の項目を含んでいます。
次のような宣言では,データが強制的に位置合わせされなくなることがあります。
COMMON 文中の変数の順序は,それら変数の格納の順序を決定します。
共通ブロック中のデータ項目が自然に位置合わせされることが確実にわかっていない限り,使用されるデータの最大値に応じて,/align:commons オプションか /align:dcommons オプションを指定してください。
例と詳しい情報については,「共通ブロック中のデータ項目の配置」を参照してください。
構造型 (ユーザー定義) データの構成要素は,TYPE 文の後に宣言されます。
データに構造型データ構造体が含まれている場合,構造型データ構造体中のデータ項目が自然に位置合わせされることが確実にわかっていない限り,/align:records オプションを指定してください (/vms が指定されていない場合,これが基本設定です)。
SEQUENCE 文を省略すると,/align:records オプションはすべてのデータ項目を自然に位置合わせします。
SEQUENCE 文を指定すると,/align:records オプションは,位置合わせされていないデータが生じるのを防ぐために必要な充填を追加できなくなります (データ項目は詰め込まれます)。SEQUENCE 文を使用する場合,データ宣言の順序を,すべてのデータ項目が自然に位置合わせされるように指定する必要があります。
例と詳しい情報については,「構造データ型中のデータ項目の配置」を参照してください。
Compaq Fortran 記録構造体は,通常,複数のデータ項目を含んでいる言語拡張です。STRUCTURE 文中での変数の順序は,それら変数の格納の順序を決定します。RECORD 文は記録構造体の名前を指定します。
データに Compaq Fortran 記録構造体が含まれているときに,/vms オプションを指定した場合,Compaq Fortran 記録構造体中のデータ項目が自然に位置合わせされることが確実にわかっていない限り,/align:records オプションを指定してください。
例と詳しい情報については,「Compaq Fortran 記録構造体中のデータ項目の配置」を参照してください。
EQUIVALENCE 文は,位置合わせされていないデータや,自然境界にまたがるデータを生じさせることがあります。
共通ブロック,構造型データ,または記録構造体中に位置合わせされていないデータが生じるのを防ぐには,次のいずれか,または両方の手段を取ってください。
新規のプログラムや,ソース・コードの宣言を簡単に変更できるプログラムでは,データ宣言の順序を慎重に計画します。たとえば,COMMON 文中では,数値データが大きいものから小さいものに配置され,最後に文字データが配置されるように変数を並べます (「データが位置合わせされなくなるのを防ぐためのデータ宣言の順序」を参照)。基本種別を使用する INTEGER の代わりに INTEGER(KIND=8) のような明示的な長さの宣言を考慮します。これにより,/real_size および /integer_size のようなコマンド行オプションが INTEGER,LOGICAL,REAL,および COMPLEX 宣言の長さを変更することによるデータの位置合わせの変更を防ぐことができます。
ソース・コードの変更が簡単に行えない既存のプログラムや,構造型または記録構造体を含んでいる配列要素の場合,コマンド行オプションを使って,必要に応じて空白を埋めることで数値データが位置合わせされるように,コンパイラに要求することができます。
位置合わせされていないデータが生じる原因としては,他にも,位置合わせされていない実引数や,構造型構造体または Compaq Fortran 記録構造体を含んでいる配列などがあります。
プログラム単位の外部からの実引数が自然に位置合わせされていないと,位置合わせされていないデータ参照が発生します。Compaq Fortran は,渡されたすべての引数が自然に位置合わせされていると仮定しますし,コンパイル時には,プログラムの実行中に実引数を通して渡されるデータに関して何の情報も持っていません。
個々の配列要素が構造型構造体や Compaq Fortran 記録構造体を含んでいる配列の場合,配列要素の大きさのために,一部の要素 (ただし先頭の要素以外) が位置合わせされていない境界から始まることがあります。
SEQUENCE 文や記録構造体がなく,構造型構造体中でデータ項目が自然に位置合わせされている場合でも,配列要素の大きさのために一部の配列要素が位置合わせされなくなるのを防ぐために,/align オプションを使って必要な充填を行わなければならないことがあります。
/align:norecords を指定するか,/align:records なしで /vms を指定すると,配列要素の間では充填バイトが追加されません。個々の配列要素が SEQUENCE 文付きの構造型構造体を含んでいる場合,どのような DF コマンド・オプションが指定されていても,配列要素は充填バイトなしに詰め込まれます。この場合,一部の要素が位置合わせされなくなります。
/align:records オプションが有効になっている場合,個々の配列要素に対してコンパイラが追加する充填バイト数は,構造体中の最も大きなデータ項目の大きさに依存します。コンパイラは,SEQUENCE 文のない構造型構造体,または記録構造体中の最も大きなデータ項目の倍数として,配列要素の大きさを計算します。その後,コンパイラは適切な数の充填バイトを追加します。
たとえば,構造体が 8 バイトの浮動小数点数の後に 3 バイトの文字変数を含んでいる場合,各要素は 5 バイトの充填を含むことになります (16 が 8 の倍数であるため)。しかし,構造体が 4 バイトの浮動小数点数を 1 つ,4 バイト整数を 1 つ,さらに 3 バイトの文字変数を 1 つ含んでいると,各要素は 1 バイトの充填を含むことになります (12 が 4 の倍数であるため)。
/align オプションについての詳細は,「位置合わせを制御するオプション」を参照してください。