12 其他 FORTRAN 敘述

12.1 PAUSE 和 STOP 敘述

FORTRAN 程式中的 END 敘述用以終止程式的執行。 但是有時在未到 END 之前, 需要中止程式的執行。 這種情況可使用 STOP 敘述中止執行, 其形式如,
      STOPSTOP constant

其中 constant 是五位或更少的正整數, 也可以是字元常數。 若使用第二種形式, STOP 中止執行程式時, 往往也顯示出 constant

有時想要暫停程式的執行, 然後檢查一些結果後, 再決定繼續或終止執行。 這種情況可使用 PAUSE 敘述中止執行, 其形式如,

      PAUSEPAUSE constant

其中 constant 是五位或更少的正整數, 也可以是字元常數。 若使用第二種形式, PAUSE 中斷執行程式時, 往往也顯示出 constant

12.2 IMPLICIT 敘述

FORTRAN 的一般命名慣例, 假如沒有其他型式宣告的, 所有用 I,J,K,L,M,N 開頭的變數, 一律視為整數, 其他則為實數。 這種慣例可用 IMPLICIT 敘述予以否定。 IMPLICIT 敘述的形式如,
      IMPLICIT type1 (a1, a2, ...), type2 (b1, b2, ...), ...

其中每一 ai, bi, ... 為一字母或用連字符號 - 連接的一對字母。 每一 typei 取下列之一:
      INTEGER
      REAL
      CHARACTER*n
      LOGICAL
      DOUBLE PRECISION
      COMPLEX

例如,

      IMPLICIT INTEGER(A-F, Z), CHARACTER*10 (L, X, Y)

宣告凡是開頭字母為 A, B, C, D, E, F, 或 Z 的變數, 都是整數型式, 而開頭字母為 L, X, 或 Y 的變數都是長度 10 的字元變數。

養成好的程式設計習慣, 最好每一變數的資料型式都明顯宣告。 不應依靠 IMPLICIT 敘述或 預設的 FORTRAN 命名慣例, 來決定變數的資料型式。

12.3 算術 IF, 計算 GO TO 和指定 GO TO 敘述

12.4 EQUIVALENCE 敘述

在同一程式或副程式中,可以使用 EQUIVALENCE 敘述,將兩個或兩個以上的變數或陣列名稱, 指定於同一記憶位置。 目的在於節省記憶位置,或使用不同變數名稱表示同一資料,或實行 單維陣列與多維陣列的變換等等。

用法如,

    EQUIVALENCE (list1), (list2), ....

同一括弧內的一組名稱,指定於同一記憶位置。 例如,
    REAL A(3,2), B(6)
    EQUIVALENCE (A(1,2), B(2))

使用時要注意:

  1. 所有 EQUIVALENCE 敘述必須在程式或副程式的第一個可執行敘述之前。
  2. 同在 COMMON 敘述中的兩項或多項,不可指定在 EQUIVALENCE 敘述。
  3. 形式引數不可指定在 EQUIVALENCE 敘述。
  4. 同一括弧內各項的資料型式要相符。

12.5 ENTRY 和 RETURN 敘述

ENTRY 敘述

副程式的正常進入點(entry point), 是在 FUNCTION 或 SUBROUTINE 敘述之後的第一個可執行敘述。 使用 ENTRY 敘述, 可在副程式中設定多個進入點。 ENTRY 敘述的形式如,
      ENTRY name (argument-list)

其中 name 是進入點的名稱, 而 argument-list 和 FUNCTION 或 SUBROUTINE 敘述 的引數串列相似。

ENTRY 敘述是不可執行的, 也不影響副程式的正常執順序。 其進入點是在 ENTRY 敘述 之後的第一個可執行敘述。

例如,

      SUBROUTINE INSORT(A, NMAX, N)

      REAL A(NMAX)
      DO 10 N = 1, NMAX
         READ (*, END = 20) A(N)
   10 CONTINUE
   20 CONTINUE
      PRINT *, N, 'values have been read.'

      ENTRY ARSORT(A, N)
        ...
               (排序)
        ...
      PRINT '(8G15.6)', ( A(I), I = 1, N )
      RETURN
      END

調用此副程式時, 若使用 INSORT, 則先讀入陣列 A 的資料, 略過 ENTRY 敘述, 再進行排序。 若使用 ARSORT, 則直接進行排序。 注意, 這兩個進入點可使用不同的 引數串列。

RETURN 敘述

由副程式回到調用該副程式的正常轉回點(return point), 是 CALL 敘述之後的第一個可執行敘述。 設定其他的轉回點, 可用 RETURN 敘述, 做法如下:
  1. 在 CALL 敘述中, 使用引數
          *n
    
    
    規定轉回點, n 指由被調用的副程式轉回時, 要執行的敘述之號碼。
  2. 使用 * 做為 SUBROUTINE 敘述中相對應的形式引數。
  3. 在 SUBROUTINE 副程式中, 使用
          RETURN k
    
    
    k 為整數陳式, 其值指要用到的那個轉回點。
例如,
          主程式

      ...

      CALL SUBR(A, B, C, *30, *40)
   20 D = A * B

      ...

   30 D = A + B

      ...

   40 D = A - B

      ...

      END

          副程式

      SUBROUTINE SUBR (X, Y, TERM, *, *)
      ...

      IF (TERM .LT. 0) RETURN 1
      IF (TERM .GT. 0) RETURN 2
      END

假如 TERM 小於 0 , 則回到敘述 30, 假如 TERM 大於 0 , 則回到敘述 40, 假如 TERM 等於 0 , 則回到敘述 20(正常轉回點)。