Type TType = Integer; arrType = Array[0 .. Pred(maxInt div SizeOf(TType))] Of TType; Function ix(row, col: Integer; Const n: Integer): Integer; Begin ix := Pred(row) * n + Pred(col) End; Procedure matrixTranspose(Var ma; Const n: Integer); Var a: arrType Absolute ma; i, j: Integer; p: ^arrType; Begin GetMem(p, Sqr(n) * SizeOf(TType)); For i := 1 To n Do For j := 1 To n Do p^[ ix(j, i, n) ] := a[ ix(i, j, n) ]; Move(p^[0], a[0], Sqr(n) * SizeOf(TType)); FreeMem(p, Sqr(n) * SizeOf(TType)); End; Procedure CheckSum(Var ma; Const n: Integer); Var a: arrType Absolute ma; Check: Boolean; s, sEq: TType; i, j: Integer; Begin Check := True; For i := 1 To n Do Begin s := 0; For j := 1 To n Do s := s + a[ ix(i, j, n) ]; If i = 1 Then sEq := s Else Check := Check and (s = sEq) End; If not Check Then matrixTranspose(a, n); End; Const arr_one: Array[1 .. 5, 1 .. 5] Of TType = ((1, 2, 3, 4, 15), (2, 3, 4, 5, 16), (3, 4, 5, 6, 17), (4, 5, 6, 7, 18), (5, 6, 7, 8, 19)); arr_two: Array[1 .. 4, 1 .. 4] Of TType = ((2, 3, 4, 5), (2, 3, 4, 5), (2, 3, 4, 5), (2, 3, 4, 5)); Var i, j: integer; begin CheckSum(arr_one, 5); For i := 1 To 5 Do Begin For j := 1 To 5 Do Write(arr_one[i, j]:5); WriteLn End; CheckSum(arr_two, 4); For i := 1 To 4 Do Begin For j := 1 To 4 Do Write(arr_two[i, j]:5); WriteLn End; end.