位置合わせされていないデータの原因と,自然な位置合わせを保証する方法

共通ブロック (COMMON 文),構造型データ,および Compaq Fortran 記録構造体 (RECORD 文) は,通常は大きな構造中に複数の項目を含んでいます。

次のような宣言では,データが強制的に位置合わせされなくなることがあります。

共通ブロック,構造型データ,または記録構造体中に位置合わせされていないデータが生じるのを防ぐには,次のいずれか,または両方の手段を取ってください。

位置合わせされていないデータが生じる原因としては,他にも,位置合わせされていない実引数や,構造型構造体または 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 オプションについての詳細は,「位置合わせを制御するオプション」を参照してください。