Аналогичным образом опишем свойства для второго класса TMatr. В разделе type (раздел описания типов) опишем класс TMatr. Указатель Orig на начало этого участка определен в секции Protected, поэтому он доступен потомкам класса TMatr. Свойство Property Elemm и методы OutElemm и InpElemm – для записи и чтения значений элементов определены в секции Public, а значит доступны в других модулях и программах.
При работе конструктора значения полей kMin, kMax, jMax и jMin, также как и в классе TMas, в классе TMatr передаются как параметры, определяющие количество элементов массива. Метод ElemPP позволяет интерпретировать байты памяти, отведенные под элементs с номерами k и j, как значение вещественного типа. Они также записываются в секции Protected, поэтому доступны потомкам класса TMatr.
Процедуры GetMem и FreeMem выделяют и освобождают в динамической памяти область размера (jMax – jMin + 1) * Sizeof(Real) и присваивают адрес этой области указателю Orig. Метод Clearance очищает массив.
Описание процедур и функций, реализующих методы, помещается после слова implementation того модуля, где объявлен класс, и выглядят так:
function имя_класса.метод1(список параметров): тип результата;
begin тело функции;
end;
procedure имя_класса.метод2(список параметров);
begin тело процедуры;
end;
В результате работы конструктора инициализируются все поля класса. Процедура GetMem, использующая в методе Constructor, выделяет в динамической памяти область размера (то есть создает динамические переменные заданного размера и помещает их адрес в указатель(Orig)):
GetMem(Orig,((kMax-kMin+1)*(jMax-jMin+1)*Sizeof(Real)));
Метод Clearance очищает массив.
Метод destructor уничтожает объект и освобождает занимаемую им память. Процедура FreeMem освобождает память, занятую динамическими переменными данного размера:
FreeMem(Orig,((kMax-kMin+1)*(jMax-jMin+1)*Sizeof(Real)));
Модуль Matrisa описывает двухместные операции Add, Mul. Здесь действуют соглашение: при выполнении двухместной операции первым операндом является сам объект, вторым операндом – тот, который является формальным параметром метода. Результат сохраняется в полях первого операнда. В методе Det2 () вычисляется определитель матрицы второго порядка:
begin
S:=0;
S:=Elemm[1,1]*Elemm[2,2]-Elemm[1,2]*Elemm[2,1];
Det2:=S;
end;
Если в классе TMatr не описывать свойство Elem[k,j:integer], то в модуле Unit Matrisa необходимо обращаться не к Elemm[i], а к ElemPP[i]^. Как пример ниже фрагмент описания метода Mul:
Также и в модуле Unit Uses_Massiv, при использовании объектов класса TMatr необходимо обращаться не к Elemm[i], а к ElemPP[i]^, а также к операциям InpElem и OutElem. Как пример ниже фрагмент процедуры вычисления z5:
Полное описание модуля Matrisa, в котором описан класс TMatr с операциями над координатами точек прямой и направляющего вектора прямой, необходимыми для решения данной задачи, описано ниже:
Unit Matrisa;
interface
type Real=Single;
RealP=^Real;
type TMatr=class
protected
Orig: Pointer;
kMin, kMax, jMin, jMax:Integer;
function ElemPP(k,j:Integer):RealP;
public
function OutElemm(k,j:integer):Real;
procedure InpElemm(k,j:integer;r:Real);
constructor Create(kMin_, kMax_, jMin_,jMax_:Integer);
destructor destroy; override;
property Elemm[k,j:integer]:Real read OutElemm write InpElemm;
default;
procedure Clearance;
procedure Add(x:TMatr);
procedure Mul(x:TMatr);
function Det2():Real;
end;
implementation
uses Uses_Massiv;
function TMatr.ElemPP;
begin
ElemPP:=Ptr(LongInt(Orig)+((k-kMin)*(jMax-jMin+1)+j-
jMin)*Sizeof(Real));
end;
function TMatr.OutElemm(k,j:integer):Real;
begin
Result:=ElemPP(k,j)^;
end;
procedure TMatr.InPElemm(k,j:integer;r:Real);
begin
ElemPP(k,j)^:=r;
end;
constructor TMatr.Create(kMin_,kMax_,jMin_,jMax_:integer);
begin
inherited Create;
kMin:=kMin_;kMax:=kMax_;
jmin:=jMin_;jMax:=jMax_;
GetMem(Orig,((kMax-kMin+1)*(jMax-jMin+1)*Sizeof(Real)));
Clearance;
end;
destructor TMatr.destroy;
begin
FreeMem(Orig,((kMax-kMin+1)*(jMax-jMin+1)*Sizeof(Real)));
inherited Destroy;
end;
procedure TMatr.Clearance;
var k,j:Integer;
begin
for k:=kMin to kMax do
for j:=jMin to jMax do
Elemm[k,j]:=0.0;
end;
procedure TMatr.Add(x:TMatr);
var k,j:integer;
begin
for k:=kMin to kMax do
Elemm[k,j]:= Elemm[k,j]+x.Elemm[k,j];
end;
procedure TMatr.Mul(x:TMatr);
var k,j:Integer;
begin
for k:=kMin to kMax do
for j:=jMin to jMax do
Elemm[k,j]:=Elemm[k,j]*x.Elemm[k,j];
end;
function TMatr.Det2;
var S:Real;
begin
S:=0;
S:=Elemm[1,1]*Elemm[2,2]-Elemm[1,2]*Elemm[2,1];
Det2:=S;
end;
end.