9.1.1 定义形式一
•第一种数组定义形式的语法格式如下所示。
•类型说明[::] 数组名([下标下界:]下标上界[,…])[,…]
•该定义形式通过类型说明来显式声明数组的数据类型,并通过下标下界和下标上界来规定数组中某一维的范围。下标下界和下标上界共同组成了维说明符。当维说明符省略下标下界时,默认所在维的下标从1开始。如下代码都是合法的数组定义。
•REAL :: A(1:2,2:4)
•INTEGER B(10)
9.1.2 定义形式二
•第二种数组定义形式的语法格式如下所示。
•DIMENSION [::] 数组名([下标下界:]下标上界[,…])[,…]
•[类型说明[::] 数组名[,…]]
•该定义形式通过DIMENSION语句来进行数组的定义,通过下标下界和下标上界来规定数组中某一维的范围。在第二行通过类型说明来显式声明数组的数据类型。当省略类型说明时,采用默认的“I-N”规则来对数组的数据类型进行定义。如下代码合法的对数组进行了定义。
•DIMENSION :: A(10), B(2:11)
•INTEGER :: A
9.1.3 定义形式三
•第三种数组定义形式的语法格式如下所示。
•DIMENSION([下标下界:]下标上界[,…]) [::] 数组名[,…]
•[类型说明[::] 数组名[,…]]
•该定义形式通过DIMENSION语句直接说明了数组的维数和维的范围。这种形式定义的数组全部具有相同的维数和大小。如下代码表示了如何采用上述形式进行数组的定义。
•DIMENSION(10, 4:10) :: A, B, N
•INTEGER :: A
•REAL(8) :: N
9.1.4 定义形式四
•第四种数组定义形式的语法格式如下所示。
•[类型说明,]DIMENSION [::] 数组名([下标下界:]下标上界[,…])[,…]
•[类型说明,]DIMENSION([下标下界:]下标上界[,…]) [::] 数组名[,…]
•该定义形式可以说是前三种定义形式的综合形式。通过在DIMENSION语句前引入类型说明来显式的说明数组的数据类型。下列代码演示了此种形式的数组定义。
•REAL, DIMENSION :: I(10), M(10,5)
•INTEGER, DIMENSION(10) :: A, C
9.3.2 数组存储结构的应用
•目前的计算机硬件体系结构决定了在读取大批量数据时,如果这一批数据都位于临近的内存中时,读取操作会执行得较快。在编写程序时,如果想要提高执行效率,就应该对数据在计算中的保存方式和读取方式有一定的了解。只有了解了数据在计算内的存储结构,才能在编写程序的时候做到有的放矢。这样编写出来的程序在数据的存取效率上才能较高。
•需要注意的是,尽管Fortran中的数组是按“列元素优先”的规则进行存储的,但是C语言中的数组则是按照“行元素优先”的原则进行存储,并且C语言中数组的下标下界固定是从0开始的。在编写相关的程序时,应该注意到这一差别。Fortran语言中,使用DO循环进行高效率数组操作的代码写法可能在C语言中恰恰是最低效的。比如下面的程序段在Fortran中能够得到较好的执行效率:
•DO J = 1, 5
•DO I = 1,3
•Sum = Sum+ A(I, J)
•ENDDO
9.4.7 延迟形状数组
•延迟形状(Deferred-shape)数组是Fortran 90/95标准中才开始引入的特殊类型数组,这种类型的数组在声明时并不制定数组的维界,具体的维界需要在程序执行过程中才能确定。延迟形状数组的典型代表就是数组指针和可分配数组。
•声明延迟形状数组时,数组的秩由冒号“:”来确定,但每一维的长度是未知的。数组的维界和形状在程序执行过程中给延迟形状数组分配存储空间之后才能决定。可分配数组可以通过ALLOCATABLE语句、DIMENSION语句、TARGET语句或在类型声明中使用ALLOCATABLE属性来进行说明;而数组指针则由POINT语句或在类型声明中使用POINTER属性来进行说明。数组指针的边界和形状通过指针赋值语句指向目标之后进行确定,或者通过ALLOCATE语句直接进行指针的空间分配;而可分配数组的边界和形状则只能通过ALLOCATABEL语句来进行指定。
动态数组
为了更有效的利用计算机中的内存,Fortran 90/95标准中正是引入了可分配数组的概念。通过ALLOCATE语句可以动态的创建可分配数组,使内存和对象可以在程序开始运行之后才建立起相互联系。
9.6 数组赋值
•当数组配置好内存空间后,可以通过赋值语句或是数组构造器为数组中的元素进行赋值。Fortran语言中,数组的赋值可以通过赋值语句、DATA语句和数组构造器这三种手段来进行。
9.6.2 数组构造器
•数组构造器是由括号和斜线对之间的一系列数值组成,其一般形式为:
•数组名= (/取值列表/)
•其中,取值列表可以是标量,隐式DO循环或者任意秩的数组。取值列表中所有数值的类型都应该相同,数值之间以逗号分隔。如果取值列表中出现了数组,则它的值是按“列元素优先”的规则来赋给目标数组变量。数组构造器的标识“(/”和“/)”在书写时要注意,括弧和撇号之间不能有空格。下面来看一些实例。
•MN = (/1, 3, 5, 7, 9/) ! 标量表示
•AB = (/B(2,1:5),B(3:7,7:9)/)! 数组表示
•CC = (/(I, I=1,4)/)! 隐DO循环
•DE = (/10,A(2:7),(I,I=1,4),7/)! 混合表示