第9章 Fortran中的数组
合集下载
相关主题
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
9.3.1 数组的存储结构
• Fortran中,一维数组在计算机内存中的存储是最简单的一种情况。 在逻辑结构上,一维数组可以看成是由一系列数组元素组成的一 个单列数据表。数组中每个元素的下标就确定了此元素在数据表 中的位置。下标越小,在数据表中的位置就越靠前。在计算机内 存中,一维数组占据一片连续的存储单元,单个元素在内存中的 位置就是其逻辑结构中的位置。
9.1.5 数组定义的特点
• 上述数组定义的形式中,中括弧内的部分可有可无。数组定义语 句必须出现在所有可执行语句之前。除了上述基本的定义形式外, 在Fortran77中可以使用COMMON语句,在Fortran90中可以用 POINTER语句、ALLOCATABLE语句等对数组定义进行加强。 在前面所述的四种定义形式中,定义形式因简洁直观而常见于实 际使用中。此外,如下问题是在实际编程中应该注意的。 在前面所述的数组定义中,I(10)、M(10,5)、A、C等称为数组说 明符。在同一个说明语句中有多个数组说明符时,用逗号进行分 隔。 数组说明符中的I、M、A、C等是数组名,其取名规则与变量相同 并且不应与程序中的其他变量同名。在同一个程序单元中,一个 数组名只允许定义一次,不能重复定义。例如下面的数组定义是 错误的。 INTEGER :: A(10), A(10,20)
• • • • • • • • •
•
Ewk.baidu.comD PROGRAM TEST0902
9.2.3 引用数组片断
• • • • • • • • • • • • • • • • 引用数组片断的语法格式如下所示。 数组名(下标范围,„„) 在这种引用方式中,数组中的元素可以用过数组片断来进行引用。当需要给数组中的不同 片断的元素赋予不同数值时,这种引用方式非常方便。来看下面一个例子。 TEST0903.F90 ! 引用数组片断的范例 PROGRAM TEST0903 IMPLICIT NONE ! 变量定义 REAL :: A1, A2,A3,A4,A5,B(5,5) READ(*, *)A1,A2,A3,A4,A5 ! 数组片断的引用 B(1,1:5) = A1 B(2,1:5) = A2 B(3,1:5) = A3 B(4,1:5) = A4 B(5,1:5) = A5
9.4.4 显形数组的不足
• 显形数组是数组应用的基础,其中的自动数组和可调数组能够提供非常灵活的数组应 用。比如自动数组在处理具体数量未知的大笔数组数据时,能够提供相当好的解决方 案。但是有一点需要注意,由于自动数组和可调数组都是通过过程来使用的,因此过 程的一些特点也会影响到这两种数组的使用。比如使用自动数组时,过程在计算机中 的堆栈限制会妨碍可使用的自动数组的大小。这种情况可以通过在执行TEST0906时, 将变量I设置成一个大数(比如100000)来观察到,此时屏幕上的打印信息如下: Input the value of I: 100000 forrtl: severe (170): Program Exception - stack overflow Image PC Routine Line Source TEST0307.exe 004011DB Unknown Unknown Unknown TEST0307.exe 0040110A Unknown Unknown Unknown TEST0307.exe 0043FCD9 Unknown Unknown Unknown TEST0307.exe 00428FF9 Unknown Unknown Unknown kernel32.dll 7C816FD7 Unknown Unknown Unknown Incrementally linked image--PC correlation disabled.
9.2.1 引用数组元素
• 引用数组元素的语法格式如下所示。 • 数组名(下标,„„) • 这种引用方式通过下标索引来对数组中的每一个 元素进行操作。它是Fortran中最为传统的一种引 用方式。采用这种方式进行引用时,下标的值不 能超出数组定义时的下标上下界。目前市面上绝 大部分的Fortran编译器都会提供在编译时进行数 组下标越界检查的功能。而其他计算机语言的编 译器,如C/C++编译器往往不提供这样的功能,需 要程序员自行检查代码中是否存在数组越界的行 为。
•
END PROGRAM TEST0903
9.3 数组的存储
• 尽管在Fortran语言中,允许程序员声明维数高达 7维的数组来使用,但是计算机的内存却只是一维 的。所以不管声明的数组有几维,数组在内存中 都是以一维的方式来进行存储。数组中元素在计 算机内的存储顺序同时也被用作输入/输出时确定 其中的元素数据在进行操作时的先后顺序。
9.1 数组的定义
• 要在程序中使用数组,需要首先在变量声明中进行数组定 义。数组定义规定了数组的维数和大小,以及数组所能保 存的数据类型。在程序中,通过数组引用来对数组、数组 元素或者数组片断进行操作。 • 数组是类型相同、种别一致的一组变量的有序集合。它可 以是整型、实型、双精度型、复型、逻辑型、字符型以及 自定义类型等中的任意一种。组成数组的每一个变量被称 为数组元素,并由唯一的下标来进行标识。数组定义说明 了数组所能保存的数据类型、数组的维数、维的范围和数 组的大小。本节主要介绍Fortran中数组定义的几种方式。
9.4.3 特殊的显形数组——可调数组
• 可调数组(Adjustable Array)也是显形数组的 一种特殊形式,这种类型的显形数组只能是过程 中的一个哑元。 • 可调数组中至少有一维的上下界不是常数,这个 维的上下界只有当过程被调用时才能最终确定。 并且该维的上下界表达式中的整型变量可以是通 过过程传递的哑元,也可以是通过COMMON语句中 传递的整型常量或变量。和自动数组类似,过程 内部对维界参数的赋值不会改变数组中该维的上 下界。
9.1.3 定义形式三
• 第三种数组定义形式的语法格式如下所示。 • DIMENSION([下标下界:]下标上界[,„]) [::] 数组名[,„] • [类型说明 [::] 数组名[,„]] • 该定义形式通过DIMENSION语句直接说明了数组的 维数和维的范围。这种形式定义的数组全部具有 相同的维数和大小。如下代码表示了如何采用上 述形式进行数组的定义。 • DIMENSION(10, 4:10) :: A, B, N • INTEGER :: A • REAL(8) :: N
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.4.2 特殊的显形数组——自动数组
• 自动数组(Automatic Array)是显形数组的一种 特殊形式,这种形式的显形数组只能是过程中的 局部变量。 • 使用自动数组时最好在过程中加以声明,并且数 组中至少有一维的上下界是不确定的整型变量或 整型表达式。在调用过程时,自动数组中不确定 的上下界首先通过整型变量或整型表达式求出。 这样,整型变量或整型表达式的值在过程中发生 的变化,就不会影响到数组中的上下界。
第9章 Fortran中的数组
• 数组是Fortran语言中功能最为强大、运用最为灵 活的一种数据结构。数组(ARRAY)在科学和工程 计算中通常用来表示矩阵和向量。同一般的变量 声明相比,数组能够同时保存多个数据。它是一 种使用大规模数据的方法。配合Fortran语言中的 数组操作,可用于对大量不同的数据进行处理。 在存储结构上,数组占用一片连续的存储单元。 程序中通过数组索引来对数组元素、片断进行操 作。
9.1.4 定义形式四
• 第四种数组定义形式的语法格式如下所示。 • [类型说明,]DIMENSION [::] 数组名([下标下 界:]下标上界[,„])[,„] • [类型说明,]DIMENSION([下标下界:]下标上界 [,„]) [::] 数组名[,„] • 该定义形式可以说是前三种定义形式的综合形式。 通过在DIMENSION语句前引入类型说明来显式的说 明数组的数据类型。下列代码演示了此种形式的 数组定义。 • REAL, DIMENSION :: I(10), M(10,5) • INTEGER, DIMENSION(10) :: A, C
9.2.2 引用数组整体
• • • 引用数组整体的语法格式如下所示。 数组名 这种引用方式通过数组名来对数组进行整体操作。这种引用方式是 Fortan90中新增的,大大提高了程序编写的灵活性和简单性。我们对前一 个例程TEST0901进行修改,通过整体引用来对数组进行赋值。 TEST0902.F90 ! 引用数组整体的范例 PROGRAM TEST0902 IMPLICIT NONE ! 变量定义 REAL :: A, B(5,5) READ(*, *)A ! 数组整体引用 B = A
• •
•
•
9.2 数组的引用方式
• 数组经过定义之后,就可以在程序中使用了。在 Fortran77标准中,数组只允许在输入输出语句中 进行整体操作。在其他场合,只能对数组的元素 通过下标索引的方式逐个进行操作。到了 Fortran90标准,这一限制被大大放宽了。数组除 了能够进行整体操作以外,还能对数组中的片断 和数组的整体进行操作。这进一步增强了Fortran 语言在数值处理方面的能力。Fortran中数组的引 用方式可以概括为以下几种:
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 数组的类型
• 根据数组在定义时的特征,比如数组的秩、数组 的形状和每一维的大小,可以将数组划分为好几 种类型。这些不同类型的数组在程序单元中如何 使用?在哪些程序单元中使用?有什么特点?本 节将针对这些问题进行逐一介绍。
9.4.1 显形数组
• 显形(Explicit-shape)数组是Fortran中最简单、 最容易理解的一种数组类型。顾名思义,这种类 型的数组在定义阶段就通过数组定义语句明确的 规定了所有特征,比如数组的秩、数组的维数、 每一维的长度和上下界。通过这种方式定义的数 组具有确定的形状和大小,在程序运行过程中不 允许再对数组的任何特征进行改变。需要注意的 是,在显形数组的维说明中,还允许使用整型变 量或整型表达式来定义维的上下界。这涉及到两 种特殊的显形数组,会在随后的小节中进行介绍。