程式單元

程式單元是指在程式中執行某一特定任務的具有一定獨立性的代碼模組,類似於VB中的“過程”。常見於Delphi語言中, 一個Delphi程式由多個稱為單元的原始碼模組組成。使用單元可以把一個大型程式分成多個邏輯相關的模組,並用來創建在不同程式中使用的程式庫。

Delphi的程式單元

Object Passal的程式結構很特殊,與其它語言如C++,Object Windows等結構都不同。一個Delphi程式由多個稱為單元的原始碼模組組成。使用單元可以把一個大型程式分成多個邏輯相關的模組,並用來創建在不同程式中使用的程式庫。

Program單元

Program單元就是Delphi中的項目檔案。

Program單元是一個特殊的單元,類似於C語言中的Main程式,即為應用程式的主程式。一個程式可以有多個單元組成,也可以只有一個Program單元組成,例如前面我們介紹過的DOS視窗程式就只有一個Program單元組成。下面是一個典型的Program單元:program Project1;

uses Forms,

Unit1 in 'Unit1.pas' {Form1};

{$R *.RES}

begin

Application.Initialize;

Application.CreateForm(TForm1, Form1);

Application.Run;

end

(1)程式首部指定程式名、以及參數等。

(2)Uses語句定義程式用到的所有單元。

標識符為單元的名字,各單元之間用逗好(,)隔開,最後結束用分號(;)。

注意:每個程式總是自動包含System單元,Program單元的Uses部分不能顯式指定。System單元用於實現一些低級的運行時間程式的支持,如檔案輸入輸出(I/O)、字元串操作、浮點運算、動態記憶體分配等。另外,Delphi在發行時提供了許多預先定義的單元,在構造程式時可以直接使用。例如,如果你將一個核對框放進一個窗體,你就自動地使用了StdCtrls單元,因為TCheckBox構件在StdCtrls中定義。

Uses部分列出單元的順序決定它們初始化的順序,並影響編譯器定位標識符的順序。如果兩個單元定義了一個相同名字的類型,編譯器將總是使用前面那個單元的類型。

(3)程式塊由保留字Begin和End括起來的一段代碼組成,用於對程式的初始化。

UNIT單元

UNIT單元相當於C語言的子程式。基本上Delphi每個窗體都一個對應的單元。當你為應用程式創建窗體時,你就創建了一個與該窗體相聯繫的新單元。然而,單元也可以獨立於窗體而存在。例如,一個單元可以只包含數學運算程式,而不需要有窗體。

一個單元可以由多個程式共享。單元的磁碟檔案名稱後綴為.pas。

單元結構

不管單元是否與窗體相關,單元的基本結構都是一樣的 。UNIT單元由單元首部、接口部分(interface part)、實現部分(implementation part)、可選擇的初始化部分(initialization part)、結束部分(finalization part)、end.組成。

單元首部

單元的首部用保留字Unit開始,後跟單元名。單元名必須遵循標識符的所有一般原則(不能以數字開頭等)。下面的單元名將是有效的:

Unit Rsgl;

接口部分(Interface)

在單元名之後是接口部分。接口部分用於聲明變數、類型、過程和函式等。在接口部分聲明的變數、類型以及過程、函式等是其它使用該單元的程式或單元等都可見的。接口部分用保留字Interface標明開始,用implemention標明結束。接口部分只能含有聲明部分。

一個單元的接口部分還作為該單元說明檔案的起點。雖然接口部分沒有告訴你子程式做什麼或變數如何使用,但它正確告訴了你的變數、類型、過程、函式等的名字及其調用方法。

接口部分本身又可以由幾個可選的部分組成,分別是單元的USES語句、常量聲明部分、類型聲明部分、變數聲明部分、過程和函式聲明部分。其中常量聲明、類型聲明、變數聲明、過程和函式聲明部分用於聲明其它使用該單元的單元可以訪問的變數、類型、過程和函式等。

而USES語句列出該單元要用到的標準單元和其它單元,用於把外部的已定義的常量、類型、變數、過程或函式引入到本單元中使用。USES語句緊跟在Interface之後。

實現部分

