我希望能够拥有一个大的主数组并使用子数组引用它的不同部分。目前我正在使用偏移索引来做到这一点,但这样做会变得非常复杂。
我可以拥有维度(9)的主数组和维度(3)的3个子数组,使得sub_array1指向master_array的前3个元素,sub_array2指向接下来的3个元素,sub_array3指向最后3个元素3个元素?
例如,数组的定义如下:
integer, dimension(9) :: master_array
integer, dimension(3) :: sub_array1, sub_array2, sub_array3
数组之间的关系是:
sub_array1(1) -> master_array(1)
sub_array1(2) -> master_array(2)
sub_array1(3) -> master_array(3)
sub_array2(1) -> master_array(4)
sub_array2(2) -> master_array(5)
sub_array2(3) -> master_array(6)
sub_array3(1) -> master_array(7)
sub_array3(2) -> master_array(8)
sub_array3(3) -> master_array(9)
此外,是否可以使用混合数据类型,以便在较大的整数主数组中有一个实数的子数组?
提前感谢您的帮助
答案 0 :(得分:11)
是的,您可以使用绝对使用指针指向数组的子区域。这在许多情况下都非常方便,例如PDE的模板计算:
program pointerviews
real, dimension(10), target :: alldata
real, dimension(:), pointer :: left
real, dimension(:), pointer :: centre
real, dimension(:), pointer :: right
alldata = (/ (i, i=1,10) /)
left => alldata(1:8)
right => alldata(3:10)
centre=> alldata(2:9)
print *, alldata
print *, left
print *, centre
print *, right
print *, (left - 2*centre + right)
end program pointerviews
FORTRAN中的数组指针不仅仅是一个地址,它们还包含数组大小,步幅和类型信息。所以你甚至可以做更疯狂的事情(如果你已经习惯了C指针)并且包括步幅:
program pointerviews2
real, dimension(10), target :: alldata
real, dimension(:), pointer :: left
real, dimension(:), pointer :: centre
real, dimension(:), pointer :: right
alldata = (/ (i, i=1,10) /)
left => alldata(1:8:2)
right => alldata(3:10:2)
centre=> alldata(2:9:2)
print *, alldata
print *, left
print *, centre
print *, right
print *, 'Changing alldata(4) = 9999'
alldata(4) = 9999.
print *, alldata
print *, left
print *, centre
print *, right
end program pointerviews2
根据定义,不能具有与其他数据类型不同的数组区域。如果你想要一个包含几种类型数据的变量,你必须使用派生类型或多态。