Fortran程序設(shè)計第7章屬性聲明_第1頁
Fortran程序設(shè)計第7章屬性聲明_第2頁
Fortran程序設(shè)計第7章屬性聲明_第3頁
Fortran程序設(shè)計第7章屬性聲明_第4頁
Fortran程序設(shè)計第7章屬性聲明_第5頁
已閱讀5頁,還剩35頁未讀 繼續(xù)免費閱讀

下載本文檔

版權(quán)說明:本文檔由用戶提供并上傳,收益歸屬內(nèi)容提供方,若內(nèi)容存在侵權(quán),請進行舉報或認領(lǐng)

文檔簡介

1、第7章 屬性的聲明最后,對于數(shù)據(jù)我們剩下的工作,就是如何運用FROTRAN語言來完整地加以描述。FORTRAN語言完成對數(shù)據(jù)的描述的語法單位是數(shù)據(jù)聲明語句,在前面2章里面,我們整理好問題當(dāng)中需要涉及的數(shù)據(jù)及其結(jié)構(gòu)之后,要以FORTRAN語言寫下來,就是使用FORTRAN的聲明語句,這些語句的句法設(shè)計保證能夠完備的描述我們關(guān)于數(shù)據(jù)所需要說明的一切屬性。數(shù)據(jù)對象首先需要予以說明的當(dāng)然就是它的類型,因此我們首先給出對象的類型聲明語句,特別地,需要說明在最初FORTRAN標準里面遺留下來的一種數(shù)據(jù)類型描述方法隱式類型描述法,然后討論各種數(shù)據(jù)對象所可能具有的屬性。 數(shù)組屬性; 指針屬性; 值特征; 對象

2、可訪問性與使用屬性; 特征兼容性; 自動數(shù)據(jù)對象; 存儲關(guān)聯(lián)。由于本章集中討論FORTRAN的聲明語句,而聲明的對象除了數(shù)據(jù)之外,其他的程序?qū)ο?,例如函?shù),過程等也需要聲明其類型或?qū)傩?,因此本章一并討論對其他程序?qū)ο蟮穆暶鳎?過程屬性; NAMELIST語句; 7.1 屬性及其聲明方式所謂一個對象的屬性,就是程序使用該對象的方式。本章所討論的屬性的大體分類與作為其名稱的關(guān)鍵詞見表7-1:表7-1屬性的分類及其關(guān)鍵詞數(shù)據(jù)類型 INTEGER REAL(以及DOUBLE PRECISION) COMPLEX LOGICAL CHARACTER TYPE(派生類型的名稱由用戶命名)數(shù)組屬性 DIME

3、NSION ALLOCATABLE指針屬性 POINTER TARGET值設(shè)置 DATA PARAMETER對象可訪問性與調(diào)用 PUBLIC PRIVATE INTENT OPTIONAL SAVE過程屬性 EXTERNAL INTRINSIC對象關(guān)系屬性 NAMELIST EQUIVALENCE COMMON 這些關(guān)鍵詞的使用,或者說屬性的聲明有2種方式: 在類型聲明時附加屬性說明,這種語句形式側(cè)重在給出數(shù)據(jù)對象,屬性說明是附加的; 使用單獨的屬性聲明語句,這種語句形式側(cè)重在說明屬性本身。之所以會出現(xiàn)2種聲明方式,完全是歷史的緣故。FORTRAN的早期版本里,任何的對象屬性說明,都是運用單獨

4、的屬性聲明語句,如果一個數(shù)據(jù)對象同時具有多種屬性,就需要使用相應(yīng)的多個屬性聲明語句,從程序閱讀的角度來看,會顯得很煩瑣,因此到了FORTRAN90和95版本,只要在程序單元當(dāng)中需要聲明一個數(shù)據(jù)對象的類型,那么就可以把它的其他所有屬性都附加到它的類型聲明語句當(dāng)中,使得程序顯得更加緊湊?!纠?-1】 我們要定義2個實型變量X,Y,同時還要聲明它們都具有指針屬性,在早期FORTRAN語言里寫為: REAL X,Y POINTER X,Y換一種更加緊湊的寫法就是把這2條語句寫為1句: REAL POINTER:X,Y之所以我們還需要討論單獨的屬性語句,主要是有時候需要保持源碼的向前兼容性,而且在少數(shù)情

5、況下,這2種形式也并完全等價。因此在本章在討論各種屬性的聲明方式的時候,將首先給出面向數(shù)據(jù)對象的聲明方式,然后給出等價的面向?qū)傩缘穆暶鞣绞?。在這2種表示屬性的方式里,同樣由于歷史的緣故,數(shù)組的維度屬性DIMENSION既可以附加在類型聲明語句當(dāng)中表述,也可以單獨聲明,實際上DIMENSION這個關(guān)鍵詞屬于老式FORTRAN的遺留物,在新的表述方式里面,完全可以省略它?!纠?-2】 COMPLEX X DIMENSION X(35) SAVE X COMPLEX X(35) SAVE X COMPLEX,DIMENSION(35),SAVE:X COMPLEX,SAVE:X(35)以上4種表述方

6、式是完全等價的,顯然最后一種最簡潔。在一個程序單元里面,引用一個數(shù)據(jù)對象的前提是已經(jīng)聲明了它的種種必需屬性,數(shù)據(jù)對象的各種屬性里面,最為基本的當(dāng)然是數(shù)據(jù)對象的類型,然后還需要聲明其各種必需的屬性,這樣該數(shù)據(jù)對象才能被程序正確地調(diào)用訪問。然而在一個實際的程序里面,數(shù)據(jù)對象的聲明在表面上可能并不是完備的,同時又不是非法的語法,出現(xiàn)這種情況的原因如下: 在FORTRAN的早期版本里,為了求簡化的緣故,使用了一種隱式約定數(shù)據(jù)類型的方式,即通過數(shù)據(jù)對象的名稱的第一個字母來分辨其所屬類型,這種類型聲明方式被后來的FORTRAN版本一直沿用下來了,因此如果一個程序單元里出現(xiàn)的數(shù)據(jù)對象沒有經(jīng)過類型聲明語句的專