單元的第二部分,稱為實現部分(Implementation),主要用於定義接口部分聲明過的過程、函式等的代碼。實現部分用保留字implementation標明,總是緊隨接口部分之後。

實現部分也可以用USES語句列出該單元要用到的標準單元和其它單元等。如上面的uses MDIEdit;語句。實際上,實現部分也可以聲明變數、數據類型、過程及函式等。

但是,在實現部分定義的變數、類型、過程、函式等只能由本單元自己使用(private declarations),使用該單元的其它單元或程式不可見的。私有定義可以隱藏單元的細節。

USES子句

USES子句用於訪問其它單元。例如,如果你要讓程式來效仿一個電傳打字機,可以在USES包含WinCRT,因為WinCrt含有進行這個仿效所需要的程式。

USES WinCRT;

Delphi提供了許多預先定義的單元,你可以在程式中直接使用。實際上,當你將一個新構件放入設計的窗體時,DElphi會自動將該構件的單元放入USES子句中。例如,如果你將Color Grid放入窗體,則單元ColorGrd就附加在窗體單元的USES子句末尾,從而ColorGRd單元中接口部分所有定義都是窗體單元可以訪問的。

要使用USES子句包含單元中的程式,只要在單元名後加上程式名即可。例如,如果要在Unit2中訪問Unit1中的ComputePayMent函式。

USES子句可以放在接口部分(保留字Interface之後),也可放在實現部分(保留字Implementation之後),但是USES子句必須出現在它所有子程式、數據類型或變數被使用之前 。

USES子句放在實現部分可以隱藏單元的內部細節,同時可以避免循環引用發生。

初始化部分(Initialization)

初始化部分是單元的可選部分,主要用於對單元數據的初始化,一般很少用到。

該部分總是在其它程式代碼之前運行。如果一個程式包含多個單元,則在程式的其它部分運行之前,每個單元的初始化代碼都會先調用,其順序是單元顯示在Uses語句的順序。

完成部分(Finalization)

完成部分(Finalization)是初始化過程的反過程,只要單元有初始化部分,才會有完成部分。完成部分對應在Delphi1.0中ExitProc和AddEXitProc函式。

完成部分在程式關閉時運行。任何在單元初始化時獲得的資源如分配記憶體、打開檔案等通常都在完成部分釋放。單元完成部分的執行順序與初始化部分相反。例如假如程式以A、B、C的順序初始化單元,則完成過程的順序是C、B、A。

一旦單元的初始化部分開始執行,就必須保證程式關閉時對應的完成部分執行。完成部分必須能夠處理不完全初始的數據,因為如果產生異常,初始化代碼可能不能完全執行。

程式單元結構

FORTRAN程式應由一個主程式單元和若干個過程程式單元組成。編程前應先作結構化分析,把問題分解為若干個子功能,每個子功能編成一個獨立的程式單元,稱為過程程式單元。再編一個主程式單元,控制整個解題過程。在主程式單元中用簡練的形式調用每個過程,每次調用就是執行該過程單元,完成該子功能,從而最終完成解題任務。本章介紹F90中的程式單元、過程、範圍、模組等概念。

模組

其中模組是F90新增加的一種程式單元。通過使用模組,可以方便地共享數據和過程。各種程式單元中,除主程式外,各程式單元可以被其他程式單元甚至自身調用。一個程式單元不需要包含可執行語句。包含內部子程式或函式的程式單元稱為宿主程式。

主程式是程式開始執行的標誌,其第一條語句不能是SUBROUTINE,FUNCTION,MODULE和BLOCK DATA。主程式可以用PROGRAM語句作為第一條語句,但不是必需的

過程

子程式或函式

塊數據單元

在命名的公共塊中提供變數初始值的程式單元

模組

包含數據對象定義、類型定義、函式或子程式接口和其它程式可訪問的函式或子程式

程式單元之間的關係有:

聯合:這種機制允許不同的程式單元共享變數,從而不用重新定義變數就可以以不同的名字處理同一數據。

範圍:它描述的是一個名稱(或者是全局的或者是局部的)作用的範圍。

主程式

程式的執行始終是開始於主程式的第一條可執行語句,所以每個完整的Fortran程式必須有且僅有一個主程式。其形式為:

[PROGRAM [程式名]]

