複製鏈接
請複製以下鏈接發送給好友

程序單元

鎖定
程序單元是指在程序中執行某一特定任務的具有一定獨立性的代碼模塊,類似於VB中的“過程”。
中文名
程序單元
外文名
Program module

程序單元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)是初始化過程的反過程,只要單元有初始化部分,才會有完成部分。完成部分對應在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