$ TADA/LIST=REMATARF REMATARF TeleSoft-Ada compiler -- Version 1.3d March 25, 1983 Copyright (c) 1981,1982,1983 TeleSoft. All rights reserved. Opening rematarf.text Symbol table space: 127.5K bytes Compilation complete Syntax errors: 0 Semantic errors: 0 Lines compiled: 83 reset(rematarf.CODE) rewrite(rematarf.CODE) Segment 1, 4 procedures .... end. $ TYPE REMATARF Opening rematarf.text 1: with TEXT_IO ; use TEXT_IO , INTEGER_IO , FLOAT_IO ; 2: package REMATARF is 3: -- Establish the type ( data structure) REAL_MATRIX 4: type REAL_MATRIX is 5: array ( INTEGER range <> , INTEGER range <> ) of FLOAT ; 6: -- The first subscript is the row , the second subscript is the column 7: 8: -- Declare the matrix multiply function, parameters and return 9: function "*"(A,B:REAL_MATRIX) return REAL_MATRIX ; 10: -- Declare the matrix add function, parameters and return 11: function "+"(A,B:REAL_MATRIX) return REAL_MATRIX ; 12: 13: -- Declare the REAL_MATRIX_PRINT procedure 14: procedure REAL_MATRIX_PRINT(A : REAL_MATRIX) ; 15: 16: -- Declare that MATRIX_ERROR is an exception 17: MATRIX_ERROR : exception ; 18: 19: end REMATARF ; 20: 21: package body REMATARF is 22: 23: function "*"(A,B:REAL_MATRIX) return REAL_MATRIX is 24: -- Create an object C for temporary use 25: -- The size is based on the parameter A when called 26: C : REAL_MATRIX ( A'FIRST(1)..A'LAST(1) ,B'FIRST(2)..B'LAST(2) ) ; 27: begin 28: -- CHECK FOR LEGAL MATRICIES TO MULTIPLY 29: if A'LENGTH(2) /= B'LENGTH(1) then raise MATRIX_ERROR ; end if ; 30: -- NOW, COMPUTE THE PRODUCT 31: for I in A'RANGE(1) loop 32: for J in B'RANGE(2) loop 33: C(I,J) := 0.0 ; 34: for K in A'RANGE(2) loop 35: C(I,J) := C(I,J) + A(I,K) * B(K-A'FIRST(2)+B'FIRST(1),J) ; 36: -- <-offset subscript -> 37: end loop ; 38: end loop ; 39: end loop ; 40: return C; 41: end ; 42: 43: function "+"(A,B:REAL_MATRIX) return REAL_MATRIX is 44: C:REAL_MATRIX ( A'FIRST(1)..A'LAST(1) , A'FIRST(2)..A'LAST(2) ) ; 45: begin 46: -- CHECK THAT MATRICIES ARE COMPATIBLE FOR ADDING 47: if A'LENGTH(1) /= B'LENGTH(1) or A'LENGTH(2) /= B'LENGTH(2) then 48: raise MATRIX_ERROR ; 49: end if ; 50: 51: if A'FIRST(1) = B'FIRST(1) and A'FIRST(2) = B'FIRST(2) then 52: 53: -- SIMPLE INDEXING 54: for I in A'RANGE(1) loop 55: for J in A'RANGE(2) loop 56: C(I,J) := A(I,J) + B(I,J) ; 57: end loop ; 58: end loop ; 59: else 60: 61: -- MATRICIES HAVE DIFFERENT INDICIES 62: for I in A'RANGE(1) loop 63: for J in A'RANGE(2) loop 64: C(I,J) := A(I,J) + B(I-A'FIRST(1)+B'FIRST(1), 65: J-A'FIRST(2)+B'FIRST(2)) ; 66: end loop ; 67: end loop ; 68: end if ; 69: return C; 70: end ; 71: 73: procedure REAL_MATRIX_PRINT( A : REAL_MATRIX ) is 74: begin 75: for I in A'RANGE(1) loop 76: for J in A'RANGE(2) loop 77: PUT("MAT(") ; PUT(I) ; PUT(",") ; PUT(J) ; PUT(" ) = ") ; 78: PUT(A(I,J)) ; NEW_LINE ; 79: end loop ; 80: end loop ; 81: end REAL_MATRIX_PRINT ; 82: 83: end REMATARF ; Syntax errors: 0 Semantic errors: 0 Lines compiled: 83 $ TADA/LIST=MATARF MATARF TeleSoft-Ada compiler -- Version 1.3d March 25, 1983 Copyright (c) 1981,1982,1983 TeleSoft. All rights reserved. Opening matarf.text Symbol table space: 127.5K bytes Compilation complete Syntax errors: 0 Semantic errors: 0 Lines compiled: 39 reset(matarf.CODE) rewrite(matarf.CODE) Segment 1, 1 procedures . end. $ TYPE MATARF Opening matarf.text 1: -- POSSIBLE FULL SOLUTION TO HOMEWORK 5 2: 3: with TEXT_IO ; use TEXT_IO ; 4: with REMATARF ; use REMATARF ; 5: procedure MAIN is 6: -- Establish the object MAT_1 with initial data 7: MAT_1 : REAL_MATRIX(-1..2,-1..2) := 8: ( ( 1.1 , 1.2 , 1.3 , 1.4 ) , -- Note that the structure 9: ( 2.1 , 2.2 , 2.3 , 2.4 ) , -- of the object must be 10: ( 3.1 , 3.2 , 3.3 , 3.4 ) , -- used to initialize data. 11: ( 4.1 , 4.2 , 4.3 , 4.4 ) ) ; -- ( (), (), (), () ) 12: -- Declare two additional objects 13: MAT_2 : REAL_MATRIX(1..4,0..3) ; 14: MAT_3 : REAL_MATRIX(-1..2,0..3) ; 15: -- Declare an uncompatible matrix for multiply 16: MAT_BAD : REAL_MATRIX(1..3,0..5) ; 17: begin 18: -- Store MAT_1 into MAT_2 19: MAT_2 := MAT_1 ; 20: -- Change the value 1.1 to -1.1 21: MAT_2(1,0) := -1.1 ; 22: -- Print MAT_2 23: PUT_LINE(" DUMP OF MAT_2 ") ; 24: REAL_MATRIX_PRINT(MAT_2) ; 25: -- Compute MAT_3 as the product of MAT_1 times MAT_2 26: MAT_3 := MAT_1 * MAT_2 ; 27: PUT_LINE(" DUMP OF MAT_3 := MAT_1 * MAT_2 ") ; 28: REAL_MATRIX_PRINT(MAT_3) ; 29: -- Compute MAT_3 as the product and sum of MAT_1 times MAT_2 30: -- plus MAT_2 31: MAT_3 := MAT_1 * MAT_2 + MAT_2 ; 32: PUT_LINE(" DUMP OF MAT_3 := MAT_1 * MAT_2 + MAT_2") ; 33: REAL_MATRIX_PRINT(MAT_3) ; 34: -- Cause an exception 35: MAT_3 := MAT_3 + MAT_BAD ; 36: exception 37: when MATRIX_ERROR => 38: PUT_LINE("matricies not compatable for requested operation") ; 39: end MAIN ; Syntax errors: 0 Semantic errors: 0 Lines compiled: 39 $ TRUN MATARF DUMP OF MAT_2 MAT( 1, 0 ) = -1.1000000E+00 MAT( 1, 1 ) = 1.2000000E+00 MAT( 1, 2 ) = 1.3000000E+00 MAT( 1, 3 ) = 1.3999999E+00 MAT( 2, 0 ) = 2.0999999E+00 MAT( 2, 1 ) = 2.2000000E+00 MAT( 2, 2 ) = 2.2999999E+00 MAT( 2, 3 ) = 2.4000000E+00 MAT( 3, 0 ) = 3.0999999E+00 MAT( 3, 1 ) = 3.2000000E+00 MAT( 3, 2 ) = 3.2999999E+00 MAT( 3, 3 ) = 3.4000000E+00 MAT( 4, 0 ) = 4.0999999E+00 MAT( 4, 1 ) = 4.1999998E+00 MAT( 4, 2 ) = 4.3000001E+00 MAT( 4, 3 ) = 4.4000000E+00 DUMP OF MAT_3 := MAT_1 * MAT_2 MAT( -1, 0 ) = 1.1080000E+01 MAT( -1, 1 ) = 1.4000000E+01 MAT( -1, 2 ) = 1.4500000E+01 MAT( -1, 3 ) = 1.5000001E+01 MAT( 0, 0 ) = 1.9280000E+01 MAT( 0, 1 ) = 2.4800000E+01 MAT( 0, 2 ) = 2.5700001E+01 MAT( 0, 3 ) = 2.6600003E+01 MAT( 1, 0 ) = 2.7479999E+01 MAT( 1, 1 ) = 3.5600001E+01 MAT( 1, 2 ) = 3.6900000E+01 MAT( 1, 3 ) = 3.8200004E+01 MAT( 2, 0 ) = 3.5680000E+01 MAT( 2, 1 ) = 4.6400003E+01 MAT( 2, 2 ) = 4.8100004E+01 MAT( 2, 3 ) = 4.9800004E+01 DUMP OF MAT_3 := MAT_1 * MAT_2 + MAT_2 MAT( -1, 0 ) = 9.9799995E+00 MAT( -1, 1 ) = 1.5200001E+01 MAT( -1, 2 ) = 1.5800001E+01 MAT( -1, 3 ) = 1.6400001E+01 MAT( 0, 0 ) = 2.1380000E+01 MAT( 0, 1 ) = 2.7000002E+01 MAT( 0, 2 ) = 2.7999999E+01 MAT( 0, 3 ) = 2.9000000E+01 MAT( 1, 0 ) = 3.0580000E+01 MAT( 1, 1 ) = 3.8800004E+01 MAT( 1, 2 ) = 4.0199999E+01 MAT( 1, 3 ) = 4.1600008E+01 MAT( 2, 0 ) = 3.9779999E+01 MAT( 2, 1 ) = 5.0600004E+01 MAT( 2, 2 ) = 5.2400002E+01 MAT( 2, 3 ) = 5.4200005E+01 matricies not compatable for requested operation $ TYPE MATARF.COM -- command file used to produce this listing $ SET VERIFY $ TADA/LIST=REMATARF REMATARF $ TYPE REMATARF $ TADA/LIST=MATARF MATARF $ TYPE MATARF $ TRUN MATARF $ TYPE MATARF.COM $ SET NOVERIFY