7、門聲明,則需要考慮其是否屬于隱式聲明。相反,如果想排除這種隱式聲明的影響,則需要另外單獨加以IMPLICIT NONE語句作為聲明。 任何其他的屬性如果沒有出現(xiàn)的話,或者是因為該數(shù)據(jù)對象不需要某種屬性,或者是該數(shù)據(jù)對象的某種屬性采取了默認設(shè)置。從上面的分類表7-1可以看到,F(xiàn)ORTRAN的屬性除了用來說明數(shù)據(jù)類型的屬性之外,其他屬性都是針對不同的數(shù)據(jù)類型或程序?qū)ο?,以及它們的各種特征的。例如數(shù)組屬性只是用來說明數(shù)組,指針屬性只是用來說明指針,而過程屬性只是用來說明過程,下面將分類討論這些屬性。7.2 類型聲明語句 我們在討論第5章討論數(shù)據(jù)類型的時候給出數(shù)據(jù)類型的基本聲明語句的句法形式,這里將側(cè)

8、重于數(shù)據(jù)類型的聲明與其他相關(guān)屬性的兼容,因為從語言的簡潔與自然的角度出發(fā),把一個數(shù)據(jù)對象的類型和其他屬性都歸結(jié)為一條數(shù)據(jù)聲明語句是非??扇〉?,所以我們得到如下的一般的類型聲明句法形式(R501): type-specification ,attribute- specification: entity-declaration-list即作為選項,在一條數(shù)據(jù)對象的類型聲明(type-specification)語句當(dāng)中,在數(shù)據(jù)項聲明的列表(entity-declaration-list)之前,給出相應(yīng)的屬性說明(attribute- specification),方括號表示可選。 類型說明(ty

9、pe-specification)的一般句法形式(R502)是如下幾種形式之一: INTEGER kind-selector REAL kind-selector DOUBLE PRECISION COMPLEX kind-selector CHARACTER character-selector LOGICAL kind-selector TYPE(type-name)其中種別選擇符(kind-selector)的句法形式(R506)為: (KIND = kind-value)其中種別值(kind-value)是一個標量整型表達式。 屬性說明(attribute- specification

10、)的一般句法形式(R503)為如下幾種形式之一: PARAMETER ALLOCATABLE DIMENSION(array- specification) EXTERNAL INTENT(intent-specification) INTRINSIC OPTIONAL POINTER SAVE TARGET access- specification其中的可訪問性說明(access- specification)包括PUBLIC和PRIVATE。 數(shù)據(jù)項聲明的一般句法形式(R505)為如下2種形式之一: object-name (array- specification) *characte

11、r-length initialization function-name (array- specification) *character-length其中初始化(initialization)的一般句法形式(R505)為如下2種形式之一: = initialization-expression =NULL() 類型聲明的一般規(guī)則如下: 對數(shù)據(jù)對象的說明優(yōu)先于隱式類型描述,即隱式類型描述法永遠只是在數(shù)據(jù)對象沒有獲得任何說明的情況下的默認法則,而顯式說明既可以與隱式法則一致,也可以不一致。 在一個類型聲明語句當(dāng)中,同一個屬性只能出現(xiàn)一次。 在一個作用域內(nèi),一個數(shù)據(jù)項的任何屬性只要約定了一次,

12、就不可再次約定。 種別選擇符所取的種別值只能是編譯系統(tǒng)所許可的相應(yīng)類型的種別參數(shù)之一。 字符長度(character-length)選項只能出現(xiàn)在CHARACTER類型的聲明語句當(dāng)中。 如果使用初始化語句,則必須在數(shù)據(jù)項聲明前使用雙冒號(;)。 如果數(shù)據(jù)變量被初始化設(shè)置為數(shù)組,那么該數(shù)組的形狀一定要得到說明,或者是在類型聲明語句當(dāng)中,或者是在同一個作用域內(nèi)此前的屬性聲明語句當(dāng)中。 如果數(shù)據(jù)對象被賦予PARAMETER屬性,那么其中必須包含初始化語句。 如果在初始化語句當(dāng)中出現(xiàn)符號=,那么該被初始化的對象必定具有POINTER屬性;如果在初始化語句當(dāng)中出現(xiàn)符號=,那么該被初始化的對象肯定不具有P

13、OINTER屬性。 所謂函數(shù)名稱(function-name),或者是一個外部函數(shù)的名稱,或者是一個固有函數(shù)的名稱,或者是一個函數(shù)啞過程的名稱,或者是一個語句函數(shù)的名稱。 一個數(shù)組函數(shù)名稱或者是被指定為顯形數(shù)組,或者是具有POINTER屬性,從而被指定為待定形數(shù)組。有關(guān)屬性聲明的其他規(guī)則以及屬性之間的兼容性在后面會詳悉討論。【例7-3】 下面是一些附加了其他屬性的數(shù)據(jù)類型聲明語句: REAL, INTENT(IN) : COS REAL, INTRINSIC : SIN INTEGER X(25) LOGICAL,DIMENSION(10,15):RESULT1,RESULT2 INTEGER

14、,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語句聲明了整型數(shù)據(jù)對象的名稱,同時也可以附加種別參數(shù)以及其他屬性。如果給出種別選擇符,即說明該整型數(shù)據(jù)的表示方法。聲明一個數(shù)據(jù)對象屬于整型數(shù)據(jù)的基本語句句法為: INTEGER ( KIND = kind-value ) , attribute-list : entry

15、-list【例7-4】 以下這些聲明語句主要是要說明數(shù)據(jù)項:INTEGER XINTEGER DIMENSION(:), POINTER : days, hoursINTEGER(SHORT)RED_BALLINTEGER(2) POINTER : k, limitINTEGER(1) DIMENSION(10) : min【例7-5】 以下這些聲明語句主要是要說明數(shù)據(jù)的屬性: INTEGER days, hours INTEGER(2) k, limit INTEGER(1) min DIMENSION days(:), hours(:), min (10) POINTER days, ho

