跳轉到內容

Fortran/混合語言

來自華夏公益教科書,開放的書籍,開放的世界

Fortran 型別與其他編譯語言中的內建型別很好地匹配。以下是一個 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/1 特殊情況

[編輯 | 編輯原始碼]

在 PL/1 中,您可以定義一個外部公共塊、子程式或過程為 FORTRAN 型別。當您這樣做時,從下標順序到所有內容都會為您處理。同樣,您可以定義一個 PL/1 專案(例如子程式)為 FORTRAN 型別,然後它就可以使用 Fortran 的呼叫約定由 Fortran 呼叫。

華夏公益教科書