|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#16
|
|||
|
|||
Динамические массивы используются, когда заранее неизвестно кол-во элементов. В принципе, для любого типа можно использовать списки, НО! для простых типов, не указателей, надо специально создавать указатель и выделять память, что ведет еще к большей фрагментации памяти. Хотя для динамического массива возможны скрытые расходы на получение нового блока памяти и копирование элементов из старого в новый массив.
А вообще, можно любую синтаксическую конструкцию использовать так, что захочется руки оторвать. И что теперь, минимизировать возможности языков? |
#17
|
||||
|
||||
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#18
|
||||
|
||||
Цитата:
Ага, пусть компилятор сам думает. C# получится тогда, или ПыХыПы Некоторые программисты настолько ленивы, что сразу пишут рабочий код. Если вас наказали ни за что - радуйтесь: вы ни в чем не виноваты. |
#19
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#20
|
||||
|
||||
Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#21
|
||||
|
||||
И не должны, так при создании динамического массива и Create не вызывается. Он просто не существует.
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#22
|
||||
|
||||
Еще раз говорю, у них разная абстракция данных, массивы - это наследие из паскаля, в котором не было понятия объекта.
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#23
|
||||
|
||||
Цитата:
Поскольку, как тут правильно заметили, динамические массивы могут использоваться и для невладеющих ссылок, достаточно было бы одного ключевого слова, чтобы показать, что ссылка владеющая. Скажем, пусть это будет class: Код:
type TObjects = array of class TObject; // первый вариант Цитата:
Не стоит путать форумы с богадельнями. © Bargest |
#24
|
||||
|
||||
Хорошо. Поставим задачу так:
У нас есть какие-то объекты, которые мы как-то создали. И есть массив. Динамический. Мы добавляем в него эти объекты. Созданные ранее. А потом удаляем из этого массива. Вопрос: объекты должны удалиться? Ответ - нет. Массив - в данном случае просто список чего угодно. array of integer - динамический массив чисел. array of string - динамический массив строк. array of TPoint - динамический массив точек на плоскости (при этом TPoint есть record, а не class). А array of TObject - это массив объектов. И программист сам должен заботиться о создании и уничтожении этих объектов. Оставайтесь хорошими людьми... VK id2634397, ds [at] phoenix [dot] dj |
#25
|
||||
|
||||
Не вариант?
Код:
type IMyIntf = interface ['{D5901C23-79CD-45A7-904B-5966ACE5ACCF}'] end; TMyIntfClass = class(TInterfacedObject, IMyIntf) private public destructor Destroy; override; end; procedure TForm1.btn1Click(Sender: TObject); var foo: array of IMyIntf; i: Integer; begin SetLength(foo, 4); for i := 0 to 3 do foo[i] := TMyIntfClass.Create; end; { TMyIntfClass } destructor TMyIntfClass.Destroy; begin ShowMessage('destructed'); inherited; end; "К массивам интерфейсов у меня претензий нет" expected; Код:
procedure _FinalizeArray(p: Pointer; typeInfo: Pointer; elemCount: Cardinal); {$IFDEF PUREPASCAL} var FT: PFieldTable; begin if elemCount = 0 then Exit; case PTypeInfo(typeInfo).Kind of tkLString: _LStrArrayClr(P^, elemCount); tkWString: _WStrArrayClr(P^, elemCount); tkVariant: while elemCount > 0 do begin _VarClr(PVarData(P)^); Inc(Integer(P), sizeof(Variant)); Dec(elemCount); end; tkArray: begin FT := PFieldTable(Integer(typeInfo) + Byte(PTypeInfo(typeInfo).Name[0])); while elemCount > 0 do begin _FinalizeArray(P, FT.Fields[0].TypeInfo^, FT.Count); Inc(Integer(P), FT.Size); Dec(elemCount); end; end; tkRecord: begin FT := PFieldTable(Integer(typeInfo) + Byte(PTypeInfo(typeInfo).Name[0])); while elemCount > 0 do begin _FinalizeRecord(P, typeInfo); Inc(Integer(P), FT.Size); Dec(elemCount); end; end; tkInterface: while elemCount > 0 do begin _IntfClear(IInterface(P^)); Inc(Integer(P), 4); Dec(elemCount); end; tkDynArray: while elemCount > 0 do begin _DynArrayClr(P); Inc(Integer(P), 4); Dec(elemCount); end; else Error(reInvalidPtr); end; end; Можно финалайзаррэй на свой подменить. — Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию Последний раз редактировалось M.A.D.M.A.N., 30.03.2014 в 09:00. |
#26
|
||||
|
||||
Кстати, попутно в ХЕ5 баг нашел, еще в пятницу на работе обнаружили странное поведение у TValues с объектами, дак вот, смысл в том, что дельфи ХЕ5 класс-наследник от TObject определяет как UString и пытается с ним как со строками работать, соответственно выдает ошибки
— Как тебя понимать? — Понимать меня не обязательно. Обязательно меня любить и кормить вовремя. На Delphi, увы, больше не программирую. Рекомендуемая литература по программированию |
#27
|
||||
|
||||
да, странно что компилятор не вызывает конструкторы при инициализации динмассива объектов и деструкторы при финализации. как легко было б программистам
Пишу программы за еду. __________________ |
#28
|
||||
|
||||
Цитата:
Цитата:
Загвоздка в том, что это мы с тобой знаем про интерфейсы, но не задавальщики вопросов на форумах. Не стоит путать форумы с богадельнями. © Bargest |
#29
|
||||
|
||||
Цитата:
Je venus de nulle part 55.026263 с.ш., 73.397636 в.д. |
#30
|
||||
|
||||
Цитата:
Цитата:
|