16、urs, k, limit7.2.2 實型REAL語句聲明了實型數(shù)據(jù)對象的名稱,同時也可以附加種別參數(shù)以及其他屬性。如果給出種別選擇符,即說明該實型數(shù)據(jù)的表示方法。雙精度實型數(shù)據(jù)還可以使用DOUBLE PRECISION語句加以聲明,當(dāng)然與在REAL語句當(dāng)中使用種別參數(shù)是完全等價的。由于DOUBLE PRECISION本身指出了精度表示方法,因此不能再在后面附加種別選擇符。不過DOUBLE這個詞也可以作為一個命名整型常量,取雙精度實型的種別參數(shù)值,這樣就可以使用REAL(DOUBLE)來聲明雙精度實型數(shù)據(jù)了。實型數(shù)據(jù)的聲明的格式如下: REAL ( KIND= kind-value ) , a

17、ttribute-list : entry-listDOUBLE PRECISION ,attribute-list : entry-list【例7-6】 下面是各種形式的主要說明數(shù)據(jù)項的聲明語句: REAL (KIND = high), OPTIONAL : testval REAL, SAVE : a(10), b(20,30) DOUBLE PRECISION,POINTER:A,B(:,:) DOUBLE PRECISION,DIMENSION(5,10):TABLE1,TABLE2 REAL(DOUBLE),POINTER:A,B(:,:) REAL(DOUBLE),DIMENSIO

18、N(5,10):TABLE1,TABLE2【例7-7】 下面是各種形式的主要說明數(shù)據(jù)屬性的聲明語句:REAL (KIND = high) testval REAL a(10), b(20,30) OPTIONAL testval SAVE a, b DOUBLE PRECISION TABLE1,TABLE2 DIMENSION TABLE1(5,10),TABLE2(5,10),B(:,:) POINTER A可以比較什么兩種表示方法,在說明了同樣的意思的前提下,把屬性說明附加在數(shù)據(jù)類型說明語句當(dāng)中,比每一種屬性單獨一個語句加以說明要簡潔自然得多。7.2.3 復(fù)型COMPLEX語句聲明了復(fù)型

