-- $Id: matrix.gnat,v 1.0 2003/06/11 12:09:00 dada Exp $ -- http://dada.perl.it/shootout/ -- Ada 95 code by C.C. with Text_IO, Ada.Strings.Fixed, Ada.Command_Line; procedure Matrix is function L_Trim (Source : String; Side : Ada.Strings.Trim_End := Ada.Strings.Left) return String renames Ada.Strings.Fixed.Trim; type Int is new Integer; type Int_Matrix is array (Positive range <>, Positive range <>) of Int; function Mk_Matrix (NRows, NCols : Natural) return Int_Matrix is Count : Int := 1; M : Int_Matrix (1 .. NRows, 1 .. NCols); begin for I in M'Range (1) loop for J in M'Range (2) loop M (I, J) := Count; Count := Count + 1; end loop; end loop; return M; end Mk_Matrix; procedure M_Mult (M1, M2 : Int_Matrix; MM : in out Int_Matrix) is pragma Inline (M_Mult); pragma Suppress (Index_Check); Sum : Int; begin if not (M1'First (2) = M2'First (1) and M1'Last (2) = M2'Last (1) and M1'First (1) = MM'First (1) and M1'Last (1) = MM'Last (1) and M2'First (2) = MM'First (2) and M2'Last (2) = MM'Last (2)) then raise Constraint_Error; end if; for I in M1'Range (1) loop for J in M2'Range (2) loop Sum := 0; for KK in M1'Range (2) loop Sum := Sum + M1 (I, KK) * M2 (KK, J); end loop; MM (I, J) := Sum; end loop; end loop; end M_Mult; Size : constant Natural := 30; M1, M2, MM : Int_Matrix (1 .. Size, 1 .. Size); N : Positive := 1; begin begin N := Positive'Value (Ada.Command_Line.Argument (1)); exception when Constraint_Error => null; end; M1 := Mk_Matrix (Size, Size); M2 := Mk_Matrix (Size, Size); for Iter in 1 .. N loop M_Mult (M1, M2, MM); end loop; Text_IO.Put_Line (L_Trim (Int'Image (MM (1, 1))) & Int'Image (MM (3, 4)) & Int'Image (MM (4, 3)) & Int'Image (MM (5, 5))); end Matrix;