![]() |
Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.
![]() ![]() |
![]() |
VEDA |
![]()
Сообщение
#1
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Светлана Репутация: ![]() ![]() ![]() |
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 |
![]()
Сообщение
#2
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
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 |
![]()
Сообщение
#3
|
Гость ![]() |
Цитата Если массив целочисленный, то там только 1 элемент - ноль. С чего бы это? Длина массива = 0, он вообще пустой.Цитата Корректно ли так заполнять массив? Зависит от того, что нужно получить в результате. Ничего противозаконного в таком заполнении нет, но и смысла тоже не видно. |
Client |
![]()
Сообщение
#4
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
а да
![]() сори, это я вывел количество элементов, а не сами элементы - перепутал... |
VEDA |
![]()
Сообщение
#5
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Светлана Репутация: ![]() ![]() ![]() |
Спасибо за ответ! Требуется динамический массив объектов другого класса. Т.е. если правильно понимаю, процедуру добавления объекта в массив нужно объявлять вне конструктора?
|
Unconnected |
![]()
Сообщение
#6
|
![]() mea culpa ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 372 Пол: Мужской Реальное имя: Николай Репутация: ![]() ![]() ![]() |
Где хочешь, там и добавляй.
-------------------- "Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
|
VEDA |
![]()
Сообщение
#7
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Светлана Репутация: ![]() ![]() ![]() |
Может так лучше? Массив все-равно пустой, но длина уже вроде как не от меня зависит
![]() Код 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 |
![]()
Сообщение
#8
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
MassF[Length(MassF)-1]:=figure;
Tfigure это тип объекта, так? значит его надо создать, чтоб закидывать в массив.Цитата но длина уже вроде как не от меня зависит А не проще длину массива передавать как параметр в конструктор? а то зачем-то при каждой итерации все больше и больше памяти выделяется под массив |
VEDA |
![]()
Сообщение
#9
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Светлана Репутация: ![]() ![]() ![]() |
TFigure создается своим конструктором с параметрами в том же Unit-е. Сам массив это геометрические фигуры отрисованные пользователем на канве (программа получилась типа примитивнейшего Paint). Как тогда лучше передать параметр длины?
|
Client |
![]()
Сообщение
#10
|
Профи ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 865 Пол: Мужской Реальное имя: Вячеслав Репутация: ![]() ![]() ![]() |
не совсем то написал.
Цитата Tfigure это тип объекта, так а вот
figure
это локальная переменная. Вот ее и надо создавать. Это имелось ввиду.А насчет длины - можно при запуске программы занулить, а при добавлнеии объектов вызывать метод, который увеличивает счетчик и закидывает в массив нужный объект (полностью инициализированный) Вроде так ![]() |
VEDA |
![]()
Сообщение
#11
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Светлана Репутация: ![]() ![]() ![]() |
Спасибо. Я постараюсь. Сегодня уже без сил
![]() |
VEDA |
![]()
Сообщение
#12
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Светлана Репутация: ![]() ![]() ![]() |
объект figure у меня создается на Unit1 (рабочая программа), несчастный MassF заполняется там. Unit2 это как-бы демо с иерархией классов по ООП. Можно ли в таком случае оставить последний вариант конструктора?
|
TarasBer |
![]()
Сообщение
#13
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Цитата
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 |
![]()
Сообщение
#14
|
Гость ![]() |
Ну, кто должен выдыхать - еще большоооой вопрос. Допустим, это первый запуск. Длина массива = 0. J чему будет равно? Дальше продолжать, или выдохнем и подумаем?
|
TarasBer |
![]()
Сообщение
#15
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
> Допустим, это первый запуск. Длина массива = 0.
Тогда этот код вообще не имеет смысла. Я предположил, что код имеет смысл и изначальная длина не ноль. > J чему будет равно? Нулю. И? > Дальше продолжать, или выдохнем и подумаем? Нет, выдохните и подумайте. -------------------- |
VEDA |
![]()
Сообщение
#16
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Светлана Репутация: ![]() ![]() ![]() |
Ничего не понимаю... Зачем туда j вставлять? Да еще умножать его на 2?
|
TarasBer |
![]()
Сообщение
#17
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
А вы сами посмотрите, что делает ваш код.
Пусть длина массива изначально равна N for i:=0 to Length(MassF)-1 do begin Мы N раз (длина массива сразу запоминается) SetLength(MassF,Length(MassF)+1); Увеличиваем длину массива на единицу - то есть длина массива после всего этого удваивается. MassF[Length(MassF)-1]:=figure; А ещё мы N раз присваиваем последний элемент. end; -------------------- |
VEDA |
![]()
Сообщение
#18
|
![]() Новичок ![]() Группа: Пользователи Сообщений: 10 Пол: Женский Реальное имя: Светлана Репутация: ![]() ![]() ![]() |
Изначально длина массива 0, удвоится может только один раз когда равен 1, и, соответственно +1 будет 2
М.б. тогда цикл не нужен? Тогда при создании объекта опять будет вызываться конструктор? Как это происходит? Сообщение отредактировано: VEDA - 6.04.2010 11:26 |
TarasBer |
![]()
Сообщение
#19
|
![]() Злостный любитель ![]() ![]() ![]() ![]() ![]() Группа: Пользователи Сообщений: 1 755 Пол: Мужской Репутация: ![]() ![]() ![]() |
Если изначально длина равна 0, то цикл
for i:=0 to Length(MassF)-1 do begin не выполнится ни разу. Ничего не произойдёт. А если не ноль, то длина удвоится. Мы эн раз увеличиваем длину на единицу, значит длина увеличивается на эн. -------------------- |
volvo |
![]()
Сообщение
#20
|
Гость ![]() |
Так, VEDA, давайте все-таки уточним, что именно вам необходимо сделать, и что куда передается. Смысла в приводимых тут кодах все меньше и меньше, зачем вообще что-то городить с массивами, если при первой же попытке обращения к содержимому программа вылетит с ошибкой?
Откуда в коде берется очередной элемент типа TFigure? Из воздуха? В переменной figure - мусор, ее нельзя никуда присваивать. |
![]() ![]() |
![]() |
Текстовая версия | 26.07.2025 5:17 |