跳轉到內容

Fortran/程式結構

來自 Wikibooks,開放世界中的開放書籍


較舊版本的Fortran對程式的格式有嚴格的指導方針。Fortran 90取消了此限制,並接受自由格式程式碼以及歷史固定格式程式碼。

固定格式

[編輯 | 編輯原始碼]

在Fortran 90之前,原始碼遵循一個定義明確的固定格式。註釋以第一列中的“C”表示,第2-5列保留用於可選的數字語句標號,第6列中的非空格字元表示當前行是前一行的延續,第7至72列可用於程式語句。第73至80列被忽略,通常包含行序列號。不允許有空行。這種嚴格的格式是Fortran在批處理計算和穿孔卡片輸入時代開發的結果。如果程式“套牌”掉落,則使用序列號;如果將穿孔卡片放置在卡片閱讀器中並按第73-80列排序,則可以恢復程式順序。編譯器供應商為此格式提供了擴充套件,但它很少可移植(例如,將製表符解釋為6個空格)。

請注意,雖然列位置很重要,但空格字元並不重要。以下程式說明了在固定格式Fortran中使用空格字元的合法用法

C2345678901234567890
      PROGRAM Z
      GOTO11
   11 CONTINUE
      GO TO 780
 780  CONTINUE
      G OTO3 60
 360  CONTINUE
      STOP
      END

雖然此程式碼在技術上是合法的,但強烈建議使用空格字元來分隔關鍵字、標籤和資料以保持可讀性。

Fortran是在ASCII字元集標準化之前開發的,傳統上Fortran程式碼都是用大寫字母編寫的。變數名限制為六個字元,但這通常由編譯器供應商擴充套件。

自由格式

[編輯 | 編輯原始碼]

從Fortran 90開始,原始碼不需要固定列格式。在這種情況下,命令可以自由地從任何列開始。72列的限制也已解除。這為縮排提供了更多空間。

program test
    implicit none
    integer four
    four = 4
    write (*,*) four
end program

大小寫敏感性

[編輯 | 編輯原始碼]

Fortran不區分大小寫。Fortran通常用於僅支援大寫字母的系統。事實上,語言本身被稱為FORTRAN(全部大寫)。雖然完全沒有必要,但習慣上仍使用全部大寫字母鍵入Fortran命令。這有助於區分在單色顯示器和印表機上顯示的原始碼中的關鍵字。如今,語法高亮顯示可以替代此功能。但是,它可能有助於直觀地區分舊版Fortran程式碼和現代原始碼。

空白字元

[編輯 | 編輯原始碼]

在Fortran 90或更高版本中,空格字元和空行通常無關緊要。某些語句需要空格字元,例如,programfunctionsubroutine在語句關鍵字和程式單元識別符號之間需要空格字元。

但是,與C、C++和Java等許多其他語言不同,行分隔符“;”是可選的,因此每行程式碼都可以保持在自己的行上。但是,不建議使用命令分隔符“;”。

程式單元

[編輯 | 編輯原始碼]

Fortran程式由程式單元組成。單個原始碼檔案可以包含多個程式單元,但通常將每個程式單元放在其自己的單獨原始碼檔案中。它們最基本的形式由一系列Fortran語句組成,並以end語句結束。

主程式

[編輯 | 編輯原始碼]

每個可執行程式都必須有一個主程式單元。例如,以下是一個完整的可編譯和可執行程式。

write (*,*) "Hello, world"
end

但是,使用program語句來指示它是主程式單元會更加清晰。

program main
    write (*,*) "Hello, world!"
end program main

主程式分為幾個部分。第一部分應包含模組use語句。接下來是控制是否隱式型別化未宣告變數的implicit / implicit none語句。接下來是宣告部分,其中宣告變數、型別、介面和過程。然後是主程式的可執行語句。最後一部分是內部子程式,由contains語句啟動。

program main
    ! Use statements section
    use module_name
    ! Implicit none statement section
    implicit none
    ! Declarations section
    integer :: a
    real :: b
    
    ! Executable section
    write (*,*) "Blah, blah, blah..."
end program main

子程式

[編輯 | 編輯原始碼]

程式單元也可以是子程式:它們可以是過程(函式和子例程)、塊資料、模組或子模組。

外部子程式
[編輯 | 編輯原始碼]

以下程式碼顯示了一個主程式和一個函式。increment函式位於主程式外部,因此需要在主程式的第4行進行宣告。

program main
    implicit none
    integer :: a
    integer, external :: increment

    a = increment(34)
    write (*,*) a
end program main

function increment(input) result (output)
    implicit none
    integer :: output
    integer :: input

    output = input + 1
end function increment

但是,函式的介面仍然是隱式的。要顯式地宣告外部過程,可以使用一個介面來宣告所有外部過程的輸入和輸出。在這種情況下,主程式如下所示。

program main
    implicit none
    integer :: a
    interface
        integer function increment(input)
            integer :: input
        end function
    end interface

    a = increment(34)
    write (*,*) a
end program main
內部子程式

[編輯 | 編輯原始碼]

內部子程式不需要顯式介面或宣告,因為它們是父程式單元的一部分。如果子程式包含在程式單元的contains部分中,則該子程式為內部子程式。

program main
    implicit none
    integer :: a

    a = increment(34)
    write (*,*) a
    
contains

    function increment(input) result (output)
        integer :: output
        integer :: input

        output = input + 1
    end function increment

end program main

子例程

[編輯 | 編輯原始碼]

塊資料

[編輯 | 編輯原始碼]

子模組

[編輯 | 編輯原始碼]
華夏公益教科書