[說明部分]

[可執行部分]

[CONTAINS

內部過程]

END [PROGRAM[程式名]]

可以看到,主程式單元中允許包含內部過程。主程式名和外部過程名和公共塊名都被認為是全局名稱。全局名稱在一個程式中必須是唯一的。

例:PROGRAM MAIN

REAL X(10),A(10,10),B(10) !說明部分

CALL GAUSS(A,B,X) !執行部分,調用內部過程GAUSS

CONTAINS

SUBROUTINE GAUSS(R,S,T) !內部過程的開始

END SUBROUTINE GAUSS !內部過程的結束

EHD PROGRAM MAIN

下圖顯示的是一個F90程式的標準結構。每個框都可以是一個獨立的源檔案:

Program A1

Use module A

Call B

Contains

內部子程式

或內部函式

外部過程

如果過程是一個獨立於主程式單元的程式單元,它就是外部過程。外部過程也可以通過非Fortran語言(通常是彙編語言)來定義。外部過程的形式有兩種:

外部函式 :FUNCTION語句

[說明部分]

[可執行部分]

[CONTAINS 內部過程]

END [FUNTION函式名]

外部子程式:SUBROUTINE語句

[說明部分]

[可執行部分]

[CONTAINS 內部過程]

END [SUBROUTINE子程式名]

內部過程

內部過程是包含於外部過程、模組或主程式單元之中的程式單元。在宿主程式單元中,以CONTAINS語句把內部過程與其他部分分開。內部過程也具有兩種形式:

內部函式 :FUNCTION語句

[說明部分]

[可執行部分]

END [FUNTION函式名]

內部子程式:SUBROUTINE語句

[說明部分]

[可執行部分]

END [SUBROUTINE子程式名]

注意內部過程中不能再包含內部過程,即F90不是過程嵌套式語言。

內在過程

內在過程是Fortran含於編譯器程式庫中的過程,它不需任何其它聲明或說明即可使用。F90中定義了113個內在過程,它們為科學計算提供了極大方便,內在過程除了第一章中介紹的部分內在函式和第五章中介紹的部分數組函式外,還有其他一些內在函式及內在子程式,其具體使用方法請查看Visual Fortran的在線上幫助。內在過程共分為四類:

1)查詢函式:它們的返回值是根據變元的性質而非變元的取值。

2) 基本過程:由標量變元指明的基本過程,但可以用標量或數組實元進行調用。有許多函式是這種基本函式,並有一種基本內在子程式(MVBITS)。如果變元是標量,則結果也是標量。如果變元是數組,則對數組的每個元素施加過程,其結果是與變元形狀相同的數組。例如,a是數組的話,則b=sin(a)也是數組。

3)變換函式:其變元是數組,但過程不施加於每個元素,而是把變元變換成另一數組。

4)非基本過程:只能以標量實元進行調用,除了MVBITS以外的所有內在子程式都是非基本過程。

如果要用內在過程名作為其它過程的實元,需要用INTRINSIC語句加以聲明。

塊數據

塊數據單元是一種為有名公用塊中的變數定義初始值的一種程式單元,它只包含數據聲明和初始值,不包含可執行語句。其一般形式為:

BLOCK DATA[塊數據名]

[說明部分]

END [BLOCK DATA[塊數據名]]

變數一般由DATA語句來初始化。公共塊中命名的變數只能在塊數據單元或某個過程中初始化一次,或只能由所有的過程完全一致地初始化。更好的編程法是用模組而不是塊數據單元來聲明和初始化變數。

在塊數據單元的說明部分,不能包含ALLOCATABLE,AUTOMATIC,EXTERNAL,INTENT,OPTIONAL,PRIVATE或PUBLIC等屬性說明符。

例:BLOCK DATA BLKDAT

INTEGER S,X

LOGICAL T,W

DOUBLE PRECISION U

DIMENSION R(3)

COMMON/AREA1/R,S,U,T/AREA2/W,X,Y

DATA R/1.0,2*2.0/,T/.FALSE./,U/0.214537D-7/,W/.TRUE./,Y/3.5/

END BLOCK DATA BLKDAT

相關詞條

相關搜尋

熱門詞條

聯絡我們