七、函數(shù)與子程序(過程)
(一)內(nèi)部函數(shù)
內(nèi)部函數(shù)是預(yù)先編制的一些常用函數(shù)或算法的過程,由FORTRAN語言提供,可以直接調(diào)用。內(nèi)部函數(shù)調(diào)用時(shí)的一般形式是:
內(nèi)部函數(shù)名(實(shí)元表)
實(shí)元表中元素的數(shù)據(jù)類型、個(gè)數(shù)是預(yù)先規(guī)定的。
常用內(nèi)部函數(shù)及其功能可查閱FORTRAN教材或用戶手冊。
(二)語句函數(shù)
1.語句函數(shù)的定義
定義語句函數(shù)的語句稱為語句函數(shù)語句。其一般形式為:
函數(shù)名(形參表)=表達(dá)式。
其中,函數(shù)名的命名規(guī)則與一般變量名相同,所以它也可以用類型說明語句等來說明。形參又稱啞元,是一些變量名,一般應(yīng)出現(xiàn)在表達(dá)式中。
語句函數(shù)在程序單位中的位置,應(yīng)在所有可執(zhí)行語句之前。
2.語句函數(shù)的調(diào)用
調(diào)用語句函數(shù)的結(jié)果是得到一個(gè)函數(shù)值,因此,調(diào)用語句函數(shù)時(shí)代之以實(shí)際變量(又 稱實(shí)元)。
(三)函數(shù)子程序
一個(gè)函數(shù)子程序是一個(gè)獨(dú)立的FORTRAN程序單位。它的第一個(gè)語句必須是FUNCTION語句,最后一個(gè)語句必須是END語句。即函數(shù)子程序的一般結(jié)構(gòu)為:
[類型說明]FUNCTION函數(shù)名(形參表)
語句塊
[RETURN]
END
也可以寫為:FUNCTION函數(shù)名(形參表)
[類型說明 函數(shù)名]
語句塊
[RETURN]
END
其中函數(shù)名的命名規(guī)則與變量相同,而函數(shù)名的類型決定了函數(shù)值的類型。在函數(shù)子程序中,形參可以是變量名、數(shù)組名、外部過程名,而形參的命名與類型說明也與變量相同,形參數(shù)組也必須在函數(shù)子程序中予以定義.
函數(shù)子程序的函數(shù)值由函數(shù)名帶回到調(diào)用該函數(shù)子程序的程序,因此,在函數(shù)子程序中必須對(duì)函數(shù)名賦值。在函數(shù)子程序中,函數(shù)名應(yīng)該像普通變量那樣來使用。
在函數(shù)子程序中,所有的名字、語句標(biāo)號(hào)都可以和其他程序單位中的相同而彼此沒有任何關(guān)系。
在函數(shù)子程序中,END語句的功能有兩個(gè):一是表示該程序單位的結(jié)束,二是具有返回語句RETURN的功能。函數(shù)子程序中必須有并且只有一個(gè)END語句,而且只能是子程序的最后一個(gè)語句。當(dāng)在子程序的其他位置須要返回時(shí),可以使用RETURN
語句。
(四)子程序
1.子程序的結(jié)構(gòu)
一個(gè)子程序是一個(gè)獨(dú)立的FORTRAN程序單位。子程序的第一個(gè)語句必須是SUBROUTINE語句,最后一個(gè)語句必須是END語句。
即子程序的一般結(jié)構(gòu)為:
SUBROUTINE子程序名(形參表)
語句塊
[RETURN]
END
SUBROUTINE語句中的形參表可以省略。這時(shí)子程序名后的括弧不要保留。對(duì)子程序的其他有關(guān)規(guī)定與函數(shù)子程序相同。
2.子程序的調(diào)用
子程序調(diào)用通過CALL語句實(shí)現(xiàn)。其形式為:
CALL子程序名(實(shí)參)
其他有關(guān)對(duì)子程序的調(diào)用規(guī)定與函數(shù)子程序相同。
八、程序單位間的數(shù)據(jù)傳遞
(一)虛實(shí)結(jié)合
虛實(shí)結(jié)合又稱啞實(shí)結(jié)合,是各程序單位(主程序和各種過程如函數(shù)子程序)之間傳遞數(shù)據(jù)的一種重要途徑。
1.變量的虛實(shí)結(jié)合
當(dāng)子程序等過程的形參為變量時(shí),則在調(diào)用時(shí)所對(duì)應(yīng)的實(shí)參可以是類型相同的常數(shù)、變量、數(shù)組元素或表達(dá)式;子程序調(diào)用后,其運(yùn)行的結(jié)果通過這些實(shí)參返回到調(diào)用者。在FORTRAN 77中,當(dāng)形參變量所對(duì)應(yīng)的實(shí)參是變量或數(shù)組元素時(shí),則它們之間的結(jié)合方式是地址結(jié)合;而當(dāng)形參變量所對(duì)應(yīng)的實(shí)參是常數(shù)或表達(dá)式時(shí),其結(jié)合方法對(duì)于不同的
FORTRAN系統(tǒng)有可能是不同的。
2.?dāng)?shù)組的虛實(shí)結(jié)合
當(dāng)子程序中的形參為數(shù)組名時(shí),則在調(diào)用時(shí)所對(duì)應(yīng)的實(shí)參必須是數(shù)組名或數(shù)組元素。如果實(shí)參是數(shù)組名,則實(shí)參數(shù)組與形參數(shù)組按地址結(jié)合,實(shí)參數(shù)組與形參數(shù)組都從第一個(gè)元素開始按列逐個(gè)對(duì)應(yīng)。例如,有主程序與子程序如下:
PROGRAMMAIN
INTEGERA(0:5)
…
CALLSB(A)
END
SUBROUTINESB(B)
INTEGERB(-1:2)
…
END
則在主程序中使用CALL語句調(diào)用子程序SB時(shí),實(shí)參數(shù)組與形參數(shù)組的結(jié)合情況如下:
實(shí)參數(shù)組 形參數(shù)組 ,
A(0)——B(-1)
A(1)——B(0)
A(2)——B(1)
A(3)——B(2)
A(4)
A(5)
也即調(diào)用SB時(shí),A數(shù)組的頭4個(gè)元素與B數(shù)組的元素對(duì)應(yīng),這些對(duì)應(yīng)元素實(shí)際上為同一存儲(chǔ)地址。如果實(shí)參是數(shù)組元素,則從該元素開始依次與形參數(shù)組的第一個(gè)元素起按列逐個(gè)對(duì)應(yīng),它們也是按地址結(jié)合。例如,有主程序與子程序如下:
PROGRAMMAIN
DIMENTION A(8)
… ,
CALLSB(A(5))
END
SUBROUTINE SB(B)
DIMENSION B(3)
… ,
END
則在調(diào)用語句執(zhí)行時(shí),實(shí)參數(shù)組A與形參數(shù)組B的結(jié)合情況如下:
實(shí)參數(shù)組 形參數(shù)組
A(1)
A(2)
A(3)
A(4)
A(5)——B(1)
A(6)——B(2)
A(7)——B(3)
A(8)
(一)內(nèi)部函數(shù)
內(nèi)部函數(shù)是預(yù)先編制的一些常用函數(shù)或算法的過程,由FORTRAN語言提供,可以直接調(diào)用。內(nèi)部函數(shù)調(diào)用時(shí)的一般形式是:
內(nèi)部函數(shù)名(實(shí)元表)
實(shí)元表中元素的數(shù)據(jù)類型、個(gè)數(shù)是預(yù)先規(guī)定的。
常用內(nèi)部函數(shù)及其功能可查閱FORTRAN教材或用戶手冊。
(二)語句函數(shù)
1.語句函數(shù)的定義
定義語句函數(shù)的語句稱為語句函數(shù)語句。其一般形式為:
函數(shù)名(形參表)=表達(dá)式。
其中,函數(shù)名的命名規(guī)則與一般變量名相同,所以它也可以用類型說明語句等來說明。形參又稱啞元,是一些變量名,一般應(yīng)出現(xiàn)在表達(dá)式中。
語句函數(shù)在程序單位中的位置,應(yīng)在所有可執(zhí)行語句之前。
2.語句函數(shù)的調(diào)用
調(diào)用語句函數(shù)的結(jié)果是得到一個(gè)函數(shù)值,因此,調(diào)用語句函數(shù)時(shí)代之以實(shí)際變量(又 稱實(shí)元)。
(三)函數(shù)子程序
一個(gè)函數(shù)子程序是一個(gè)獨(dú)立的FORTRAN程序單位。它的第一個(gè)語句必須是FUNCTION語句,最后一個(gè)語句必須是END語句。即函數(shù)子程序的一般結(jié)構(gòu)為:
[類型說明]FUNCTION函數(shù)名(形參表)
語句塊
[RETURN]
END
也可以寫為:FUNCTION函數(shù)名(形參表)
[類型說明 函數(shù)名]
語句塊
[RETURN]
END
其中函數(shù)名的命名規(guī)則與變量相同,而函數(shù)名的類型決定了函數(shù)值的類型。在函數(shù)子程序中,形參可以是變量名、數(shù)組名、外部過程名,而形參的命名與類型說明也與變量相同,形參數(shù)組也必須在函數(shù)子程序中予以定義.
函數(shù)子程序的函數(shù)值由函數(shù)名帶回到調(diào)用該函數(shù)子程序的程序,因此,在函數(shù)子程序中必須對(duì)函數(shù)名賦值。在函數(shù)子程序中,函數(shù)名應(yīng)該像普通變量那樣來使用。
在函數(shù)子程序中,所有的名字、語句標(biāo)號(hào)都可以和其他程序單位中的相同而彼此沒有任何關(guān)系。
在函數(shù)子程序中,END語句的功能有兩個(gè):一是表示該程序單位的結(jié)束,二是具有返回語句RETURN的功能。函數(shù)子程序中必須有并且只有一個(gè)END語句,而且只能是子程序的最后一個(gè)語句。當(dāng)在子程序的其他位置須要返回時(shí),可以使用RETURN
語句。
(四)子程序
1.子程序的結(jié)構(gòu)
一個(gè)子程序是一個(gè)獨(dú)立的FORTRAN程序單位。子程序的第一個(gè)語句必須是SUBROUTINE語句,最后一個(gè)語句必須是END語句。
即子程序的一般結(jié)構(gòu)為:
SUBROUTINE子程序名(形參表)
語句塊
[RETURN]
END
SUBROUTINE語句中的形參表可以省略。這時(shí)子程序名后的括弧不要保留。對(duì)子程序的其他有關(guān)規(guī)定與函數(shù)子程序相同。
2.子程序的調(diào)用
子程序調(diào)用通過CALL語句實(shí)現(xiàn)。其形式為:
CALL子程序名(實(shí)參)
其他有關(guān)對(duì)子程序的調(diào)用規(guī)定與函數(shù)子程序相同。
八、程序單位間的數(shù)據(jù)傳遞
(一)虛實(shí)結(jié)合
虛實(shí)結(jié)合又稱啞實(shí)結(jié)合,是各程序單位(主程序和各種過程如函數(shù)子程序)之間傳遞數(shù)據(jù)的一種重要途徑。
1.變量的虛實(shí)結(jié)合
當(dāng)子程序等過程的形參為變量時(shí),則在調(diào)用時(shí)所對(duì)應(yīng)的實(shí)參可以是類型相同的常數(shù)、變量、數(shù)組元素或表達(dá)式;子程序調(diào)用后,其運(yùn)行的結(jié)果通過這些實(shí)參返回到調(diào)用者。在FORTRAN 77中,當(dāng)形參變量所對(duì)應(yīng)的實(shí)參是變量或數(shù)組元素時(shí),則它們之間的結(jié)合方式是地址結(jié)合;而當(dāng)形參變量所對(duì)應(yīng)的實(shí)參是常數(shù)或表達(dá)式時(shí),其結(jié)合方法對(duì)于不同的
FORTRAN系統(tǒng)有可能是不同的。
2.?dāng)?shù)組的虛實(shí)結(jié)合
當(dāng)子程序中的形參為數(shù)組名時(shí),則在調(diào)用時(shí)所對(duì)應(yīng)的實(shí)參必須是數(shù)組名或數(shù)組元素。如果實(shí)參是數(shù)組名,則實(shí)參數(shù)組與形參數(shù)組按地址結(jié)合,實(shí)參數(shù)組與形參數(shù)組都從第一個(gè)元素開始按列逐個(gè)對(duì)應(yīng)。例如,有主程序與子程序如下:
PROGRAMMAIN
INTEGERA(0:5)
…
CALLSB(A)
END
SUBROUTINESB(B)
INTEGERB(-1:2)
…
END
則在主程序中使用CALL語句調(diào)用子程序SB時(shí),實(shí)參數(shù)組與形參數(shù)組的結(jié)合情況如下:
實(shí)參數(shù)組 形參數(shù)組 ,
A(0)——B(-1)
A(1)——B(0)
A(2)——B(1)
A(3)——B(2)
A(4)
A(5)
也即調(diào)用SB時(shí),A數(shù)組的頭4個(gè)元素與B數(shù)組的元素對(duì)應(yīng),這些對(duì)應(yīng)元素實(shí)際上為同一存儲(chǔ)地址。如果實(shí)參是數(shù)組元素,則從該元素開始依次與形參數(shù)組的第一個(gè)元素起按列逐個(gè)對(duì)應(yīng),它們也是按地址結(jié)合。例如,有主程序與子程序如下:
PROGRAMMAIN
DIMENTION A(8)
… ,
CALLSB(A(5))
END
SUBROUTINE SB(B)
DIMENSION B(3)
… ,
END
則在調(diào)用語句執(zhí)行時(shí),實(shí)參數(shù)組A與形參數(shù)組B的結(jié)合情況如下:
實(shí)參數(shù)組 形參數(shù)組
A(1)
A(2)
A(3)
A(4)
A(5)——B(1)
A(6)——B(2)
A(7)——B(3)
A(8)