multi-dimensional_array_definition ::=
ARRAY (discrete_range {,discrete_range}) OF type
TYPE Square_Matrix IS ARRAY(1..10,1..10) OF Integer; TYPE Rectangular_Matrix IS ARRAY(1..2,1..4) OF Integer; TYPE Three_Dimensional_Array IS ARRAY (1..5,1..5,1..5) OF Float;
Square: Square_Matrix; Rectangle: Rectangular_Matrix; Three: Three_Dimensional_Array;
Matrix(1,1) := 1; Rectangle(2,4) := 5; Three(1,2,5) := 3.8;
Rectangle := ((1,2,3,4),(2,4,6,8));
Rectangle := ( 1 => (1 => 1, 2 => 2, 3 => 3, 4 => 4), 2 => (1 => 2, 2 => 4, 3 => 6, 4 => 8));
Types Must Match
A Subscript Must Be Provided For Each Dimension
Slices Are Not Permitted On Multi-Dimensional Arrays
Pre-defined = /= Not Pre-defined > >= < <=
May Be User Defined
SUBTYPE Row_Range IS Integer RANGE 1..2; SUBTYPE Column_Range IS Integer RANGE 1..3; TYPE Original_Type IS ARRAY(Row_Range, Column_Range) OF Integer; TYPE Flipped_Type IS ARRAY(Column_Range, Row_Range) OF Integer;
FUNCTION Transpose(Original: Original_Type)
RETURN Flipped_Type IS
Flipped: Flipped_Type;
BEGIN
FOR Row IN Row_Range LOOP
FOR Column IN Column_Range LOOP
Flipped(Column,Row) :=
Original(Row,Column);
END LOOP;
END LOOP;
RETURN Flipped;
END Transpose;
1. A Generalized Function For Matrices Of Any Size Can Be Written Using Unconstrained Array Types
TYPE Day_Type IS (Monday, Tuesday, Wednesday, Thursday, Friday); SUBTYPE Room_Type IS Integer RANGE 1..10; TYPE Bldg_Type IS (Computer_Science, Engineering); TYPE Room_Status_Type IS (Available, Reserved); TYPE Room_Availability_Matrix IS ARRAY(Day_Type, Bldg_Type, Room_Type) OF Room_Status_Type;
Room_Matrix: Room_Availability_Matrix :=
(Monday..Friday =>
(Computer_Science..Engineering =>
(Room_Type'First..Room_Type'Last =>
Available)));
Full: CONSTANT Room_Availability_Matrix :=
(Monday..Friday =>
(Computer_Science..Engineering =>
(Room_Type'First..Room_Type'Last =>
Reserved)));
unconstrained_array_definition ::=
ARRAY (type RANGE <> {,type RANGE <>}) OF type
TYPE Integer_Vector IS ARRAY (Integer RANGE <>) OF Integer; TYPE Character_Frequency IS ARRAY (Character RANGE <>) OF Integer;
Vector: Integer_Vector(1..10);
Frequency: Character_Frequency('a'..'z');
1. The Box Symbol <> Means "To Be Specified"
2. Constrained Indexes And Unconstrained Indexes Can Not Be Mixed In The Same Array Type Declaration
3. An Object Of An Unconstrained Type Must Be Constrained In The Object Declaration
4. A Formal Parameter Of An Unconstrained Array Type May Be Left Unconstrained
Type'First(I)
First Subscript Of Ith Dimension
Type'Last(I)
Last Subscript Of Ith Dimension
Type'Length(I)
Number Of Elements In Ith Dimension
Type'Range(I) <> Type'First(I)..Type'Last(I)
1. Array Attributes May Be Applied To Either Array Types Or Array Objects
2. Subscript Can Be Omitted For First Dimension
Vector'First -- 1 Vector'Range -- 1..10 Frequency'Last -- 'z' Frequency'Length -- 26 Rectangle'Last(1) -- 2 Rectangle'Last(2) -- 4
To Assign Arrays They Must Be Of Same Type And Same Length, But The Bounds May Be Different
Assigning Arrays Of Different Lengths Produces A Constraint Error At Run Time
TYPE Array_Type IS ARRAY (Integer RANGE <>) OF Integer;
Array_1: Array_Type(0..9); Array_2: Array_Type(1..10);
Array_1 := Array_2; -- Valid Assignment
To Compare Arrays They Must Be Of Same Type And Same Length, But The Bounds May Be Different
Comparing Arrays Of Different Lengths Produces A Value Of False
"String" = "String "
-- False Because Lengths Are Different
1. Unconstrained Array Types Decouple The Length From The Type
2. Unconstrained Array Types Make It Possible To Write Generalized Subprograms
1. Subprograms Can Have Array Parameters Of An Unconstrained Array Type, Left Unconstrained
2. Functions Can Return Arrays Of An Unconstrained Type
1. Because The Compiler Must Allocation Space For Array Variables, They Must Be Constrained In Their Declaration If Their Type Is Unconstrained
2. The Size Of An Unconstrained Formal Parameter Is Determined At Run-Time, It Depends On The Size Of The Actual Parameter
1. The Attributes Of An Array Parameter Are Passed With The Array Automatically, So It Is Not Necessary To Pass Them As Parameters
WITH Ada.Text_IO, Ada.Integer_Text_IO;
PROCEDURE Compute_Maximum IS
TYPE Vectors IS ARRAY(Integer RANGE <>)
OF Integer;
Five_Values: Vectors(1..5);
Maximum: Integer;
FUNCTION Find_Maximum(Vector:
Vectors) RETURN Integer IS
Local_Maximum: Integer := Integer'First;
BEGIN
FOR Index IN Vector'Range LOOP
IF Vector(Index) > Local_Maximum THEN
Local_Maximum := Vector(Index);
END IF;
END LOOP;
RETURN Local_Maximum;
END Find_Maximum;
BEGIN
Five_Values := (20,0,89,18,43);
Maximum := Find_Maximum(Five_Values);
Ada.Text_IO.Put("Maximum Is ");
Ada.Integer_IO.Put(Maximum);
Ada.Text_IO.New_Line;
END Compute_Maximum;
FUNCTION Reverse_String(Original: String)
RETURN String IS
Reversed: String(Original'Range);
Reverse_Index: Positive;
BEGIN
FOR Original_Index IN Original'Range LOOP
Reverse_Index := Original'Last -
Original_Index + Original'First;
Reversed(Reverse_Index) :=
Original(Original_Index);
END LOOP;
RETURN Reversed;
END Reverse_String;
1. String Is A Predefined Unconstrained Array Type
TYPE String IS ARRAY(Positive RANGE <>) OF Character;
2. The Range Attribute Is Used To Declare A Local Variable Of The Same Size As The Formal Parameter
3. The Length Of The Returned String Is Determined By Of The Variable In The Return Statement
/ Top of Page /