Не могу обратиться к объекту по индексу
Нужно реализовать в программе на Pascal ABC.NET класс одномерный массив и унаследовать от него двумерный массив. Для двумерного массива перегрузил операцию [] через индексное свойство. Но при попытке обратиться к массиву через [] выдает ошибку: "Property reference with invalid number of arguments". Как исправить
program Lab3;
{ Класс массив (одномерный статический) }
type
Mas = class
protected
intList: array of integer; // Список значений
n: integer;
procedure setValue(index: integer; val: integer); // Присвоение значения index-му элементу
begin
if index >= Self.n then
begin
writeln(' Index out of range ');
exit;
end;
intList[index] := val;
end;
function getValue(index: integer): integer; // чтение элемента с индексом index
begin
if index >= Self.n then
begin
writeln(' Index out of range ');
exit;
end;
Result := intList[index];
end;
public
constructor (const size: integer); // Создание массива
begin
intList := new integer[size];
Self.n := size;
end;
property Val[i: integer]: integer read getValue write setValue; default; // Переопределение метода []
end;
Mas2D = class(Mas)
private
m: integer;
procedure setValue2(i, j, val: integer);
begin
var index: integer := i*Self.n+j;
if index >= Self.n*Self.m then
begin
writeln(' Index out of range ');
exit;
end;
intList[index] := val;
end;
function getValue2(i, j: integer): integer;
begin
var index: integer := i*Self.n+j;
if index >= Self.n*Self.m then
begin
writeln(' Index out of range ');
exit;
end;
Result := intList[index];
end;
public
constructor (const n, m: integer);
begin
intList := new integer[n*m];
end;
property Val2[i, j: integer]: integer read getValue2 write setValue2; // Переопределение метода []
end;
var myArray: Mas;
var a, b: integer;
begin
a := 4;
b := 4;
myArray := new Mas2D(a, b);
for var i:=0 to a-1 do
for var j:=0 to b-1 do
myArray[i, j] := 3; // Вот тут ошибка
for var i:=0 to a-1 do
begin
for var j:=0 to b-1 do
write(myArray[i, j], ' ');
writeln(' ');
end;
end.
Ответы (1 шт):
Автор решения: Алексей Р
→ Ссылка
Кроме прочего, у вас индексное свойство Val с одним аргументом было определено как дефолтное, поэтому при обращении требовало 1 параметр, а вы передавали 2. Я переопределил свойство Val с двумя аргументами и сделал дефолтным его. Также заменил тип myArray с Mas на Mas2D, применил вызов унаследованного конструктора и задействовал переменную m.
program Lab3;
{ Класс массив (одномерный статический) }
type
Mas = class
protected
intList: array of integer; // Список значений
n: integer;
procedure setValue(index: integer; val: integer); // Присвоение значения index-му элементу
begin
if index >= Self.n then
begin
writeln(' Index out of range ');
exit;
end;
intList[index] := val;
end;
function getValue(index: integer): integer; // чтение элемента с индексом index
begin
if index >= Self.n then
begin
writeln(' Index out of range ');
exit;
end;
Result := intList[index];
end;
public
constructor Create(const size: integer); // Создание массива
begin
intList := new integer[size];
Self.n := size;
end;
property Val[i: integer]: integer read getValue write setValue; // Переопределение метода []
end;
Mas2D = class(Mas)
private
m: integer;
procedure setValue(i, j, v: integer);
begin
var index: integer := i*Self.n+j;
if index >= Self.n*Self.m then
begin
writeln(' Index out of range ');
exit;
end;
intList[index] := v;
end;
function getValue(i, j: integer): integer;
begin
var index: integer := i*Self.n+j;
if index >= Self.n*Self.m then
begin
writeln(' Index out of range ');
exit;
end;
Result := intList[index];
end;
public
constructor Create(const n, m: integer);
begin
inherited Create(n*m);
Self.m := m;
Self.n := n;
end;
property Val[i, j: integer]: integer read getValue write setValue; default; // Переопределение метода []
end;
var myArray: Mas2D;
var a, b: integer;
begin
a := 4;
b := 4;
myArray := new Mas2D(a, b);
for var i:=0 to a-1 do
for var j:=0 to b-1 do
myArray[i, j] := 3;
for var i:=0 to a-1 do
begin
for var j:=0 to b-1 do
write(myArray[i, j], ' ');
writeln(' ');
end;
end.
3 3 3 3
3 3 3 3
3 3 3 3
3 3 3 3