with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; -- This example uses slices and unconstrained arrays procedure slicedemo2 is Type MyArray is array (Positive Range <>) of Integer; procedure putArray(theArray: MyArray) is begin for i in theArray'first .. theArray'last loop -- for i in theArray'range loop put(theArray(i), width=>4); end loop; new_line; end putArray; -- Create 2 arrays of different size a: MyArray := (11, 12, 13, 14, 15, 16, 17, 18, 19, 20); b: MyArray := (81, 82, 83, 84, 85, 86, 87, 88 ); c: MyArray(a'first .. a'last + 1); -- Type String is defined package Standard as -- Type String is array (Positive Range <>) of Character; -- Equivalent to s: String(1 .. 10) := "abcdefghij"; s: String := "abcdefghij"; m, n: Integer; begin putArray(c); c := a; c(1) := 999; putArray(a); putArray(c); -- String slice: We've seen this put_line( s(2 .. 5) ); putArray(a); putArray(b); putArray(b(2 .. 5)); m := 3; n := 5; putArray(a(m .. n)); putArray(a(n .. m)); -- Assign a slice with an aggregate value a(2 .. 4) := (-1, -2, -3); -- Warning of runtime error if aggregate is wrong size -- Now let's see what is in a putArray(a); -- Assign one slice to another a(1 .. 3) := a(8 .. 10); putArray(a); -- When slices overlap, the values shift a(1 .. 9) := a(2 .. 10); putArray(a); -- Types on both sides of assignment must be identical -- a(1 .. 3) := b; -- Will compile but warns of runtime error a(1 .. 8) := b; -- Okay a(1 .. 3) := b(2 .. 4); -- Okay putArray(a); end slicedemo2;