pragma ada_2012;
with ada.integer_text_io; use ada.integer_text_io; 
with ada.text_io; use ada.text_io; 
 
procedure two_dim_array  is 
    type My_Array_t is array(Natural range <>, Natural range <>) of Natural;

    type My_Array1_t is array(Natural range <>) of Natural;
    type My_Array2_t is array(Natural range <>) of My_Array1_t(1 .. 5);

    a0: My_Array_t(1 .. 3, 1 .. 4) := ( 1..3 => (1 .. 4 => 0) );

    a1: My_Array_t(1 .. 3, 1 .. 4) := ( others => (others => 0) );
    a2: My_Array_t := ((11, 12, 13), (21, 22, 23));

    b1: My_Array2_t(1 .. 3);
begin
    for i in a1'range(1) loop
        for j in a1'range(2) loop
            a1(i, j) := i*j;
        end loop;
    end loop;

    for a of a2 loop
        put(a);
    end loop;

    for i in b1'range loop
        for j in b1(i)'range loop
            b1(i)(j) := i*j;
        end loop;
    end loop;


end two_dim_array;