數組是一種復合數據類型(composite type),包含多個同一種類型的數據元素。數組元素的名稱用指定的下標表示,這些下標是離散數。數組的值則是一個由這些元素的值構成的合成值(composite value)。Ada 下的數組和其它語言很相似,只是多了一些“寬松”的規(guī)定,如無約束數組、動態(tài)數組,更加方便了用戶。字符串類型 String,Wide_String 等則是數組元素為字符型的數組類型。
數組類型的一般聲明格式如下:
type array_name is array (index specification) of type;
array_name 是該數組類型的名稱;index specification 指明該數組類型的元素下標;type 是已經定義了的一個數據類型,表示每個元素的數據類型。
通常情況下,數組類型的使用方式和下例相同:
type Total is range 1 .. 100; -- 聲明一個整型 Total,取值范圍 1..100。
type Wages is array (Total) of Integer;-- 聲明一個數組類型Wages,該類型有100個Integer元素。
Unit1 : Wages; -- 聲明一個Wages類型的變量 Unit1,具有100個 Integer 元素,下標取值 1 .. 100。
Wages 的聲明也可改為
type Wages is array (1 .. 100) of Integer;
效果是一樣的,只是從維護性的角度來講還是由 Total 來決定 Wages 的下標比較好。
Ada 數組的 index specification 是離散數,可以是一個范圍,也可以是枚舉類型,而不是單純的一個表示數組大小的數值,這點和 C 、Pascal 有所區(qū)別 。數組元素的下標也不需要一定從 0 或從 1 開始,例如:
type First_Name is( Bill, Jack, Tom );
type Enrollment is array ( First_Name ) of Integer;
Var : Enrollment; -- 數組 Var 有 3 個 Integer 元素,Var (Bill)、Var (Jack)、Var (Tom)。
type NO is array (-5 .. 100) of Integer;
X : NO; -- 數組 X 有 105 個 Integer 元素,第一個元素是 X (-5),最后一個是 X (100)。
如果嫌上一節(jié)中的 Unit1 的聲明過程麻煩,也可以直接聲明:
Unit1 : array (1 .. 100) of Integer;
雖然更為精簡了,但不推薦這樣使用數組。這種數組沒有明確的類型,被稱為匿名數組(anonymous array),既不能作為子程序的參數,也無法同其它數組混用----即使聲明一樣。通常情況下應避免出現這種情況
像上面的例子,數組有幾個元素在聲明數組類型時已經決定,而不是在聲明該類型的數組變量時決定,當然這樣的好處是明確的知道每個數組會占用多少空間,控制起來也方便。但如同我們先前提及的一樣,字符串類型 String,Wide_String 是數組類型,而用戶輸入的字符串卻是不定的,如果它們的長度也預先定好了,使用字符串時無疑會造成內存空間浪費或不夠用,這時一般是使用無約束數組---其聲明和一般數組類型相同,只是沒有規(guī)定它的長度---其長度在聲明該類型的數組變量時決定。
如 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;
< > 表示當聲明該無約束數組類型的變量時,需要在( )中指定一個范圍。如創(chuàng)建一個變量 Path_Name, 長度為1024:
Path_Name: String (1 .. 1024);
如果沒有指定該數組的大小,如:
Path_Name: String;
是不合法的。
當然范圍也無須從 1 開始,Path_Name:String (7..1030) 和上例表示的字符串長度一樣,只是下標不同而已。如果有一個函數 Get_Path (Path_Name :in out String),將當前路徑名賦給參數 Path_Name,只要是 String 類型的參數就可以通用,長度也無須計較---函數出錯或不處理不符合長度要求的字符串則是另一回事。
這里強調一下字符串類型的賦值問題,假如將 Path_Name 賦予"/root/",可以在一開始就賦值:
Path_Name :String := "/root/";
這樣 Path_Name 的長度就自動成為6。但如果
Path_Name :String(1..10) := "/root/";
則會引起錯誤(看上去很正確),因為還缺4個字符,應為
Path_Name :String(1..10) := "/root/ ";
或采用從理論上講麻煩點實際上根本不會這么做的方案:
Path_Name:String (1..10);
Path_Name(1) := '/';
Path_Name(2) := 'r';
...
Path_Name(6) :='/';
這點是和其它語言有所不同,也是很不方便的一點
數組大小也可以在運行時動態(tài)決定,而不是在程序的源代碼中就決定。如:
X : Positive := Y;
Var : array (1 .. X) of Integer;
這樣 Var 的大小就由 X 來決定了,X 多大它也多大。只是這樣做相當不妙,假設 Y 值是用戶輸入的,它的大小,甚止于輸入的到底是什么,就根本無法確定,如果過大或負數或非Positive 類型都會產生麻煩。一般情況下還是用在子程序中:
procedure Demo (Item :string) is
copy : String(Item'First..Item'Last) := Item;
double: String(1..2*Item'Length) := Item & Item; --Item'First,Item'Last等都是數組屬性,& 是將兩個字符串相連,參見下文。
begin
...
end Demo;
這樣的話,對于動態(tài)數組的操作與用戶沒有多大關系,保證了安全性
前面提及的數組用法對多維數組也適用,只是多維數組的聲明和元素的表示略有不同。如定義一個矩陣:
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是二維數組,多維數組的 index_specification 由多個范圍組成,每個范圍由,隔開。
更多建議: