Fortran程序设计第7节 属性的声明.docx

上传人:b****7 文档编号:25036207 上传时间:2023-06-04 格式:DOCX 页数:62 大小:45.76KB
下载 相关 举报
Fortran程序设计第7节 属性的声明.docx_第1页
第1页 / 共62页
Fortran程序设计第7节 属性的声明.docx_第2页
第2页 / 共62页
Fortran程序设计第7节 属性的声明.docx_第3页
第3页 / 共62页
Fortran程序设计第7节 属性的声明.docx_第4页
第4页 / 共62页
Fortran程序设计第7节 属性的声明.docx_第5页
第5页 / 共62页
点击查看更多>>
下载资源
资源描述

Fortran程序设计第7节 属性的声明.docx

《Fortran程序设计第7节 属性的声明.docx》由会员分享,可在线阅读,更多相关《Fortran程序设计第7节 属性的声明.docx(62页珍藏版)》请在冰豆网上搜索。

Fortran程序设计第7节 属性的声明.docx

Fortran程序设计第7节属性的声明

第7章 属性的声明

最后,对于数据我们剩下的工作,就是如何运用FROTRAN语言来完整地加以描述。

FORTRAN语言完成对数据的描述的语法单位是数据声明语句,在前面2章里面,我们整理好问题当中需要涉及的数据及其结构之后,要以FORTRAN语言写下来,就是使用FORTRAN的声明语句,这些语句的句法设计保证能够完备的描述我们关于数据所需要说明的一切属性。

数据对象首先需要予以说明的当然就是它的类型,因此我们首先给出对象的类型声明语句,特别地,需要说明在最初FORTRAN标准里面遗留下来的一种数据类型描述方法——隐式类型描述法,然后讨论各种数据对象所可能具有的属性。

●数组属性;

●指针属性;

●值特征;

●对象可访问性与使用属性;

●特征兼容性;

●自动数据对象;

●存储关联。

由于本章集中讨论FORTRAN的声明语句,而声明的对象除了数据之外,其他的程序对象,例如函数,过程等也需要声明其类型或属性,因此本章一并讨论对其他程序对象的声明:

●过程属性;

●NAMELIST语句;

7.1 属性及其声明方式

所谓一个对象的属性,就是程序使用该对象的方式。

本章所讨论的属性的大体分类与作为其名称的关键词见表7-1:

 

表7-1属性的分类及其关键词

数据类型 INTEGER

     REAL(以及DOUBLEPRECISION)

     COMPLEX

     LOGICAL

     CHARACTER

     TYPE(派生类型的名称由用户命名)

数组属性 DIMENSION

     ALLOCATABLE

指针属性 POINTER

         TARGET

值设置   DATA

     PARAMETER

对象可访问性与调用         PUBLIC

         PRIVATE

         INTENT

         OPTIONAL

         SAVE

过程属性 EXTERNAL

     INTRINSIC

对象关系属性               NAMELIST

         EQUIVALENCE

         COMMON

  

这些关键词的使用,或者说属性的声明有2种方式:

●   在类型声明时附加属性说明,这种语句形式侧重在给出数据对象,属性说明是附加的;

●   使用单独的属性声明语句,这种语句形式侧重在说明属性本身。

之所以会出现2种声明方式,完全是历史的缘故。

FORTRAN的早期版本里,任何的对象属性说明,都是运用单独的属性声明语句,如果一个数据对象同时具有多种属性,就需要使用相应的多个属性声明语句,从程序阅读的角度来看,会显得很烦琐,因此到了FORTRAN90和95版本,只要在程序单元当中需要声明一个数据对象的类型,那么就可以把它的其他所有属性都附加到它的类型声明语句当中,使得程序显得更加紧凑。

【例7-1】我们要定义2个实型变量X,Y,同时还要声明它们都具有指针属性,在早期FORTRAN语言里写为:

   REALX,Y

   POINTERX,Y

换一种更加紧凑的写法就是把这2条语句写为1句:

   REALPOINTER:

X,Y

之所以我们还需要讨论单独的属性语句,主要是有时候需要保持源码的向前兼容性,而且在少数情况下,这2种形式也并完全等价。

因此在本章在讨论各种属性的声明方式的时候,将首先给出面向数据对象的声明方式,然后给出等价的面向属性的声明方式。

在这2种表示属性的方式里,同样由于历史的缘故,数组的维度属性DIMENSION既可以附加在类型声明语句当中表述,也可以单独声明,实际上DIMENSION这个关键词属于老式FORTRAN的遗留物,在新的表述方式里面,完全可以省略它。

【例7-2】

   COMPLEXX

   DIMENSIONX(35)

   SAVEX

 

   COMPLEXX(35)

   SAVEX

 

   COMPLEX,DIMENSION(35),SAVE:

X

 

   COMPLEX,SAVE:

X(35)

以上4种表述方式是完全等价的,显然最后一种最简洁。

在一个程序单元里面,引用一个数据对象的前提是已经声明了它的种种必需属性,数据对象的各种属性里面,最为基本的当然是数据对象的类型,然后还需要声明其各种必需的属性,这样该数据对象才能被程序正确地调用访问。

然而在一个实际的程序里面,数据对象的声明在表面上可能并不是完备的,同时又不是非法的语法,出现这种情况的原因如下:

●   在FORTRAN的早期版本里,为了求简化的缘故,使用了一种隐式约定数据类型的方式,即通过数据对象的名称的第一个字母来分辨其所属类型,这种类型声明方式被后来的FORTRAN版本一直沿用下来了,因此如果一个程序单元里出现的数据对象没有经过类型声明语句的专门声明,则需要考虑其是否属于隐式声明。

相反,如果想排除这种隐式声明的影响,则需要另外单独加以IMPLICITNONE语句作为声明。

●   任何其他的属性如果没有出现的话,或者是因为该数据对象不需要某种属性,或者是该数据对象的某种属性采取了默认设置。

从上面的分类表7-1可以看到,FORTRAN的属性除了用来说明数据类型的属性之外,其他属性都是针对不同的数据类型或程序对象,以及它们的各种特征的。

例如数组属性只是用来说明数组,指针属性只是用来说明指针,而过程属性只是用来说明过程,下面将分类讨论这些属性。

7.2 类型声明语句   

我们在讨论第5章讨论数据类型的时候给出数据类型的基本声明语句的句法形式,这里将侧重于数据类型的声明与其他相关属性的兼容,因为从语言的简洁与自然的角度出发,把一个数据对象的类型和其他属性都归结为一条数据声明语句是非常可取的,所以我们得到如下的一般的类型声明句法形式(R501):

       type-specification[[,attribute-specification]…:

:

]entity-declaration-list

即作为选项,在一条数据对象的类型声明(type-specification)语句当中,在数据项声明的列表(entity-declaration-list)之前,给出相应的属性说明(attribute-specification),方括号[]表示可选。

●   类型说明(type-specification)的一般句法形式(R502)是如下几种形式之一:

       INTEGER[kind-selector]

       REAL[kind-selector]

       DOUBLEPRECISION

       COMPLEX[kind-selector]

       CHARACTER[character-selector]

       LOGICAL[kind-selector]

       TYPE(type-name)

其中种别选择符(kind-selector)的句法形式(R506)为:

       ([KIND=]kind-value)

其中种别值(kind-value)是一个标量整型表达式。

●   属性说明(attribute-specification)的一般句法形式(R503)为如下几种形式之一:

       PARAMETER

       ALLOCATABLE

       DIMENSION(array-specification)

       EXTERNAL

       INTENT(intent-specification)

       INTRINSIC

       OPTIONAL

       POINTER

       SAVE

       TARGET

       access-specification

其中的可访问性说明(access-specification)包括PUBLIC和PRIVATE。