19、數(shù)據(jù)對象的名稱,同時也可以附加種別參數(shù)以及其他屬性。如果給出種別選擇符,即說明該復(fù)型數(shù)據(jù)的表示方法。說明復(fù)型數(shù)據(jù)類型的句法為:COMPLEX (KIND = kind-value ) , attribute-list : entry-list【例7-8】 下面是各種形式的復(fù)型數(shù)據(jù)對象聲明語句:COMPLEX chCOMPLEX (KIND=4),PRIVATE : zz, yy !等價于COMPLEX*8 zz, yyCOMPLEX(8) ax, by ! 等價于COMPLEX*16 ax, byCOMPLEX (kind(4) y(10)complex (kind=8) x, z(10)7.

20、2.4 邏輯型LOGICA語句聲明了邏輯型數(shù)據(jù)對象的名稱,同時也可以附加種別參數(shù)以及其他屬性。如果給出種別選擇符,即說明該邏輯型數(shù)據(jù)的表示方法。說明邏輯型數(shù)據(jù)類型的句法為:LOGICAL (KIND = kind-value ) , attribute-list : entry-list【例7-9】 下面是各種形式的主要說明邏輯型對象的聲明語句:LOGICAL, ALLOCATABLE : flag1, flag2LOGICAL (KIND = byte), SAVE : doit, dont【例7-10】 下面是各種形式的主要說明對象的屬性的聲明語句:LOGICAL flag1, flag2

21、LOGICAL (KIND = byte) doit, dontALLOCATABLE flag1, flag2SAVE doit, dont7.2.5 字符型CHARACTER語句聲明了字符型數(shù)據(jù)對象的名稱,同時也可以附加種別參數(shù)以及其他屬性。如果給出字符選擇符,即說明該字符型數(shù)據(jù)的最大字符長度。說明字符型數(shù)據(jù)類型的句法為:CHARACTER character-selector , attribute-list : entry-list其中的字符選擇符(character-selector)的句法形式(R507)可以為如下幾種:length-selector(LEN =length-val

22、ue , 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-expressio

23、n *在上面的類型說明當(dāng)中,使用星號*來標志字符長度的方式屬于過時的方式,不過不是指在數(shù)據(jù)項里面使用的星號*。字符型數(shù)據(jù)對象類型聲明語句的一般規(guī)則如下: 只有在沒有使用雙冒號的情況下,在長度選擇符里才可以使用逗號。 字符型數(shù)據(jù)對象的字符長度在一定的情形下,是可以發(fā)生動態(tài)變化的,即當(dāng)一個字符型數(shù)據(jù)的聲明語句出現(xiàn)在一個過程或者是過程界面當(dāng)中,同時該數(shù)據(jù)對象又不是某個派生數(shù)據(jù)對象的成員,那么它的字符長度可以使用非常量表達式,該表達式的具體取值只有當(dāng)訪問該過程時才被確定,并且當(dāng)該過程的運行時,表達式里變量的變化并不影響字符長度值。這樣一種數(shù)據(jù)對象如果不屬于啞元,則屬于自動數(shù)據(jù)對象的范疇。 字符長度的說

24、明有三種情形: 首先在數(shù)據(jù)項或數(shù)據(jù)項列的成員里給出字符長度; 如果沒有上面的長度說明,則在數(shù)據(jù)類型說明部分給出命名字符數(shù)據(jù)項或派生類型定義當(dāng)中的字符成員的字符選擇符,用來給出長度屬性; 如果一個字符型數(shù)據(jù)既沒有使用字符選擇符,也沒有使用字符長度來說明其長度,那么默認的字符長度為1。 如果長度參數(shù)取負值,那么相應(yīng)的字符項長度為0。 給定了字符長度的標量整型文字常量不能再附加任何種別參數(shù),否則在固定源碼形式里面就會導(dǎo)致歧義。 采用帶星號*的長度說明只能使用于以下幾種情形:可以應(yīng)用于過程的啞元,當(dāng)過程被調(diào)用時,啞元就被賦予相應(yīng)實元的長度;可以用于聲明命名常量,這時它的長度是一個常量值;可以用于聲明一

25、個外部函數(shù)的結(jié)果變量的長度。任何調(diào)用該函數(shù)的作用域單元如果使用帶星號的長度說明,就意味著主程序可以訪問該聲明。當(dāng)函數(shù)被調(diào)用的時候,結(jié)果變量的長度的取值由引用該函數(shù)的程序單元里面的相應(yīng)聲明語句決定。本規(guī)則暗示了在IMPLICIT語句當(dāng)中不能使用帶星號*的長度說明方式。 如果一個函數(shù)屬于內(nèi)部函數(shù)或模塊函數(shù),或者該函數(shù)的值為數(shù)組,指針或遞歸形式,那么該函數(shù)名不能使用帶星號*的長度聲明。 字符值語句函數(shù)或字符型語句函數(shù)啞元的長度必須是整型常量表達式?!纠?-11】 下面是各種形式的主要說明字符型數(shù)據(jù)對象的聲明語句:CHARACTER (LEN=25,KIND=GREEK),DIMENSION(11):

26、Z1CHARACTER (LEN=20,KIND=KANJI),SAVE:GREETING(2)CHARACTER (10):QUESTION=“WHERE?”CHARACTER (LEN=*,KIND=CHINESE),PARAMETER:MESSAGE = &“簡樸是語言的一種美德”CHARACTER (*),INTENT(IN):SCHOOL, HOMECHARACTER *3, SAVE : COMPONENT_1, LONGER(9) *20, COMPONENT_2CHARACTER : RESULT = “PASS”例7-12:下面是各種形式的主要說明字符型數(shù)據(jù)的屬性的聲明語句:

27、CHARACTER (70)PROJECTCHARACTER (LEN=30, KIND=GERMAN)TRANSFORMATIONCHARACTER (LEN=25,KIND=GREEK)Z1CHARACTER (LEN=20,KIND=KANJI)GREETING(2)CHARACTER (10)QUESTIONCHARACTER (*)SCHOOL, HOMECHARACTER *3 COMPONENT_1, LONGER(9) *20, COMPONENT_2CHARACTER RESULT SAVE GREETING(2)INTENT(IN)SCHOOL, HOMEDATA QUES

28、TION /“WHERE?”/CHARACTER (*)MESSAGEPARAMETER( MESSAGE = & “簡樸是語言的一種美德”)7.2.6 派生類型TYPE語句聲明了用戶派生數(shù)據(jù)類型對象的名稱,派生類型的名稱寫在緊跟TYPE后面的一對括號當(dāng)中,聲明派生類型的數(shù)據(jù)對象的一般句法為:TYPE(type-name) , attribute-list : entry-list派生類型聲明語句的一般規(guī)則如下: 如果一個派生類型對象是私有的話,就不能附加PUBLIC屬性。 結(jié)構(gòu)構(gòu)造器必須用來初始化派生類型數(shù)據(jù)對象,結(jié)構(gòu)構(gòu)造器里的表達式必須是初始化表達式。 如果需要聲明的派生數(shù)據(jù)對象是一個函數(shù)

29、的結(jié)果,那么它就可以在FUNCTION語句當(dāng)中予以說明。【例7-13】 下面是各種形式的主要說明派生數(shù)據(jù)對象的聲明語句: TYPE(SAMPLE),DIMENSION( :),ALLOCATABLE:STOVE TYPE(STUDENT),SAVE:GRAD(5) TYPE(HOMEWORK),SAVE:QUESTION,TAPE,WORD_SHEET【例7-14】 下面是各種形式的主要說明派生數(shù)據(jù)對象的屬性的聲明語句: TYPE(SAMPLE)STOVE TYPE(STUDENT)GRAD(5) TYPE(HOMEWORK)QUESTION,TAPE,WORD_SHEET DIMENSION

30、 STOVE( :)ALLOCATABLE STOVE SAVE GRAD(5), QUESTION,TAPE,WORD_SHEET注意上面這兩種說明方法里面標點的不同用法。7.3 隱式類型描述法 當(dāng)初FORTRAN使用隱式類型聲明方法,是與語言的簡樸形態(tài)相適應(yīng)的,在硬件資源相對緊缺的時代,簡樸也能成為語言的一種美德,不過如果到了硬件資源相對富余的今天,還吝嗇于增加幾個關(guān)鍵詞和幾條聲明語句,就會顯得很落伍了,所以后來就增加了更為接近自然語言的聲明語句,不過,為了緬懷FORTRAN語言作為祖母級高級語言的榮耀,隱式類型聲明方式還是保留下來了,甚至默認為總是起作用,除非首先聲明了IMPLICIT

31、NONE語句。當(dāng)然,只要你樂意使用,這種類型聲明方式在某些情況下,還是非常方便簡明的。隱式類型聲明方法的出發(fā)點,是考慮到任何需要加以類型聲明的對象,如變量,命名常量,函數(shù)等,都需要一個名稱來指稱,那么就可以把它的類型這個信息負載在它的名稱上,最簡單的約定,就是讓名稱的第一個字母來標記它的類型,例如在默認的情形下:REAL: A B C D E F G H INTEGER: I J K L M NREAL: O P Q R S T U V W X Y Z可以發(fā)現(xiàn),上面對字母的默認分配并不是很難記憶,F(xiàn)ORTRAN沿用了數(shù)學(xué)里的很多習(xí)慣,這里使用I,J,K,L,M,N來表述整數(shù),就是一個明顯的數(shù)學(xué)

32、習(xí)慣。除了上面默認的首字母隱式類型法則,隱式類型聲明方法還有很靈活的一面,即利用IMPLICIT語句來自定義字母分配模式,一般的IMPLICIT語句的句法形式(R541)有2種,分別行使不同的功能: IMPLICIT type-specification(letter-specification-list) IMPLICIT NONE其中的字母分配說明列表的句法形式(R543)為: letter-letter這里IMPLICIT后面的字母分配表定義可以完全是自由定義,并且只是在該語句的作用域內(nèi)有效,而任何名稱在它的作用域內(nèi)只要是沒有專門的類型聲明語句,也沒有IMPLICIT語句,那么它就遵循上

33、面的默認首字母隱式類型法則。隱式類型的一般規(guī)則如下: 如果要使用IMPLICIT NONE語句,那么它必須放置在任何PARAMETER語句之前,并且在其作用域內(nèi),再也不能出現(xiàn)其他IMPLICIT語句。 IMPLICIT語句當(dāng)中出現(xiàn)的表述字母范圍的letter-letter,左邊的字母絕對不能是右邊字母的按照字母表順序的后面的字母。 letter-letter的字母之間為減號,而非下劃線,表示按照字母表順序從左邊字母到右邊字母的所有字母。 在一個作用域里面的IMPLICIT語句里面,同一個字母不能出現(xiàn)在字母分配說明列表里面的不同項里,例如作為單個字母出現(xiàn)了,又同時處于另一個字母范圍之中,或同時處

34、于2個不同的字母范圍里面。 IMPLICIT語句同樣可以用來為派生數(shù)據(jù)類型分配首字母作為類型標記。默認的首字母隱式類型法則與IMPLICIT語句之間的關(guān)系值得特別加以注意。例如給出約定:IMPLICIT COMPLEX(E-G,W-Z)然后在該語句的作用域里再也沒有其他IMPLICIT語句,也沒有類型聲明語句,那么在該作用域內(nèi)具有不屬于(E-G,W-Z)這個范圍的首字母的變量,將遵循默認首字母分配表,即首字母在范圍(A-D,H,O-V)內(nèi)的變量屬于實型,而首字母在范圍(I-N)內(nèi)的變量屬于整型。IMPLICIT NONE可以用來檢查名稱的錯誤拼寫,因為如果不加以這個語句的話,即使錯誤拼寫的名稱

35、,也會被看成遵循首字母隱式類型聲明方法的具有確定數(shù)據(jù)類型的變量,從而能夠通過語法檢查,反之使用該語句,就可以避免這種誤解?!纠?-15】 下面的IMPLICIT語句都是合法語句: IMPLICIT CHARACTER*30(B,T),COMPLEX(W-Z) IMPLICIT LOGICAL(KIND=BIT)(Q) IMPLICIT REAL(QUAD)(X-Z) IMPLICIT TYPE(NUMBER)(A-E) IMPLICIT TYPE(ARTICAL)(A,V),CHARACTER*100(B)【例7-16】 下面的IMPLICIT語句都是非法語句:IMPLICIT CHARACT

36、ER*30(B,T),COMPLEX(Z -W)!W應(yīng)該放置在Z 之!前。 IMPLICIT LOGICAL(KIND=BIT)(Q),REAL(QUAD)(P-T)!Q同時表!示2種類型。 IMPLICIT TYPE(ARTICAL)(A-H),CHARACTER*100(B,Q)!B同時表!示2種類型。使用隱式類型聲明在一個嵌套作用域里面所導(dǎo)致的變量作用域混亂問題在有關(guān)作用域之間通訊時再討論。7.4 數(shù)組屬性數(shù)組的概念來源于數(shù)學(xué)的向量概念,最大的特點就是數(shù)組的各個分量必須是同一種數(shù)據(jù)類型,同樣的種別參數(shù),具有同樣的屬性,因此數(shù)組本身作為一個數(shù)據(jù)對象,最主要的屬性就只剩下它的維度,也就是它的

37、秩。作為一個變量的數(shù)組可以有多種形式,除了它的分量可以發(fā)生變化之外,它的維度也可以發(fā)生變化,有3種情形需要數(shù)組的維度不予固定: 在程序運行當(dāng)中,數(shù)組所占據(jù)的存儲空間不是固定的,而是可重新分配的,這意味著該數(shù)組必定具有ALLOCATABLE屬性; 該數(shù)組被賦予指針的屬性,使得它的維度無法預(yù)先固定下來; 該數(shù)組本身就是一個啞元,它的維度依賴于別的變量對它的賦值情況。因此數(shù)組本身形狀的說明出現(xiàn)了4種形式,而數(shù)組所特有的屬性,主要就是DIMENSION和ALLOCATABLE,下面分小節(jié)予以說明。7.3.1 數(shù)組描述的4種形式數(shù)組描述的4種形式的句法形式(R513)為:explicit-shape-s

38、pecification-listdeferred-shape-specification-listassumed- shape-specification-listassumed-size-specification這四種形式分別用來描述數(shù)組在程序當(dāng)中出現(xiàn)的四種可能情形: 首先是最基本的顯形數(shù)組(explicit-shape arrays),即在定義數(shù)組的時候就已經(jīng)給出它的形狀; 當(dāng)一個數(shù)組具有指針屬性,或具有可分配屬性時,它的形狀就沒法預(yù)先給定,需要在程序運行過程當(dāng)中通過指針或分配過程予以確定,這時就需要使用待定形數(shù)組(deferred-shape arrays)的形式來加以描述; 當(dāng)數(shù)組

39、本身屬于啞元時,它的形狀就需要實元來賦予,這樣就需要使用啞形數(shù)組(assumed- shape arrays)的形式來加以描述; 如果實元賦予一個作為啞元的數(shù)組時,只是決定它的尺度,而沒有給定其他形狀要素,那么就需要使用啞尺度數(shù)組(assumed-size arrays)的形式來加以描述。下面我們將分節(jié)說明這四種數(shù)組的描述方式。數(shù)組的描述的一般規(guī)則如下: 按照FORTRAN標準,數(shù)組的秩至少可以達到7,盡管一般應(yīng)用環(huán)境里,秩為2或3是最常見的,但是對于一些特定的計算問題,可能需要用到非常高的維度的數(shù)組,所以一般的FORTRAN編譯器都能支持遠大于7的秩。 一個標量的秩為0。 待定形數(shù)組必定或者

40、具有POINTER的屬性,或者具有ALLOCATABLE的屬性。 啞形數(shù)組和啞尺度數(shù)組必定屬于啞元。 必須注意待定形數(shù)組和啞形數(shù)組的表示形式可能出現(xiàn)雷同的時候,即都是使用一個冒號表示。7.3.2 顯形數(shù)組顧名思義,所謂顯形數(shù)組就是對于數(shù)組的每一個維度都給出了具體的上下界,每個維度的顯形說明的句法形式(R514)如下: low-bound : upper-bound其中的上界(upper-bound)和下界(low-bound)為說明表達式。參見表達式。顯形數(shù)組的一般規(guī)則如下: 顯形數(shù)組的說明列表里所給出的上下界對的數(shù)目必須與該數(shù)組的維度數(shù)目一致。 如果下界被省略了,則表明取默認值1。 上下界可

41、以是正整數(shù),也可以是負整數(shù),還可以是0。 數(shù)組的下標范圍就是在上下界之間,包括上下界本身的所有整數(shù)集合,并且上界不能小于下界,如果出現(xiàn)這種情況,表明下標范圍為空集,或者說其相應(yīng)維度的寬度為0,而且數(shù)組的尺度也為0。 如果上下界是以表達式的形式出現(xiàn),那么可能包含變量,使得上下界的具體取值在數(shù)組所處的過程運行當(dāng)中發(fā)生變化,這時,該數(shù)組必定是一個啞元,或者是一個函數(shù)結(jié)果,或者是一個動態(tài)數(shù)組?!纠?-17】 下面是主要說明數(shù)據(jù)項的聲明語句: INTEGER X(20:30,5,-10:40) . SUBROUTINE AAA(I,J,K) REAL,DIMENSION(10:I+2,J):K .【例7

42、-18】 下面是主要說明屬性的聲明語句: INTEGER X(20:30,5,-10:40) . SUBROUTINE AAA(I,J,K) REAL KDIMENSION K(10:I+2,J) .7.3.3 待定形數(shù)組待定形數(shù)組用來表示具有指針屬性和可分配屬性的數(shù)組。 對于指針數(shù)組來說,數(shù)組的每個維度的寬度是在指針被分配或指針賦值語句被執(zhí)行之后才給定的; 對于可分配數(shù)組來說,它的上下界只是在被分配之后才給出。因此對于這種數(shù)組的形狀說明,只能使用一個冒號,即如下的句法形式(R518): : 待定形數(shù)組的一般規(guī)則如下: 待定形數(shù)組的秩等于它的說明列表當(dāng)中出現(xiàn)的冒號的數(shù)目。 當(dāng)待定形數(shù)組完成存儲

43、分配之后,它的上下界在ALLOCATE語句當(dāng)中被確定。 對一個指針數(shù)組的目標數(shù)組的每個維度執(zhí)行固有函數(shù)LBOUND,就能得到指針數(shù)組的相應(yīng)維度的下界;同樣的,對一個指針數(shù)組的目標數(shù)組的每個維度執(zhí)行固有函數(shù)UBOUND,就能得到指針數(shù)組的相應(yīng)維度的上界。因此, 如果上下界是由指針的分配決定,那么該數(shù)組的形狀就可以由用戶來指定; 如果上下界是由指針的賦值決定,那么該數(shù)組的形狀就可以有二種情形: 如果指針目標是一個命名全數(shù)組,那么上下界就由該數(shù)組的聲明決定,或者在該數(shù)組被分配之后給出; 如果指針目標是一個數(shù)組片斷,那么它的下界為1,而上界為所處維度的寬度。 如果指針數(shù)組或可分配的上下界里面包含變量,

44、那么當(dāng)變量在隨后有了重定義與去定義的情形的話,上下界不受這種變化的影響?!纠?-19】 下面是主要說明數(shù)據(jù)項的聲明語句: REAL,POINTER:A( : , : ),B( : , : ) REAL,ALLOCATABLE:A( : , : )【例7-20】 下面是主要說明屬性的聲明語句: REAL A( : , : ),B( : , : ) POINTER A,BALLOCATABLE A7.3.4 啞形數(shù)組所謂啞形數(shù)組,就是一個啞元,它的形狀只有在與一個實元相結(jié)合時才能定下來,啞形數(shù)組的說明句法(R517)為: low-bound :即只是可選地給出一個下界,然后就是一個冒號,下界闕如,

45、表示未定。啞形數(shù)組的一般規(guī)則如下: 啞形數(shù)組的說明列表當(dāng)中出現(xiàn)的冒號的個數(shù),就等于該數(shù)組的秩。 下界或者明確給出,或者省略,表示下界取默認值1。 上界等于數(shù)組在相應(yīng)維度上的寬度加下界值減1。 啞形數(shù)組不能具有POINTER或ALLOCATABLE這二種屬性。 未結(jié)合指針數(shù)組的尺度,界和形狀都是未定義的,這樣一個數(shù)組的任何部分都不能被引用或定義,不過這樣的數(shù)組可以作為固有查詢函數(shù)的變量出現(xiàn),從而可以查詢變量狀態(tài),數(shù)據(jù)類型性質(zhì),類型參數(shù),或者結(jié)合狀態(tài)?!纠?-21】 下面是主要說明數(shù)據(jù)項的聲明語句: SUBROUTING AAA(X,Y,Z) REAL,DIMENSION(5:,:):A REAL

46、,INTENT(IN):X( :),Y(5:)【例7-22】 下面是主要說明屬性的聲明語句: SUBROUTING AAA(X,Y,Z) REAL X( :),Y(5:),ZDIMENSION A(5:,:) INTENT(IN)X,Y .7.3.5 啞尺度數(shù)組一個啞尺度數(shù)組就是一個啞元,而它的尺度由與它相關(guān)聯(lián)的實元設(shè)定,因此在聲明啞尺度數(shù)組時,就給定了它的尺度,即秩,寬度和界(最后一個維度的上界和寬度除外)。對于啞尺度數(shù)組和實元之間的關(guān)聯(lián)有如下規(guī)則: 二者具有相同的初始數(shù)組元素。 后繼數(shù)組元素是按照存儲順序排列的。 啞元的聲明就需要給出數(shù)組的秩,所有維度的下界,以及除了最后一個維度之外的所有

47、的上界與寬度。 實元的尺度啞元的尺度。啞尺度數(shù)組的最后一個維度的上界不能給出,因此使用星號(*)表示。啞尺度數(shù)組的句法形式(R519)為: explicit-shape-list, low-bound: *可見,啞尺度數(shù)組與顯形數(shù)組在形式上的主要差別就是最后一個維度的上界有待給出。啞尺度數(shù)組的一般規(guī)則如下: 啞尺度數(shù)組的秩就是它的顯形數(shù)組的說明列表當(dāng)中的說明數(shù)目加1。 啞尺度數(shù)組的尺度根據(jù)以下途徑來決定: 如果與啞元相關(guān)聯(lián)的實元是非默認字符類型的任意其他類型數(shù)組,那么啞元的尺度就是實元的尺度。 如果與啞元相關(guān)聯(lián)的實元是非默認字符類型的任意其他類型數(shù)組元素,并且它的下標順序值是一個尺度為x的數(shù)組

48、當(dāng)中的v,那么該啞元的尺度為x-v+1。 如果與啞元相關(guān)聯(lián)的實元屬于默認字符類型數(shù)組,或者屬于默認字符型數(shù)組元,或者屬于默認字符型數(shù)組元素子串,假設(shè)它開始于一個以c作為字符存儲單位的數(shù)組的第t個字符存儲單位,那么啞元的尺度為:MAX(INT(c-t+1)/e),0)其中e是啞字符數(shù)組里的元素的長度。 設(shè)數(shù)組的秩為r,那么前r-1維的界都由相應(yīng)的顯形數(shù)組說明給定,最后一個維度的下界則由聲明中給出的下界給定,如果沒有給出,則取默認值1。 如果界的表達式里面包含變量,那么當(dāng)相應(yīng)過程執(zhí)行時,就會導(dǎo)致表達式取值發(fā)變化,但是當(dāng)變量在隨后如果是有了重定義與去定義的情形的話,上下界則不受這種變化的影響。 函數(shù)

49、結(jié)果不能成為啞尺度數(shù)組。 除了以下兩種情形,啞尺度數(shù)組不能作為全數(shù)組引用: 在過程引用當(dāng)中沒有要求實元的形狀; 引用到固有函數(shù)LBOUND?!纠?-23】 下面是主要說明數(shù)據(jù)項的聲明語句: SUBROUTING PRO(A,B,C) REAL,DIMENSION(A,*):B REAL C(100,20,*) .【例7-24】 下面是主要說明屬性的聲明語句: SUBROUTING PRO(A,B,C) REAL B, C(100,20,*) DIMENSION B(A,*): .7.3.6 數(shù)組的四種聲明形式的兼容性數(shù)組的四種聲明形式可以在程序里扮演的腳色有各種限制,也就是說具有不同的語法作用

50、。下面的表7-2給出這四種形式與不同語法單位的兼容性限制:表7-2數(shù)組的四種聲明形式的兼容性數(shù)組聲明的形式數(shù)組的語法單位顯形數(shù)組待定形數(shù)組啞形數(shù)組啞尺度數(shù)組表達式的主項可可可否下標向量可可可否啞元可可可可實元可可可可等價對象可否否否公用對象可可否否名稱列表對象可否否否保留對象可可否否初始化數(shù)據(jù)對象可否否否I/O列表項可可可否格式可可可否內(nèi)部文件可可可否分配對象否可否否指針賦值語句里的指針對象否可否否指針賦值語句里的目標對象可可可否 7.3.7 DIMENSION屬性和DIMENSION語句數(shù)組的維度除了可以在數(shù)組聲明語句當(dāng)中,通過數(shù)組名稱的說明來給出之外,還可以使用DIMENSION屬性語句來

51、給出,實際上,DIMENSION語句屬于FORTRAN早期標準的遺留物,現(xiàn)在既可作為單獨的屬性語句出現(xiàn),也可以附加在數(shù)據(jù)聲明語句里面。附加DIMENSION屬性的數(shù)據(jù)類型聲明語句的句法形式為: type-specification,DIMENSION(array-specification) ,attribute-list:& entity-list可以跟在DIMENSION屬性語句后面的其他屬性有: initialization ALLOCATABLE INTENT OPTIONAL PARAMETER POINTER PRIVATE PUBLIC SAVE TARGET另外,數(shù)組說明可以使

52、用一個數(shù)組名稱,然后后面附加其他語句來聲明一個數(shù)組,這些語句可以是DIMENSION語句,類型聲明,ALLOCATABLE,POINTER,TARGET,COMMON等語句。如果以說明DIMENSION屬性為主給出數(shù)組定義,那么可以采用如下的句法形式(R526): DIMENSION : array-name(array-specification)& ,array-name(array-specification) 【例7-25】 下面是主要說明數(shù)據(jù)項的聲明語句: REAL,ALLOCATABLE,TARGET:X( :,:) REAL,DIMENSION(30),TARGET,SAVE:M

53、ETER【例7-26】 下面是主要說明屬性的聲明語句: REAL X( :,:),METER DIMENSION METER(30) TARGET X,METERALLOCATABLE XSAVE METER【例7-27】 下面是在其他聲明語句當(dāng)中使用數(shù)組說明的例子: REAL X,METER TARGET X,METER(30)ALLOCATABLE X( :,:)SAVE METER【例7-28】 下面是在COMMON語句當(dāng)中使用數(shù)組說明的例子: COMMON / MOTION / TIME(30),SPACE(1000,1000,1000)7.3.8 ALLOCATABLE屬性和ALLO

54、CATABLE語句一個數(shù)組可分配是指它的界只有在執(zhí)行ALLOCATE語句之后才能確定。這樣一個數(shù)組必定是一個待定形數(shù)組。ALLOCATABLE屬性只是針對數(shù)組而言才成立。一個具有ALLOCATABLE屬性的數(shù)組的類型聲明的句法形式為:type-specification,ALLOCATABLE ,attribute-list:entity-list能與ALLOCATABLE兼容的屬性有:DIMENSION(deferred-shape- specification-list)PRIVATEPUBLICSAVETARGET單獨的ALLOCATABLE屬性語句的句法形式(R527)為: ALLOC

55、ATABLE: array-name (deferred-shape- specification-list)& ,array-name (deferred-shape- specification-list) ALLOCATABLE屬性聲明的一般規(guī)則如下: 具有ALLOCATABLE屬性的數(shù)組就不能是啞元或函數(shù)結(jié)果。 如果給定具有ALLOCATABLE屬性的數(shù)組,再在任何位置給出具有DIMENSION屬性,都必須使用單獨的冒號來表示為待定形數(shù)組?!纠?-29】 下面是主要說明數(shù)據(jù)項的例子: REAL,ALLOCATABLE,SAVE:X(:,:) INTEGER,ALLOCATABLE,DI

56、MENSION(:):Y【例7-30】 下面是主要說明屬性的例子: REAL X(:,:) INTEGER YDIMENSION Y(:)ALLOCATABLE X,YSAVE X7.4 指針屬性一般說來,我們給一個數(shù)據(jù)對象附加一種屬性,總是意味著給該數(shù)據(jù)對象增加某種它本來沒有的性質(zhì),但是指針(POINTER)屬性則不然,當(dāng)我們把POINTER屬性附加給某個數(shù)據(jù)對象,實際上是把該數(shù)據(jù)對象本來具有的存儲空間給拿掉了。由于我們要引用一個數(shù)據(jù)對象,前提必然是已經(jīng)確定了該數(shù)據(jù)對象的存儲空間,才能準確地加以訪問,那么顯然,對于一個具有POINTER屬性的數(shù)據(jù)對象,既然它不具有了初始的存儲空間,也就無法加

57、以引用,除非再給該數(shù)據(jù)對象關(guān)聯(lián)上一個存儲空間。給POINTER對象關(guān)聯(lián)到一個存儲空間,可以通過如下方法: 使用ALLOCATE語句為POINTER對象創(chuàng)造一個新的存儲空間; 使用指針賦值語句使得POINTER對象從另外一個具有存儲空間的數(shù)據(jù)對象那里借用其存儲空間,那個被借用存儲空間的數(shù)據(jù)對象稱為指針的目標。目標數(shù)據(jù)對象在程序運行時是可以發(fā)生變化的,它有兩種來源: 賦予了TARGET屬性的數(shù)據(jù)對象,或者它的某個部分; 指針通過分配而創(chuàng)造出來的新的數(shù)據(jù)對象,或者它的某個部分。指針可以被關(guān)聯(lián)到另外一個指針的目標,或者目標的某個部分。對于一個數(shù)組來說,要使得它成為某個指針的目標,除了具有ALLOCAT

58、ABLE屬性之外,還必須具有TARGET屬性。在一個程序里,最初建立一個指針對象之后,還必須對它進行初始化,也就是定義它的初始狀態(tài)(參見7.5),然后才可以使用固有函數(shù)ASSOCIATED來查詢指針的狀態(tài),否則,該指針既不能被引用,也不能出現(xiàn)在DEALLOCATE語句當(dāng)中。所謂指針的經(jīng)過定義了的狀態(tài)有兩種:關(guān)聯(lián)與去關(guān)聯(lián)。 通過ALLOCATE與指針賦值語句,可以使得指針具有關(guān)聯(lián)狀態(tài); 通過DEALLOCATE或者NULLIFY語句,或者讓指針賦值給另外一個本來處于去關(guān)聯(lián)狀態(tài)的指針,可以使得指針具有去關(guān)聯(lián)狀態(tài)。一個指針無論是處于關(guān)聯(lián)狀態(tài)還是去關(guān)聯(lián)狀態(tài),總之是已經(jīng)被定義的狀態(tài),因此可以使用固有函數(shù)

59、ASSOCIATED來查詢它是否處于關(guān)聯(lián)狀態(tài)。實際上,對于指針我們還可以看成是一個描述符,這個描述符所占據(jù)的空間里存儲了有關(guān)它所指稱的對象的數(shù)據(jù)類型,種別參數(shù),秩,寬度,以及目標的位置等這類信息。因此一個實型標量對象指針必然和一個派生類型的數(shù)組指針具有完全不同的存儲空間單位,那么給出一個指針必然無法預(yù)先給定它的存儲單位,當(dāng)我們要在一個公用塊里聲明指針屬性的時候,就相當(dāng)于給出存儲的描述符,因此每當(dāng)我們聲明一個包含指針的公用塊時,都必定指定相同的存儲單位序列。7.4.1 POINTER屬性和POINTER語句附加了POINTER屬性說明的類型聲明的句法形式為:type-specification,

60、POINTER ,attribute-list:entity-list可以與POINTER兼容的其他屬性包括: initializationDIMENSION(deferred-shape- specification-list) OPTIONAL PRIVATE PUBLIC SAVE單獨的POINTER語句也可以用來聲明一個指針對象,它的句法形式(R528)為: POINTER : object-name (deferred-shape- specification-list)& ,object-name (deferred-shape- specification-list) 指針聲明的

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯(lián)系上傳者。文件的所有權(quán)益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網(wǎng)頁內(nèi)容里面會有圖紙預(yù)覽,若沒有圖紙預(yù)覽就沒有圖紙。
  • 4. 未經(jīng)權(quán)益所有人同意不得將文件中的內(nèi)容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網(wǎng)僅提供信息存儲空間,僅對用戶上傳內(nèi)容的表現(xiàn)方式做保護處理,對用戶上傳分享的文檔內(nèi)容本身不做任何修改或編輯,并不能對任何下載內(nèi)容負責(zé)。
  • 6. 下載文件中如有侵權(quán)或不適當(dāng)內(nèi)容,請與我們聯(lián)系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔(dān)用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論