Ada數(shù)組的類型

2020-09-07 10:22 更新

數(shù)組是一種復(fù)合數(shù)據(jù)類型(composite type),包含多個同一種類型的數(shù)據(jù)元素。數(shù)組元素的名稱用指定的下標(biāo)表示,這些下標(biāo)是離散數(shù)。數(shù)組的值則是一個由這些元素的值構(gòu)成的合成值(composite value)。Ada 下的數(shù)組和其它語言很相似,只是多了一些“寬松”的規(guī)定,如無約束數(shù)組、動態(tài)數(shù)組,更加方便了用戶。字符串類型 String,Wide_String 等則是數(shù)組元素為字符型的數(shù)組類型。

數(shù)組

簡單數(shù)組(Simple Array)

數(shù)組類型的一般聲明格式如下:

type array_name is array (index specification) of type;

array_name 是該數(shù)組類型的名稱;index specification 指明該數(shù)組類型的元素下標(biāo);type 是已經(jīng)定義了的一個數(shù)據(jù)類型,表示每個元素的數(shù)據(jù)類型。

通常情況下,數(shù)組類型的使用方式和下例相同:

type Total is range 1 .. 100; -- 聲明一個整型 Total,取值范圍 1..100。

type Wages is array (Total) of Integer;-- 聲明一個數(shù)組類型Wages,該類型有100個Integer元素。

Unit1 : Wages; -- 聲明一個Wages類型的變量 Unit1,具有100個 Integer 元素,下標(biāo)取值 1 .. 100。

Wages 的聲明也可改為

type Wages is array (1 .. 100) of Integer;

效果是一樣的,只是從維護(hù)性的角度來講還是由 Total 來決定 Wages 的下標(biāo)比較好。

Ada 數(shù)組的 index specification 是離散數(shù),可以是一個范圍,也可以是枚舉類型,而不是單純的一個表示數(shù)組大小的數(shù)值,這點(diǎn)和 C 、Pascal 有所區(qū)別 。數(shù)組元素的下標(biāo)也不需要一定從 0 或從 1 開始,例如:

type First_Name is( Bill, Jack, Tom );
type Enrollment is array ( First_Name ) of Integer;
Var : Enrollment; -- 數(shù)組 Var 有 3 個 Integer 元素,Var (Bill)、Var (Jack)、Var (Tom)。
type NO is array (-5 .. 100) of Integer;

X : NO; -- 數(shù)組 X 有 105 個 Integer 元素,第一個元素是 X (-5),最后一個是 X (100)。

匿名數(shù)組(Anonymous Array)

如果嫌上一節(jié)中的 Unit1 的聲明過程麻煩,也可以直接聲明:

Unit1 : array (1 .. 100) of Integer;

雖然更為精簡了,但不推薦這樣使用數(shù)組。這種數(shù)組沒有明確的類型,被稱為匿名數(shù)組(anonymous array),既不能作為子程序的參數(shù),也無法同其它數(shù)組混用----即使聲明一樣。通常情況下應(yīng)避免出現(xiàn)這種情況

無約束數(shù)組(Unconstrained Array)

像上面的例子,數(shù)組有幾個元素在聲明數(shù)組類型時已經(jīng)決定,而不是在聲明該類型的數(shù)組變量時決定,當(dāng)然這樣的好處是明確的知道每個數(shù)組會占用多少空間,控制起來也方便。但如同我們先前提及的一樣,字符串類型 String,Wide_String 是數(shù)組類型,而用戶輸入的字符串卻是不定的,如果它們的長度也預(yù)先定好了,使用字符串時無疑會造成內(nèi)存空間浪費(fèi)或不夠用,這時一般是使用無約束數(shù)組---其聲明和一般數(shù)組類型相同,只是沒有規(guī)定它的長度---其長度在聲明該類型的數(shù)組變量時決定。

如 String 類型的聲明:

subtype Positive is Integer range 1..Integer'Last;
type String is array (Positive range <>) of Character;
type Wide_String is array (Positive range <>) of Wide_Character;

< > 表示當(dāng)聲明該無約束數(shù)組類型的變量時,需要在( )中指定一個范圍。如創(chuàng)建一個變量 Path_Name, 長度為1024:

Path_Name: String (1 .. 1024);

如果沒有指定該數(shù)組的大小,如:

Path_Name: String;

是不合法的。

當(dāng)然范圍也無須從 1 開始,Path_Name:String (7..1030) 和上例表示的字符串長度一樣,只是下標(biāo)不同而已。如果有一個函數(shù) Get_Path (Path_Name :in out String),將當(dāng)前路徑名賦給參數(shù) Path_Name,只要是 String 類型的參數(shù)就可以通用,長度也無須計(jì)較---函數(shù)出錯或不處理不符合長度要求的字符串則是另一回事。

這里強(qiáng)調(diào)一下字符串類型的賦值問題,假如將 Path_Name 賦予"/root/",可以在一開始就賦值:

Path_Name :String := "/root/";

這樣 Path_Name 的長度就自動成為6。但如果

Path_Name :String(1..10) := "/root/";

則會引起錯誤(看上去很正確),因?yàn)檫€缺4個字符,應(yīng)為

Path_Name :String(1..10) := "/root/ ";

或采用從理論上講麻煩點(diǎn)實(shí)際上根本不會這么做的方案:

Path_Name:String (1..10);
Path_Name(1) := '/';
Path_Name(2) := 'r';
...
Path_Name(6) :='/';

這點(diǎn)是和其它語言有所不同,也是很不方便的一點(diǎn)

動態(tài)數(shù)組 (Dynamic Array)

數(shù)組大小也可以在運(yùn)行時動態(tài)決定,而不是在程序的源代碼中就決定。如:

X : Positive := Y;
Var : array (1 .. X) of Integer;

這樣 Var 的大小就由 X 來決定了,X 多大它也多大。只是這樣做相當(dāng)不妙,假設(shè) Y 值是用戶輸入的,它的大小,甚止于輸入的到底是什么,就根本無法確定,如果過大或負(fù)數(shù)或非Positive 類型都會產(chǎn)生麻煩。一般情況下還是用在子程序中:

procedure Demo (Item :string) is
copy : String(Item'First..Item'Last) := Item;
double: String(1..2*Item'Length) := Item & Item; --Item'First,Item'Last等都是數(shù)組屬性,& 是將兩個字符串相連,參見下文。
begin
...
end Demo;

這樣的話,對于動態(tài)數(shù)組的操作與用戶沒有多大關(guān)系,保證了安全性

多維數(shù)組(Multidimensional Array)

前面提及的數(shù)組用法對多維數(shù)組也適用,只是多維數(shù)組的聲明和元素的表示略有不同。如定義一個矩陣:

type Marix is array (1 .. 100,1..100) of Integer;

Var :Marix;---Var有 100x100個元素,分別為 Var(1,1),Var(1,2)....Var(100,99),Var(100,100)。

上例的Matrix是二維數(shù)組,多維數(shù)組的 index_specification 由多個范圍組成,每個范圍由,隔開。



以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號