INTEGERB(-1:2)
…
END
则在主程序中使用CALL语句调用子程序SB时,实参数组与形参数组的结合情况如下:
实参数组 形参数组 ,
A(0)——B(-1)
A(1)——B(0)
A(2)——B(1)
A(3)——B(2)
A(4)
A(5)
也即调用SB时,A数组的头4个元素与B数组的元素对应,这些对应元素实际上为同一存储地址。如果实参是数组元素,则从该元素开始依次与形参数组的第一个元素起按列逐个对应,它们也是按地址结合。例如,有主程序与子程序如下:
PROGRAMMAIN
DIMENTION A(8)
… ,
CALLSB(A(5))
END
SUBROUTINE SB(B)
DIMENSION B(3)
… ,
END
则在调用语句执行时,实参数组A与形参数组B的结合情况如下:
实参数组 形参数组
A(1)
A(2)
A(3)
A(4)
A(5)——B(1)
A(6)——B(2)
A(7)——B(3)
A(8)
FORTRAN77规定,不管实参是数组名还是数组元素,用作实参的数组,其维数、各维下标的上下限及数组中元素个数可以和与之结合的形参数组不同,但要求从与形参数组的第一个元素结合的实参数组元素算起,以后的实参数组元素的个数不能少于形参数组元素的个数。
多维数组或数组元素虚实结合时,要特别注意FORTRAN中数组按列存放的规定,不要摘错存储地址的对应关系。例如:
PROGRAMMAIN
DIMENSIONA(3,2)
…
CALL SB(A)
END
SUBROUTINE SB(B)
DIMENSION B(2,3)
… ,
END
这种情况下,数组元素地址的对应关系是:
实参数组 形参数组
A(1,1)——B(1,1)
A(2,1)——B(2,1)
A(3,1)——B(1,2)
A(1,2)——B(2,2)
A(2,2)——B(1,3)
A(3,2)——B(2,3)
3.可调数组
在主程序中定义数组元素时,·定义说明符中各维下标的上下限必须为整常数,不能是变量或算术表达式。但在子程序中定义数组时,允许用变量来定义各维下标的上下限。子程序中用变量来定义各维下标上下限的数组称为可调数组。但使用可调数组必须遵循以下几个原则。
(1)可调数组名必须是形参数组名。
(2)说明可调数组各维下标上下限的表达式中只能出现整型变量,且这种变量必须是 形参或出现在COMMON语句中。但在某些FORTRAN 77子集中,定义可调数组各维下标上下限时只能是整型变量,而不能是任何算术表达式。
(3)可调数组的大小不得超过对应实参数组的大小。
4.字符型变量的虚实结合
(1)当子程序中的形参为字符型变量时,对应的实参必须是字符型变量、字符常数、
字符型数组元素或字符表达式。字符型实参必须用CHARACTER语句加以说明。
(2)如果字符型形参的长度小于对应的实参长度,则从实参中最左边的字符开始与形
参结合,而实参中右边多余的字符被截去。例如:
CHARACTERA* 5
A=’ABCDE’
CALL SB(A)
END
SUBROUTINESB(X)
CHARACTER X*3
WRITE(*,*)X
END
程序执行后的输出结果为:ABC。
(3)在FORTRAN77中,对字符型形参的长度还可以用“*”号来说明,此时,形参字符变量自动与对应的实参取相同的长度。例如在上面的子程序SB中,如果将CHARACTER X*3改变为CHARACTER X*(*),则执行后,输出的结果为:ABCDE。
(4)当子程序中形参为字符型数组时,如果形参字符型数组元素的长度与对应实参字符型数组元素长度一致,则其虚实结合的情况与一般的数组虚实结合的情况相同。如果形参与实参的字符型数组元素长度不同,则按字符依次对应。例如,有主程序与子程序如下:
CHARACTFER A(5)* 3
DATA A/’ABC’,’DEF’,’GHI’,’JKL’,’MNO'/