Fortran/言語の混合
型
[編集]Fortranの型は、他のコンパイルされた言語の組み込み型と非常によくマッピングされます。以下は、FortranからCへの型の対応表です:
FortranからCへの型の対応表 Fortran C COMMON extern struct INTEGER*1 signed char INTEGER*2 short INTEGER*4 long INTEGER*8 long long INTEGER int REAL float REAL*4 float REAL*8 double REAL*16 long double LOGICAL int LOGICAL*n char [n] CHARACTER*n char [n] DOUBLE PRECISION double COMPLEX float [2] COMPLEX*8 float [2] COMPLEX*16 double [2] COMPLEX*32 long double [2]
配列
[編集]Fortranの配列のメモリレイアウトは、Cや多くのCベースの言語の配列とは対照的です。Cで連続した配列要素を反復処理する場合、右側の配列添字が最も速く変化しますが、Fortranでは左側の配列添字が最も速く変化します。したがって、連続したメモリ内のx(1,1)
の次の要素はx(2,1)
であり、x(1,2)
ではありません。さらに、Cの要素の添字付けは0から始まりますが、Fortranの添字付けはデフォルトで1から始まります。Fortranの要素はx(1)
であるかもしれませんが、Cコードの等価値はx[0]
です。ただし、Fortran配列をCの関数に渡す場合、最初に配列をCスタイルの添字に変換する必要はありません(むしろ、しないでください);コンパイラが自動的にこれを行います。
グローバルストレージ
[編集]共通ブロックセクションを参照してください。
サブルーチンと関数の呼び出し
[編集]多くの言語は、引数をスタックにプッシュします。いくつかは定数として、いくつかはアドレスとして。ほとんどのコンパイラでは、Fortranは変数と定数へのポインターのブロックをコンパイルし、そのブロックのアドレスをプッシュします。したがって、次のようにFortranプロシージャが定義されている場合:
subroutine my_sub(i, j, x)
そのCでの定義は次のようになります:
struct my_sub_args { int *i; int *j; float *x; } my_sub_args = {&i, &j, &x}; void my_sub(my_sub_args*);
Cコードは次のようにしてルーチンを呼び出すことができます:
my_sub(&my_sub_args);
PL/Iの特別な場合
[編集]PL/Iでは、外部共通ブロック、サブルーチン、または手続きをFORTRAN型と定義することができます。これを行うと、添字順序まで含めて、すべてが自動的に処理されます。同様に、PL/Iアイテム(例えば、サブルーチンなど)をFORTRAN型と定義することもでき、FortranがFortranの呼び出し規約を使用してそれを呼び出すことができるようになります。