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