Помощь - Поиск - Пользователи - Календарь
Полная версия: Корректно ли так заполнять массив?
Форум «Всё о Паскале» > Современный Паскаль и другие языки > Делфи
VEDA
constructor ТContFigur.Create();
var i: integer;
begin
inherited Create();
SetLength(MassF, 0);
for i := 0 to Length(MassF)-1 do
begin
SetLength(MassF,Length(MassF)+1);
MassF [Length(MassF)-1]:= MassF[i];
end;
end;


Уже не соображаю ничего wacko.gif , вроде правильно, хочу перестраховаться
Client
var
massF:array of integer;
i,j:integer;
begin
SetLength(MassF, 0);
j:= Length(MassF)-1;
for i := 0 to Length(MassF)-1 do begin
SetLength(MassF,Length(MassF)+1);
MassF [Length(MassF)-1]:= MassF[i];
end;
end;
Если массив целочисленный, то там только 1 элемент - ноль. А что там вообще должно быть?
volvo
Цитата
Если массив целочисленный, то там только 1 элемент - ноль.
С чего бы это? Длина массива = 0, он вообще пустой.

Цитата
Корректно ли так заполнять массив?
Зависит от того, что нужно получить в результате. Ничего противозаконного в таком заполнении нет, но и смысла тоже не видно.
Client
а да smile.gif
сори, это я вывел количество элементов, а не сами элементы - перепутал...
VEDA
Спасибо за ответ! Требуется динамический массив объектов другого класса. Т.е. если правильно понимаю, процедуру добавления объекта в массив нужно объявлять вне конструктора?
Unconnected
Где хочешь, там и добавляй.
VEDA
Может так лучше? Массив все-равно пустой, но длина уже вроде как не от меня зависит ypriamii.gif

Код
constructor TContFigur.Create();
   var i: integer;
   figure: TFigure;
begin
  inherited Create();
  for i:=0 to Length(MassF)-1 do
    begin
      SetLength(MassF,Length(MassF)+1);
      MassF[Length(MassF)-1]:=figure;
    end;
end;



Client
MassF[Length(MassF)-1]:=figure;
Tfigure это тип объекта, так? значит его надо создать, чтоб закидывать в массив.
Цитата
но длина уже вроде как не от меня зависит
А не проще длину массива передавать как параметр в конструктор? а то зачем-то при каждой итерации все больше и больше памяти выделяется под массив
VEDA
TFigure создается своим конструктором с параметрами в том же Unit-е. Сам массив это геометрические фигуры отрисованные пользователем на канве (программа получилась типа примитивнейшего Paint). Как тогда лучше передать параметр длины?
Client
не совсем то написал.
Цитата
Tfigure это тип объекта, так
а вот
figure
это локальная переменная. Вот ее и надо создавать. Это имелось ввиду.
А насчет длины - можно при запуске программы занулить, а при добавлнеии объектов вызывать метод, который увеличивает счетчик и закидывает в массив нужный объект (полностью инициализированный)
Вроде так smile.gif
VEDA
Спасибо. Я постараюсь. Сегодня уже без сил mega_chok.gif
VEDA
объект figure у меня создается на Unit1 (рабочая программа), несчастный MassF заполняется там. Unit2 это как-бы демо с иерархией классов по ООП. Можно ли в таком случае оставить последний вариант конструктора?
TarasBer
Цитата

constructor TContFigur.Create();
var i: integer;
figure: TFigure;
begin
inherited Create();
for i:=0 to Length(MassF)-1 do
begin
SetLength(MassF,Length(MassF)+1);
MassF[Length(MassF)-1]:=figure;
end;
end;




Что это?! Вы под чем это писали?
Вот код, который делает точно то же, что и ваш.


constructor TContFigur.Create;
var i, j: integer;
figure: TFigure;
begin
inherited Create;
j := Length(MassF);
SetLength(MassF, j*2);
for i := j to Length(MassF) - 1 do MassF[i] := Figure;
end;



Пятачок, выдыхай...

 
vlads
Ну, кто должен выдыхать - еще большоооой вопрос. Допустим, это первый запуск. Длина массива = 0. J чему будет равно? Дальше продолжать, или выдохнем и подумаем?
TarasBer
> Допустим, это первый запуск. Длина массива = 0.

Тогда этот код вообще не имеет смысла. Я предположил, что код имеет смысл и изначальная длина не ноль.

> J чему будет равно?

Нулю. И?

> Дальше продолжать, или выдохнем и подумаем?

Нет, выдохните и подумайте.

VEDA
Ничего не понимаю... Зачем туда j вставлять? Да еще умножать его на 2?
TarasBer
А вы сами посмотрите, что делает ваш код.
Пусть длина массива изначально равна N

for i:=0 to Length(MassF)-1 do begin

Мы N раз (длина массива сразу запоминается)

SetLength(MassF,Length(MassF)+1);

Увеличиваем длину массива на единицу - то есть длина массива после всего этого удваивается.

MassF[Length(MassF)-1]:=figure;

А ещё мы N раз присваиваем последний элемент.

end;
VEDA
Изначально длина массива 0, удвоится может только один раз когда равен 1, и, соответственно +1 будет 2
М.б. тогда цикл не нужен? Тогда при создании объекта опять будет вызываться конструктор? Как это происходит?
TarasBer
Если изначально длина равна 0, то цикл
for i:=0 to Length(MassF)-1 do begin
не выполнится ни разу. Ничего не произойдёт.
А если не ноль, то длина удвоится. Мы эн раз увеличиваем длину на единицу, значит длина увеличивается на эн.
volvo
Так, VEDA, давайте все-таки уточним, что именно вам необходимо сделать, и что куда передается. Смысла в приводимых тут кодах все меньше и меньше, зачем вообще что-то городить с массивами, если при первой же попытке обращения к содержимому программа вылетит с ошибкой?

Откуда в коде берется очередной элемент типа TFigure? Из воздуха? В переменной figure - мусор, ее нельзя никуда присваивать.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.