表 11–2 では、Fortran 95 のデータ型と C のデータ型のデータサイズとデフォルトの境界整列を比較しています。ここでは、境界に影響したり、適用されるデフォルトのデータサイズを昇格させたりするコンパイルオプションを指定しないものとします。次の点に注意してください。
C のデータ型 int、long int、long は、32 ビット環境では等価です (4 バイト)。しかし、64 ビット環境では long とポインタは 8 バイトになります。これは LP64 データモデルと呼ばれます。
64 ビット環境で -m64 および、これに相当するオプションを使用してコンパイルすると、REAL*16 と COMPLEX*32 は 16 バイト境界に整列されます。
4/8 と示されている境界整列は、デフォルトでは 8 バイト境界を意味しますが、共通ブロックでは 4 バイト境界を意味しています。共通ブロックでのデフォルトの最大境界整列は 4 バイトです。4/8/16 は、-m64 オプションを使用してコンパイルしたとき 16 バイト境界に整列されることを意味します。
REAL(KIND=16)、REAL*16、COMPLEX(KIND=16)、および COMPLEX*32 は SPARC プラットフォームでのみ使用できます。
配列と構造体の要素および欄はそれぞれ互換性がなければいけません。
配列、文字列、構造体を値で渡すことはできません。
呼び出し側で %VAL(arg) を使用すると、Fortran 95 ルーチンから C ルーチンに値で引数を渡すことができます。C から Fortran 95 に値で引数を渡すことはできますが、Fortran ルーチンに、VALUE 属性とともに仮引数を宣言している明示的なインタフェースブロックがあることが条件となります。
数値シーケンス型の要素は共通ブロックと同様に整列され、-aligncommon オプションによっても制御されます。 数値シーケンス型は、すべての要素がデフォルトの整数型かデフォルトの実数型、倍精度実数型、デフォルトの複素数型、デフォルトの論理型のいずれかで、ポインタではない連続型です。
QUAD 変数を除き、数値シーケンス型ではないデータ型の要素は、たいていの場合、自然整列になります。4 倍精度の変数の場合、境界整列は 32 ビットと 64 ビットの SPARC プラットフォームで異なります。
VAX 構造体の要素、および BIND(C) 属性で定義されたデータ型は、どのプラットフォームでも C の構造体と同じ境界整列になります。
Fortran 95 のデータ型 |
C のデータ型 |
サイズ |
境界 |
|
---|---|---|---|---|
BYTE x |
char x |
1 |
1 |
|
CHARACTER x |
unsigned char x ; |
1 |
1 |
|
CHARACTER (LEN=n) x |
unsigned char x[n] ; |
n |
1 |
|
COMPLEX x |
struct {float r,i;} x; |
8 |
4 |
|
COMPLEX (KIND=4) x COMPLEX (KIND=8) x COMPLEX (KIND=16) x (SPARC) |
struct {float r,i;} x; struct {double dr,di;} x; struct {long double, dr,di;} x; |
8 16 32 |
4 4/8 4/8/16 |
|
DOUBLE COMPLEX x |
struct {double dr, di;} x; |
16 |
4/8 |
|
DOUBLE PRECISION x |
double x ; |
8 |
4 |
|
REAL x |
float x ; |
4 |
4 |
|
REAL (KIND=4) x REAL (KIND=8) x REAL (KIND=16) x (SPARC) |
float x ; double x ; long double x ; |
4 8 16 |
4 4/8 4/8/16 |
|
INTEGER x |
int x ; |
4 |
4 |
|
INTEGER (KIND=1) x INTEGER (KIND=2) x INTEGER (KIND=4) x INTEGER (KIND=8) x |
signed char x ; short x ; int x ; long long int x; |
1 2 4 8 |
4 4 4 4 |
|
LOGICAL x |
int x ; |
4 |
4 |
|
LOGICAL (KIND=1) x LOGICAL (KIND=2) x LOGICAL (KIND=4) x LOGICAL (KIND=8) x |
signed char x ; short x ; int x ; long long int x; |
1 2 4 8 |
4 4 4 4 |