副程式

 

副程式正如其名,本身就具有一個完善的程式架構。前面所介紹的格式、宣告輸出入運算式迴圈判斷檔案等,都可以在副程式中使用,甚至副程式裏頭也可以再呼叫副程式。

在下列兩種情況之下我們會撰寫或使用副程式:

(1) 為了讓程式的結構清楚,而把某個特殊部分功能獨立出來,讓它自成一個程式,再由主程式來叫用。何如寫一個副程式專司設定初始值,另一個只管自外部讀入資訊,再一個專門計算,又再一個專管列印答案及作圖。

(2) 有些程式段落(如繪圖及運算複雜的數學函式),可以重覆地被同一個或不同的程式來使用,我們都會希望把這種工具性的、可重覆使用的程式片段寫成副程式,不但簡單方便,也可減少錯誤。

副程式的內容,是定義在 SUBROUTINE "副程式名(引數群)" END 之間。這和主程式是定義在 PROGRAM "主程式名"END 之間有點像,但副程式多了一個 RETURN 指令來返回主程式,這在主程式中是沒有的。

程式的用法如下:


PROGRAM MY_MAIN

REAL A,B,C

:

CALL MY_SUB(A,B,C)

:

:

END

SUBROUTINE MY_SUB(AA,BB,CC)

REAL AA,BB,CC

:

CC = AA + BB

:

RETURN

END

 

一般而言,副程式需要從主程式處得到一些資訊,來作為處理的依據,在計算後才傳回結果用到主程式中。我們可以想像,同一個副程式有可能會在同一個程式的不同地方,甚至是不同的程式所使用,因此副程式之內所定義的名稱絕對不可能剛好和主程式要用的變數名稱一模一樣。(例如:專把一個傳入數值做平方的副程式,在主程式有可能先後被呼叫,來作為求 A 和 B 的平方之用。因此副程式中真正作 A1 = A1**2 的變數,絕對不可能滿足名稱相同的要求。)既然變數名稱不能一模一樣,我們則只能夠以傳遞時,變數排列的先後,來作主、副程式之變數的一對一對應,如此就絕對不會傳錯。在撰寫或是叫用副程式時也請大家注意。

雖然主、副程式中對應的變數名稱可以不同,但是數值型態的宣告一定要一致,否則這種不合理狀況將導致語法錯誤無法編譯。

另外,當副程式在傳遞一個變數的時候,它傳遞的是變數的起始位址而不是該變數或陣列的內容,舉例而言,CALL MYSUB1(A,B) CALL MYSUB1(A(3),B) 都是合法的呼叫方式,但結果大不相同,前者在要求副程式在處理第一個引數 (argument) 的變數時,是從原陣列的第一個元素開始做起,後者則是從第三個開始做起。換句話說, CALL MYSUB1(A,B) CALL MYSUB1(A(1),B) 的效果是完全一樣的。