type TYac = {object}class private Znac:integer; public function GetZnac:integer; procedure PutZnac(z:integer); end;
TColumn = {object}class private Col:array[1..N] of TYac; public function GetZnac(i:integer):integer; procedure PutZnac(i,z:integer); end;
implementation
function TYac.GetZnac:integer; begin GetZnac:=Znac; end;
procedure TYac.PutZnac(z:integer); begin Znac:=z; end;
function TColumn.GetZnac(i:integer):integer; begin GetZnac:=col[i].GetZnac; end;
procedure TColumn.PutZnac(i,z:integer); begin col[i].PutZnac(z); end;
end.
Программа(Показать/Скрыть)
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Unit1 in 'Unit1.pas';
var Column:TColumn;
begin Column.PutZnac(1,7); // Вот здесь ругается {Column.PutZnac(2,8); Column.PutZnac(3,5);} //writeln(Column.GetZnac(1)); // Вот здесь ругается readln; end.
А если писать object, то все норм.
Сообщение отредактировано: sheka - 28.03.2010 15:07
type TCell = class private fValue:integer; function GetValue:integer; procedure SetValue(v:integer); published property Value:integer read GetValue write SetValue; end;
TColumn = class private fColumn:array[1..N] of TCell; function GetCell(j:integer):TCell; procedure SetCell(j:integer;c:TCell); public constructor Create; property Column[j:integer]:TCell read GetCell write SetCell; end;
TRow = class private fRow:array[1..N] of TColumn; function GetColumn(i:integer):TColumn; procedure SetColumn(i:integer;c:TColumn); public //<--------------------------------вот здесь Published constructor Create; property Row[i:integer]:TColumn read GetColumn write SetColumn;
end;
TMatr = class(TRow) public procedure vvod(nam:string); procedure vivod(nam:string); end;
TFunc = class public function Mult(a,b:TMatr;N:byte):TMatr; end;
implementation
function TCell.GetValue:integer; begin result:=fValue; end;
procedure TCell.SetValue(v:integer); begin fValue:=v; end;
constructor TColumn.Create; var i:integer; begin inherited; for i:=1 to N do fColumn[i]:=TCell.Create; end;
function TColumn.GetCell(j:integer):TCell; begin result:=fColumn[j]; end;
procedure TColumn.SetCell(j:integer;c:TCell); begin fColumn[j]:=c; end;
constructor TRow.Create; var i:integer; begin inherited; for i:=1 to N do fRow[i]:=TColumn.Create; end;
function TRow.GetColumn(i:integer):TColumn; begin result:=fRow[i]; end;
procedure TRow.SetColumn(i:integer;c:TColumn); begin fRow[i]:=c; end;
procedure TMatr.vvod(nam:string); var i,j:byte; v:integer; begin for i:=1 to N do for j:=1 to N do begin write('vvedi ',nam,'[',i,',',j,']: '); readln(v); self.Row[i].Column[j].Value:=v; end; end;
procedure TMatr.vivod(nam:string); var i,j:byte; begin writeln(nam); for i:=1 to N do begin for j:=1 to N do write(self.Row[i].Column[j].Value:4); writeln; end; writeln; end;
function TFunc.Mult(a,b:TMatr;N:byte):TMatr; var i,j,s:byte; v:integer; begin for i:=1 to N do for j:=1 to N do begin v:=0; for s:=1 to N do begin //inc(v,a.Row[i].Column[s].Value*b.Row[s].Column[j].Value); //<---вот эти строчки не работают... //Mult.Row[i].Column[j].Value:=v; //<------------------------------- end; end; end;
end.
Программа(Показать/Скрыть)
program Project1;
{$APPTYPE CONSOLE}
uses SysUtils, Unit1 in 'Unit1.pas';
var a,b:TMatr; f:TFunc;
begin a:=TMatr.Create; a.vvod('a'); a.vivod('viv a'); b:=TMatr.Create; b.vvod('b'); b.vivod('viv b');
Не работают закомментированые строчки. Насколько я понял, это происходит из-за того, что "Published свойства не могут возвращать массивы." , а Publiс не видны "родственникам по программе" дальше чем потомки данного класса.
Добавлено через 8 мин. Извините, забыл. Задание: Найти произведение матриц.
Сообщение отредактировано: sheka - 28.03.2010 22:48