《Fortran程序设计第7章属性声明》由会员分享,可在线阅读,更多相关《Fortran程序设计第7章属性声明(41页珍藏版)》请在金锄头文库上搜索。
1、第7章 属性的声明最后,对于数据我们剩下的工作,就是如何运用FROTRAN语言来完整地加以描述。FORTRAN语言完成对数据的描述的语法单位是数据声明语句,在前面2章里面,我们 整理好问题当中需要涉及的数据及其结构之后,要以FORTRAN语言写下来,就是使用 FORTRAN的声明语句,这些语句的句法设计保证能够完备的描述我们关于数据所需要说明 的一切属性。数据对象首先需要予以说明的当然就是它的类型,因此我们首先给出对象的类型声明语 句,特别地,需要说明在最初FORTRAN标准里面遗留下来的一种数据类型描述方法 隐式类型描述法,然后讨论各种数据对象所可能具有的属性。 数组属性; 指针属性; 值特
2、征; 对象可访问性与使用属性; 特征兼容性; 自动数据对象; 存储关联。由于本章集中讨论FORTRAN的声明语句,而声明的对象除了数据之外,其他的程序 对象,例如函数,过程等也需要声明其类型或属性,因此本章一并讨论对其他程序对象的声 明: 过程属性; NAMELIST 语句;7.1 属性及其声明方式所谓一个对象的属性,就是程序使用该对象的方式。本章所讨论的属性的大体分类与作为其名称的关键词见表7-1表7-1属性的分类及其关键词数据类型 INTEGERREAL(以及 DOUBLE PRECISION)COMPLEXLOGICALCHARACTERTYPE(派牛类型的名称由用户命名)数组属性 DI
3、MENSIONALLOCATABLE指针属性 POINTERTARGET值设置 DATAPARAMETER对象可访问性与调用PUBLICPRIVATEINTENTOPTIONALSAVE过程属性 EXTERNALINTRINSIC对象关系属性NAMELISTEQUIVALENCECOMMON这些关键词的使用,或者说属性的声明有2 种方式: 在类型声明时附加属性说明,这种语句形式侧重在给出数据对象,属性说明是附加 的; 使用单独的属性声明语句,这种语句形式侧重在说明属性本身。之所以会出现2种声明方式,完全是历史的缘故。FORTRAN的早期版本里,任何的对 象属性说明,都是运用单独的属性声明语句,
4、如果一个数据对象同时具有多种属性,就需要 使用相应的多个属性声明语句,从程序阅读的角度来看,会显得很烦琐,因此到了 FORTRAN90 和 95 版本,只要在程序单元当中需要声明一个数据对象的类型,那么就可以 把它的其他所有属性都附加到它的类型声明语句当中,使得程序显得更加紧凑。【例7-1】我们要定义2个实型变量X,Y,同时还要声明它们都具有指针属性,在早 期 FORTRAN 语言里写为:REAL X,YPOINTER X,Y换一种更加紧凑的写法就是把这2 条语句写为 1 句:REAL POINTER:X,Y之所以我们还需要讨论单独的属性语句,主要是有时候需要保持源码的向前兼容性,而 且在少数
5、情况下,这 2 种形式也并完全等价。因此在本章在讨论各种属性的声明方式的时候, 将首先给出面向数据对象的声明方式,然后给出等价的面向属性的声明方式。在这 2 种表示属性的方式里,同样由于历史的缘故,数组的维度属性 DIMENSION 既 可以附加在类型声明语句当中表述,也可以单独声明,实际上 DIMENSION 这个关键词属 于老式 FORTRAN 的遗留物,在新的表述方式里面,完全可以省略它。【例 7-2】COMPLEX XDIMENSION X(35)COMPLEX X(35)SAVE XCOMPLEX,DIMENSION(35),SAVE:XCOMPLEX,SAVE:X(35)以上 4种
6、表述方式是完全等价的,显然最后一种最简洁。 在一个程序单元里面,引用一个数据对象的前提是已经声明了它的种种必需属性,数据 对象的各种属性里面,最为基本的当然是数据对象的类型,然后还需要声明其各种必需的属 性,这样该数据对象才能被程序正确地调用访问。然而在一个实际的程序里面,数据对象的 声明在表面上可能并不是完备的,同时又不是非法的语法,出现这种情况的原因如下: 在 FORTRAN 的早期版本里,为了求简化的缘故,使用了一种隐式约定数据类型的 方式,即通过数据对象的名称的第一个字母来分辨其所属类型,这种类型声明方式 被后来的FORTRAN版本一直沿用下来了,因此如果一个程序单元里出现的数据对 象
7、没有经过类型声明语句的专门声明,则需要考虑其是否属于隐式声明。相反,如 果想排除这种隐式声明的影响,则需要另外单独加以IMPLICIT NONE语句作为声 明。 任何其他的属性如果没有出现的话,或者是因为该数据对象不需要某种属性,或者 是该数据对象的某种属性采取了默认设置。从上面的分类表7-1可以看到,FORTRAN的属性除了用来说明数据类型的属性之外, 其他属性都是针对不同的数据类型或程序对象,以及它们的各种特征的。例如数组属性只是 用来说明数组,指针属性只是用来说明指针,而过程属性只是用来说明过程,下面将分类讨 论这些属性。7.2 类型声明语句我们在讨论第5章讨论数据类型的时候给出数据类型
8、的基本声明语句的句法形式,这里 将侧重于数据类型的声明与其他相关属性的兼容,因为从语言的简洁与自然的角度出发,把 一个数据对象的类型和其他属性都归结为一条数据声明语句是非常可取的,所以我们得到如 下的一般的类型声明句法形式(R501):type-specification , attribute- specification.: entity-declaration-list即作为选项,在一条数据对象的类型声明(type-specification)语句当中,在数据项声明的 列表(entity-declaration-list)之前,给出相应的属性说明(attribute- specifica
9、tion),方括号表示 可选。类型说明(type-specification)的一般句法形式(R502)是如下几种形式之一:INTEGER kind-selectorREAL kind-selectorDOUBLE PRECISIONCOMPLEX kind-selectorCHARACTER character-selectorLOGICAL kind-selectorTYPE(type-name)其中种别选择符(kind-selector)的句法形式(R506)为:(KIND = kind-value)其中种别值(kind-value)是一个标量整型表达式。属性说明(attribute-
10、specificatio n)的一般句法形式(R503)为如下几种形式之一:PARAMETERALLOCATABLEDIMENSION(array- specification)EXTERNALINTENT(intent-specification)INTRINSICOPTIONALPOINTERSAVETARGETaccess- specification其中的可访问性说明(access- specification)包括 PUBLIC 和 PRIVATE。数据项声明的一般句法形式(R505)为如下2种形式之一:object-name (array- specification) *char
11、acter-length initializationfunction-name (array- specification) *character-length其中初始化(initialization)的一般句法形式(R505)为如下2种形式之一:= initialization-expression=NULL()类型声明的一般规则如下: 对数据对象的说明优先于隐式类型描述,即隐式类型描述法永远只是在数据对象没 有获得任何说明的情况下的默认法则,而显式说明既可以与隐式法则一致,也可以不一 致。 在一个类型声明语句当中,同一个属性只能出现一次。 在一个作用域内,一个数据项的任何属性只要约定了一
12、次,就不可再次约定。 种别选择符所取的种别值只能是编译系统所许可的相应类型的种别参数之一。字符长度(character-length)选项只能出现在CHARACTER类型的声明语句当中。 如果使用初始化语句,则必须在数据项声明前使用双冒号(;)。 如果数据变量被初始化设置为数组,那么该数组的形状一定要得到说明,或者是在 类型声明语句当中,或者是在同一个作用域内此前的属性声明语句当中。 如果数据对象被赋予 PARAMETER 属性,那么其中必须包含初始化语句。如果在初始化语句当中出现符号=,那么该被初始化的对象必定具有POINTER属 性;如果在初始化语句当中出现符号=,那么该被初始化的对象肯定
13、不具有POINTER 属性。所谓函数名称(function-name),或者是一个外部函数的名称,或者是一个固有函数的 名称,或者是一个函数哑过程的名称,或者是一个语句函数的名称。 一个数组函数名称或者是被指定为显形数组,或者是具有POINTER属性,从而被指 定为待定形数组。有关属性声明的其他规则以及属性之间的兼容性在后面会详悉讨论。 【例 7-3】 下面是一些附加了其他属性的数据类型声明语句:REAL, INTENT(IN) : COSREAL, INTRINSIC : SININTEGER X(25) LOGICAL,DIMENSION(10,15):RESULT1,RESULT2 IN
14、TEGER,PARAMETER:SHORT=SELECTED_INT_KIND(4) COMPLEX : SQUARE_ROOT = ( 2.76, -0.85)REAL, ALLOCATABLE : X( : , : )TYPE, POINTER : CURRENT_OF_SAMPLE = NULL()7.2.1 整型INTEGER语句声明了整型数据对象的名称,同时也可以附加种别参数以及其他属性。 如果给出种别选择符,即说明该整型数据的表示方法。声明一个数据对象属于整型数据的基本语句句法为:INTEGER ( KIND = kind-value ) , attribute-list : en
15、try-list【例 7-4】 以下这些声明语句主要是要说明数据项:INTEGER XINTEGER DIMENSION(:), POINTER : days, hours INTEGER(SHORT)RED_BALLINTEGER(2) POINTER : k, limitINTEGER(1) DIMENSION(10) : min【例 7-5】 以下这些声明语句主要是要说明数据的属性:INTEGER days, hoursINTEGER(2) k, limitINTEGER(1) minDIMENSION days(:), hours(:), min (10)POINTER days, hours, k, limit7.2.2 实型REAL 语句声明了实型数据对象的名称,同时也可以附加种别参数以及其他属性。如果 给出种别选择符,即说明该实型数据的表示方法。双精度实型数据还可以使用DOUBLE PRECISION语句加以声明,