●   数据项声明的一般句法形式(R505)为如下2种形式之一:

       object-name[(array-specification)][*character-length][initialization]

       function-name[(array-specification)][*character-length]

其中初始化(initialization)的一般句法形式(R505)为如下2种形式之一:

       =initialization-expression

       =>NULL()

   类型声明的一般规则如下:

●对数据对象的说明优先于隐式类型描述,即隐式类型描述法永远只是在数据对象没有获得任何说明的情况下的默认法则,而显式说明既可以与隐式法则一致,也可以不一致。

●在一个类型声明语句当中,同一个属性只能出现一次。

●在一个作用域内,一个数据项的任何属性只要约定了一次,就不可再次约定。

●种别选择符所取的种别值只能是编译系统所许可的相应类型的种别参数之一。

●字符长度(character-length)选项只能出现在CHARACTER类型的声明语句当中。

●如果使用初始化语句,则必须在数据项声明前使用双冒号(;;)。

●如果数据变量被初始化设置为数组,那么该数组的形状一定要得到说明,或者是在类型声明语句当中,或者是在同一个作用域内此前的属性声明语句当中。

●如果数据对象被赋予PARAMETER属性,那么其中必须包含初始化语句。

●如果在初始化语句当中出现符号=>,那么该被初始化的对象必定具有POINTER属性;如果在初始化语句当中出现符号=,那么该被初始化的对象肯定不具有POINTER属性。

●所谓函数名称(function-name),或者是一个外部函数的名称,或者是一个固有函数的名称,或者是一个函数哑过程的名称,或者是一个语句函数的名称。

●一个数组函数名称或者是被指定为显形数组,或者是具有POINTER属性,从而被指定为待定形数组。

有关属性声明的其他规则以及属性之间的兼容性在后面会详悉讨论。

【例7-3】下面是一些附加了其他属性的数据类型声明语句:

   REAL,INTENT(IN):

:

COS

   REAL,INTRINSIC:

:

SIN   

INTEGERX(25)

   LOGICAL,DIMENSION(10,15):

RESULT1,RESULT2

   INTEGER,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]:

:

]entry-list

【例7-4】以下这些声明语句主要是要说明数据项:

INTEGERX

INTEGERDIMENSION(:

),POINTER:

:

days,hours

INTEGER(SHORT)RED_BALL

INTEGER

(2)POINTER:

:

k,limit

INTEGER

(1)DIMENSION(10):

:

min

【例7-5】以下这些声明语句主要是要说明数据的属性:

  INTEGERdays,hours

  INTEGER

(2)k,limit

  INTEGER

(1)min

  DIMENSIONdays(:

),hours(:

),min(10)

  POINTERdays,hours,k,limit

7.2.2 实型

REAL语句声明了实型数据对象的名称,同时也可以附加种别参数以及其他属性。

如果给出种别选择符,即说明该实型数据的表示方法。

双精度实型数据还可以使用DOUBLEPRECISION语句加以声明,当然与在REAL语句当中使用种别参数是完全等价的。

由于DOUBLEPRECISION本身指出了精度表示方法,因此不能再在后面附加种别选择符。

不过DOUBLE这个词也可以作为一个命名整型常量,取双精度实型的种别参数值,这样就可以使用REAL(DOUBLE)来声明双精度实型数据了。

实型数据的声明的格式如下:

REAL[([KIND=]kind-value)][[,attribute-list]:

:

]entry-list

DOUBLEPRECISION [,attribute-list]:

:

]entry-list

【例7-6】下面是各种形式的主要说明数据项的声明语句:

  REAL(KIND=high),OPTIONAL:

:

testval

  REAL,SAVE:

:

a(10),b(20,30)

  DOUBLEPRECISION,POINTER:

