Переменные A и Rem(A) - это одно и то же поле памяти. Элементы матрицы A расположены в памяти согласно трафарета, определенного именем типа MatrixA, т.е.
Элемент Rem(A)[10,10] имеет порядковый номер 9 × 100 + 10 = 910, его адрес равен
A + (910-1)*6 = A + 5454.
Следовательно, переменным c и d в примере 2 будут присвоены различные значения.
Совпадение значений a[i,j] и Rem(A)[i,j] будет иметь место лишь в том случае, когда пределы изменения индексов фактической и наложенной матриц одни и те же. Естественно, при этих условиях процедура не сможет правильно обрабатывать матрицы разного размера.
Чтобы обеспечить в процедуре обработку матриц разного размера, в теле процедуры на фактическую матрицу накладывается фиктивный одномерный массив. Тогда при переходе от фактического к фиктивному (наложенному) массиву по индексам i, j матрицы вычисляется порядковый номер k одномерного массива, а при обратном переходе - по значению k вычисляются индексы i, j.
Пусть фактическая матрица A имеет объявление типа
Matrix = array[1..Mmax,1..Nmax] of real.
Тогда порядковый номер элемента a[i,j]: k = (i - 1) × Nmax + j .
Наоборот, элемент с порядковым номером k имеет индексы
i = (k - 1) div Nmax + 1; j = k - (i - 1) × Nmax.
Пример 3. Разработать процедуру, определяющую значение и местоположение максимального элемента для матриц разного размера.
Program MaxElem;
Const MmaxA = 30; NmaxA = 30;
MmaxB = 20; NmaxB = 40;
Type MatrixA = array[1..MmaxA,1..NmaxA] of real;
MatrixB = array[1..MmaxB,1..NmaxB] of real;
RealAr = array[1..(2*MaxInt) div SizeOf(real)] of real;
В примере 3 для обработки матриц с разными именами типов применялся аппарат приведения типов. В следующем примере с этой же целью используются абсолютные переменные.
Пример 4. Разработать процедуру, определяющую значение и местоположение максимального элемента среди элементов, расположенных ниже главной диагонали квадратной матрицы.
ProgramMaxMatrix;
Const NmaxA = 30; NmaxB = 40;
Type MatrixA = array[1..NmaxA,1..NmaxA] of real;
MatrixB = array[1..NmaxB,1..NmaxB] of real;
RealAr = array[1..(2*MaxInt) div SizeOf(real)] of real;