IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

 
 Ответить  Открыть новую тему 
> Корректно ли так заполнять массив?
сообщение
Сообщение #1


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Светлана

Репутация: -  0  +


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 , вроде правильно, хочу перестраховаться
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #2


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


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 элемент - ноль. А что там вообще должно быть?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #3


Гость






Цитата
Если массив целочисленный, то там только 1 элемент - ноль.
С чего бы это? Длина массива = 0, он вообще пустой.

Цитата
Корректно ли так заполнять массив?
Зависит от того, что нужно получить в результате. Ничего противозаконного в таком заполнении нет, но и смысла тоже не видно.
 К началу страницы 
+ Ответить 
сообщение
Сообщение #4


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


а да smile.gif
сори, это я вывел количество элементов, а не сами элементы - перепутал...
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #5


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Светлана

Репутация: -  0  +


Спасибо за ответ! Требуется динамический массив объектов другого класса. Т.е. если правильно понимаю, процедуру добавления объекта в массив нужно объявлять вне конструктора?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #6


mea culpa
*****

Группа: Пользователи
Сообщений: 1 372
Пол: Мужской
Реальное имя: Николай

Репутация: -  24  +


Где хочешь, там и добавляй.


--------------------
"Знаешь, стыдно - когда не видно, что услышал всё, что слушал.."
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #7


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Светлана

Репутация: -  0  +


Может так лучше? Массив все-равно пустой, но длина уже вроде как не от меня зависит 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;



 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #8


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


MassF[Length(MassF)-1]:=figure;
Tfigure это тип объекта, так? значит его надо создать, чтоб закидывать в массив.
Цитата
но длина уже вроде как не от меня зависит
А не проще длину массива передавать как параметр в конструктор? а то зачем-то при каждой итерации все больше и больше памяти выделяется под массив
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #9


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Светлана

Репутация: -  0  +


TFigure создается своим конструктором с параметрами в том же Unit-е. Сам массив это геометрические фигуры отрисованные пользователем на канве (программа получилась типа примитивнейшего Paint). Как тогда лучше передать параметр длины?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #10


Профи
****

Группа: Пользователи
Сообщений: 865
Пол: Мужской
Реальное имя: Вячеслав

Репутация: -  20  +


не совсем то написал.
Цитата
Tfigure это тип объекта, так
а вот
figure
это локальная переменная. Вот ее и надо создавать. Это имелось ввиду.
А насчет длины - можно при запуске программы занулить, а при добавлнеии объектов вызывать метод, который увеличивает счетчик и закидывает в массив нужный объект (полностью инициализированный)
Вроде так smile.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #11


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Светлана

Репутация: -  0  +


Спасибо. Я постараюсь. Сегодня уже без сил mega_chok.gif
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #12


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Светлана

Репутация: -  0  +


объект figure у меня создается на Unit1 (рабочая программа), несчастный MassF заполняется там. Unit2 это как-бы демо с иерархией классов по ООП. Можно ли в таком случае оставить последний вариант конструктора?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #13


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Цитата

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;



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

 


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #14


Гость






Ну, кто должен выдыхать - еще большоооой вопрос. Допустим, это первый запуск. Длина массива = 0. J чему будет равно? Дальше продолжать, или выдохнем и подумаем?
 К началу страницы 
+ Ответить 
сообщение
Сообщение #15


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


> Допустим, это первый запуск. Длина массива = 0.

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

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

Нулю. И?

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

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



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #16


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Светлана

Репутация: -  0  +


Ничего не понимаю... Зачем туда j вставлять? Да еще умножать его на 2?
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #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;


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #18


Новичок
*

Группа: Пользователи
Сообщений: 10
Пол: Женский
Реальное имя: Светлана

Репутация: -  0  +


Изначально длина массива 0, удвоится может только один раз когда равен 1, и, соответственно +1 будет 2
М.б. тогда цикл не нужен? Тогда при создании объекта опять будет вызываться конструктор? Как это происходит?

Сообщение отредактировано: VEDA -
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #19


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


Если изначально длина равна 0, то цикл
for i:=0 to Length(MassF)-1 do begin
не выполнится ни разу. Ничего не произойдёт.
А если не ноль, то длина удвоится. Мы эн раз увеличиваем длину на единицу, значит длина увеличивается на эн.


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
сообщение
Сообщение #20


Гость






Так, VEDA, давайте все-таки уточним, что именно вам необходимо сделать, и что куда передается. Смысла в приводимых тут кодах все меньше и меньше, зачем вообще что-то городить с массивами, если при первой же попытке обращения к содержимому программа вылетит с ошибкой?

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

 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 19.04.2024 7:16
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name