A,B(:

,:

  DOUBLEPRECISION,DIMENSION(5,10):

TABLE1,TABLE2

  REAL(DOUBLE),POINTER:

A,B(:

,:

  REAL(DOUBLE),DIMENSION(5,10):

TABLE1,TABLE2

【例7-7】下面是各种形式的主要说明数据属性的声明语句:

REAL(KIND=high)testval

  REALa(10),b(20,30)

  OPTIONALtestval

  SAVEa,b

 

  DOUBLEPRECISIONTABLE1,TABLE2

  DIMENSIONTABLE1(5,10),TABLE2(5,10),B(:

,:

  POINTERA

可以比较什么两种表示方法,在说明了同样的意思的前提下,把属性说明附加在数据类型说明语句当中,比每一种属性单独一个语句加以说明要简洁自然得多。

7.2.3 复型

COMPLEX语句声明了复型数据对象的名称,同时也可以附加种别参数以及其他属性。

如果给出种别选择符,即说明该复型数据的表示方法。

说明复型数据类型的句法为:

 COMPLEX[([KIND=]kind-value)][[,attribute-list]:

:

]entry-list

【例7-8】下面是各种形式的复型数据对象声明语句:

COMPLEXch

COMPLEX(KIND=4),PRIVATE:

:

zz,yy   !

等价于COMPLEX*8zz,yy

COMPLEX(8)ax,by !

等价于COMPLEX*16ax,by

COMPLEX(kind(4))y(10)

complex(kind=8) x,z(10)

7.2.4 逻辑型

LOGICA语句声明了逻辑型数据对象的名称,同时也可以附加种别参数以及其他属性。

如果给出种别选择符,即说明该逻辑型数据的表示方法。

说明逻辑型数据类型的句法为:

LOGICAL[([KIND=]kind-value)][[,attribute-list]:

:

]entry-list

【例7-9】下面是各种形式的主要说明逻辑型对象的声明语句:

LOGICAL,ALLOCATABLE:

:

flag1,flag2

LOGICAL(KIND=byte),SAVE:

:

doit,dont

【例7-10】下面是各种形式的主要说明对象的属性的声明语句:

LOGICALflag1,flag2

LOGICAL(KIND=byte)doit,dont

ALLOCATABLEflag1,flag2

SAVEdoit,don’t

7.2.5字符型

CHARACTER语句声明了字符型数据对象的名称,同时也可以附加种别参数以及其他属性。

如果给出字符选择符,即说明该字符型数据的最大字符长度。

说明字符型数据类型的句法为:

CHARACTER[character-selector][,attribute-list:

:

]entry-list

其中的字符选择符(character-selector)的句法形式(R507)可以为如下几种:

length-selector

(LEN=length-value,KIND=kind-value)

(length-value,[KIND=]kind-value)

(KIND=kind-value [,LEN=length-value])

其中长度选择符(length-selector)的句法形式(R508)可以是:

   ([LEN=]length-value)

   *character-length[,]

其中字符长度(LEN)(R509)可以是:

   (length-value)

   scalar-integer-literal-constant

其中长度值(length-value)(R510)可以是:

   specification-expression

   *

在上面的类型说明当中,使用星号*来标志字符长度的方式属于过时的方式,不过不是指在数据项里面使用的星号*。

字符型数据对象类型声明语句的一般规则如下:

●只有在没有使用双冒号的情况下,在长度选择符里才可以使用逗号。

●字符型数据对象的字符长度在一定的情形下,是可以发生动态变化的,即当一个字符型数据的声明语句出现在一个过程或者是过程界面当中,同时该数据对象又不是某个派生数据对象的成员,那么它的字符长度可以使用非常量表达式,该表达式的具体取值只有当访问该过程时才被确定,并且当该过程的运行时,表达式里变量的变化并不影响字符长度值。

这样一种数据对象如果不属于哑元,则属于自动数据对象的范畴。

●字符长度的说明有三种情形:

•首先在数据项或数据项列的成员里给出字符长度;

•如果没有上面的长度说明,则在数据类型说明部分给出命名字符数据项或派生类型定义当中的字符成员的字符选择符,用来给出长度属性;

•如果一个字符型数据既没有使用字符选择符,也没有使用字符长度来说明其长度,那么默认的字符长度为1。

●如果长度参数取负值,那么相应的字符项长度为0。

●给定了字符长度的标量整型文字常量不能再附加任何种别参数,否则在固定源码形式里面就会导致歧义。

●采用带星号*的长度说明只能使用于以下几种情形:

•可以应用于过程的哑元,当过程被调用时,哑元就被赋予相应实元的长度;

•可以用于声明命名常量,这时它的长度是一个常量值;

•可以用于声明一个外部函数的结果变量的长度。

任何调用该函数的作用域单元如果使用带星号的长度说明,就意味着主程序可以访问该声明。

当函数被调用的时候,结果变量的长度的取值由引用该函数的程序单元里面的相应声明语句决定。

本规则暗示了在IMPLICIT语句当中不能使用带星号*的长度说明方式。

●如果一个函数属于内部函数或模块函数,或者该函数的值为数组,指针或递归形式,那么该函数名不能使用带星号*的长度声明。

●字符值语句函数或字符型语句函数哑元的长度必须是整型常量表达式。

【例7-11】下面是各种形式的主要说明字符型数据对象的声明语句:

CHARACTER(LEN=25,KIND=GREEK),DIMENSION(11):

Z1

CHARACTER(LEN=20,KIND=KANJI),SAVE:

GREETING

(2)

CHARACTER(10):

QUESTION=“WHERE?

CHARACTER(LEN=*,KIND=CHINESE),PARAMETER:

MESSAGE=&

“简朴是语言的一种美德”

CHARACTER(*),INTENT(IN):

SCHOOL,HOME

CHARACTER*3,SAVE:

:

COMPONENT_1,LONGER(9)*20,COMPONENT_2

CHARACTER:

:

RESULT=“PASS”

例7-12:

下面是各种形式的主要说明字符型数据的属性的声明语句:

CHARACTER(70)PROJECT

CHARACTER(LEN=30,KIND=GERMAN)TRANSFORMATION

CHARACTER(LEN=25,KIND=GREEK)Z1

CHARACTER(LEN=20,KIND=KANJI)GREETING

(2)

CHARACTER(10)QUESTION

CHARACTER(*)SCHOOL,HOME

CHARACTER*3COMPONENT_1,LONGER(9)*20,COMPONENT_2

CHARACTER RESULT

SAVEGREETING

(2)

INTENT(IN)SCHOOL,HOME

DATAQUESTION/“WHERE?

”/

CHARACTER(*)MESSAGE

PARAMETER(MESSAGE=&

   “简朴是语言的一种美德”)

7.2.6 派生类型

TYPE语句声明了用户派生数据类型对象的名称,派生类型的名称写在紧跟TYPE后面的一对括号当中,声明派生类型的数据对象的一般句法为:

TYPE(type-name)[,attribute-list:

:

]entry-list

派生类型声明语句的一般规则如下:

●如果一个派生类型对象是私有的话,就不能附加PUBLIC属性。

●结构构造器必须用来初始化派生类型数据对象,结构构造器里的表达式必须是初始化表达式。

●如果需要声明的派生数据对象是一个函数的结果,那么它就可以在FUNCTION语句当中予以说明。

【例7-13】下面是各种形式的主要说明派生数据对象的声明语句:

   TYPE(SAMPLE),DIMENSION(:

),ALLOCATABLE:

STOVE

   TYPE(STUDENT),SAVE:

GRAD(5)

   TYPE(HOMEWORK),SAVE:

QUESTION,TAPE,WORD_SHEET

【例7-14】下面是各种形式的主要说明派生数据对象的属性的声明语句:

   TYPE(SAMPLE)STOVE

   TYPE(STUDENT)GRAD(5)

   TYPE(HOMEWORK)QUESTION,TAPE,WORD_SHEET

   DIMENSION STOVE(:

ALLOCATABLE STOVE

   SAVE GRAD(5), QUESTION,TAPE,WORD_

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 医药卫生 > 临床医学

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1