@66demon666
По навыкам джун - по факту безработный

Паскаль. Переменные и массивы внутри классов?

Доброго времени суток. Делаю морской бой, запоролся на определении уничтожения корабля.
Имеется поле 10 на 10, имеется массив, хранящий кол-во живых палуб каждого корабля. Эти 2 массива приходится передавать в каждый метод класса в качестве аргументов, ибо передать в конструктор, и хранить их внутри класса не представляется возможным, значения массивов не меняются
......
type test=class
a:array[1..10, 1..10] of integer;
b:array [1..10] of integer;
constructor Create(a:array[1..10, 1..10] of integer; b:array [1..10] of integer);
...

Не работает. Можно ли что-то подобное реализовать? Заранее спасибо
  • Вопрос задан
  • 176 просмотров
Пригласить эксперта
Ответы на вопрос 2
@Mercury13
Программист на «си с крестами» и не только
Что творится? Не компилируется?
А не компилируется из-за непонимания концепции эквивалентности типов. В отличие от Си, внешне одинаковые типы не эквивалентны! Для эквивалентности надо, чтобы их цепочки type A = B; вели к одному «предку». Для этого существует оператор type.
const
  FieldSize = 10;
  MaxShips = 10;
type
  TField = record
    cells : array [1..FieldSize, 1..FieldSize] of integer;
    nLive : array [1..MaxShips] of integer;
  end;
  TGame = class
    Field : TField;
    constructor Create(const Field : TField);  
  end;

Возможно, эквивалентность ослабили в Delphi, не проверял. А в BP именно так.

Возможно, вы также сделали известную ошибку начинающего дельфиста:
var
  x : Test;
....
x.Create(a, b);     // неверно!
x := Test.Create(a, b); // верно!


Есть одно исключение из этой эквивалентности типов.
type
  DaInt = array of integer;

procedure DoSomething1(var x : array of integer);
procedure DoSomething2(var x : DaInt);

Эти команды обе действуют, но не эквивалентны!

Первое — нововведение TP7, параметр типа «открытый массив», массив любой размерности. Статический, динамический, строчка 2D-массива — всё подойдёт. Действуют Low, High и (для D4+) Length.

Второе — нововведение D4, динамический массив, которому можно изменять длину через SetLength.
Ответ написан
Daniro_San
@Daniro_San
Программист
Если речь о PascalABC, то смотрите в документацию, он немножко особенный.
Если PascalABC.NET, то и подавно, это извращенные решетки.
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы