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;
Уже не соображаю ничего , вроде правильно, хочу перестраховаться
Client
5.04.2010 18:24
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
5.04.2010 18:55
Цитата
Если массив целочисленный, то там только 1 элемент - ноль.
С чего бы это? Длина массива = 0, он вообще пустой.
Цитата
Корректно ли так заполнять массив?
Зависит от того, что нужно получить в результате. Ничего противозаконного в таком заполнении нет, но и смысла тоже не видно.
Client
5.04.2010 18:59
а да сори, это я вывел количество элементов, а не сами элементы - перепутал...
VEDA
5.04.2010 19:53
Спасибо за ответ! Требуется динамический массив объектов другого класса. Т.е. если правильно понимаю, процедуру добавления объекта в массив нужно объявлять вне конструктора?
Unconnected
5.04.2010 20:12
Где хочешь, там и добавляй.
VEDA
5.04.2010 22:03
Может так лучше? Массив все-равно пустой, но длина уже вроде как не от меня зависит
Код
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
5.04.2010 22:12
MassF[Length(MassF)-1]:=figure;
Tfigure это тип объекта, так? значит его надо создать, чтоб закидывать в массив.
Цитата
но длина уже вроде как не от меня зависит
А не проще длину массива передавать как параметр в конструктор? а то зачем-то при каждой итерации все больше и больше памяти выделяется под массив
VEDA
5.04.2010 22:29
TFigure создается своим конструктором с параметрами в том же Unit-е. Сам массив это геометрические фигуры отрисованные пользователем на канве (программа получилась типа примитивнейшего Paint). Как тогда лучше передать параметр длины?
Client
5.04.2010 22:34
не совсем то написал.
Цитата
Tfigure это тип объекта, так
а вот
figure
это локальная переменная. Вот ее и надо создавать. Это имелось ввиду. А насчет длины - можно при запуске программы занулить, а при добавлнеии объектов вызывать метод, который увеличивает счетчик и закидывает в массив нужный объект (полностью инициализированный) Вроде так
VEDA
5.04.2010 22:41
Спасибо. Я постараюсь. Сегодня уже без сил
VEDA
6.04.2010 13:37
объект figure у меня создается на Unit1 (рабочая программа), несчастный MassF заполняется там. Unit2 это как-бы демо с иерархией классов по ООП. Можно ли в таком случае оставить последний вариант конструктора?
TarasBer
6.04.2010 14:42
Цитата
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
6.04.2010 14:59
Ну, кто должен выдыхать - еще большоооой вопрос. Допустим, это первый запуск. Длина массива = 0. J чему будет равно? Дальше продолжать, или выдохнем и подумаем?
TarasBer
6.04.2010 15:03
> Допустим, это первый запуск. Длина массива = 0.
Тогда этот код вообще не имеет смысла. Я предположил, что код имеет смысл и изначальная длина не ноль.
> J чему будет равно?
Нулю. И?
> Дальше продолжать, или выдохнем и подумаем?
Нет, выдохните и подумайте.
VEDA
6.04.2010 15:06
Ничего не понимаю... Зачем туда j вставлять? Да еще умножать его на 2?
TarasBer
6.04.2010 15:10
А вы сами посмотрите, что делает ваш код. Пусть длина массива изначально равна N
for i:=0 to Length(MassF)-1 do begin
Мы N раз (длина массива сразу запоминается)
SetLength(MassF,Length(MassF)+1);
Увеличиваем длину массива на единицу - то есть длина массива после всего этого удваивается.
MassF[Length(MassF)-1]:=figure;
А ещё мы N раз присваиваем последний элемент.
end;
VEDA
6.04.2010 15:17
Изначально длина массива 0, удвоится может только один раз когда равен 1, и, соответственно +1 будет 2 М.б. тогда цикл не нужен? Тогда при создании объекта опять будет вызываться конструктор? Как это происходит?
TarasBer
6.04.2010 15:32
Если изначально длина равна 0, то цикл for i:=0 to Length(MassF)-1 do begin не выполнится ни разу. Ничего не произойдёт. А если не ноль, то длина удвоится. Мы эн раз увеличиваем длину на единицу, значит длина увеличивается на эн.
volvo
6.04.2010 17:12
Так, VEDA, давайте все-таки уточним, что именно вам необходимо сделать, и что куда передается. Смысла в приводимых тут кодах все меньше и меньше, зачем вообще что-то городить с массивами, если при первой же попытке обращения к содержимому программа вылетит с ошибкой?
Откуда в коде берется очередной элемент типа TFigure? Из воздуха? В переменной figure - мусор, ее нельзя никуда присваивать.
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.