子程序
出处:按学科分类—工业技术 企业管理出版社《工程师手册》第841页(3241字)
1.函数子程序
(1)函数子程序的定义
格式如下:
类型说明FUNCTION函数名(虚参1,虚参2,…)
FUNCTION前的类型说明是可选项,用来说明函数名的类型。当省略此类型说明时,函数名的类型遵循隐含规则。
也可将类型说明放在FUNCTION语句后,形式如下:
FUNCTION 函数名(虚参1,虚参2,…)
类型说明 函数名
函数子程序可以没有虚参,此时函数名后的一对圆括号不能省略。
函数体内必须给函数名赋以函灵敏值。
(2)RETURN语句
格式如下:
RETURN
此语句使控制返回调用程序。
(3)函数子程序的调用形式
其调用形式与内部函数完全相同。如果没有虚参,调用时一对圆括号不能省略。
2.子例行子程序
(1)子例行子程序的定义
当子例行子程序不还虚参时,程序名后不得带有一对圆括号。格式如下:
SUBROUTINE 子例行子程序名(虚参1,虚参2,…)
END
(2)子例行子程序的调用形式
子例行子程序必须用一条独立的CALL语句来调用,格式如下:
CALL 子例行子程序名(实参1,实参2,…)
当没有虚参时,设用语句如下:
CALL 子例行子程序名
3.实参与虚参之间的数据传送
子程序中的虚参可以是变量名、数组名、子程序名和星号。虚参与实参是按地址结合。
(1)变量做虚参
对应的实参可以是同类型的常量、变量、数组元素和表达式。
(2)数组名做虚参
对应的实参可以是同类型的数组名或数组元素。
(3)可调数组
在子程序中允许使用可调数组,这时可调数组名和可调维的变量名必须做为虚参出现在参数表中,且可调数组的大小不得超过对应实参数组的大小。
例如:以下Sort子程序实现对任意大小的一维数组进行排序,主程序调用完成对10个数进行排序。
PROGRAM MAIN
INTEGER X(10)
READ(*,100)(X(1),I=1,10)
100 FORMAT(10I3)
CALL SORT(X,10)
WRITE(*,200)(X(I),I=1,10)
200 FORMAT(1X,10I3)
END
SUBROUTINE SORT(A,N)
INTEGER A(N)
DO10I=1,N-1
L=I
DO20J=I+1,N
IF(A(L)).GT.A(J))L=J
20 CONTINUE
M=A(I)
A(I)=A(L)
A(L)=M
10 CONTINUE
END
(4)子程序名作虚参
这时对应的实参可以是内部函数名、函数子程序名和子例行子程序名。当实参是内部函数名时,在调用语句所在的程序单位中,要用内部语句(INTRINSIC语句)说明此内部函数名;当实参是函数子程序名或子例行子程序名时,在调用语句所在的程序单位中,要用外部语句(EXTERNAL语句)说明该函数子程序名或子例行子程序名。
内部语句的格式:
INTRINSIC 内部函数名,内部函数名,…
外部语句的格式:
EXTERNAL 子程序名,子程序名,…
(5)星号作虚参
虚参表中出现一个“*”号时,对应的实参为一个冠有“*”号的语句标号。
例如:
4.子程序中的SAVE语句和DATA语句
SAVE语句的格式:
SAVE 变量表 或 SAVE
其中“变量表”中允许变量名,数组名,各项之间用逗号隔开。变量表中不允许出现虚参名。
SAVE语句用来指定子程序中某些变量的存储单元不被释放,下次调用仍可使用。当SAVE语句中带有“变量表”时,则为变量表中指定的变量和数组保留存储单元;如果SAVE语句中没有“变量表”,则表示让子程序中所有变量和数组在程序执行期间都占有确定的存储单元,不因退出子程序而被释放。