![]() |
|
|
|||||||
| Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
![]() |
|
|
Опции темы | Поиск в этой теме | Опции просмотра |
|
#16
|
|||
|
|||
|
Динамические массивы используются, когда заранее неизвестно кол-во элементов. В принципе, для любого типа можно использовать списки, НО! для простых типов, не указателей, надо специально создавать указатель и выделять память, что ведет еще к большей фрагментации памяти. Хотя для динамического массива возможны скрытые расходы на получение нового блока памяти и копирование элементов из старого в новый массив.
А вообще, можно любую синтаксическую конструкцию использовать так, что захочется руки оторвать. И что теперь, минимизировать возможности языков? |
|
#17
|
||||
|
||||
|
Цитата:
|
|
#18
|
||||
|
||||
|
Цитата:
Ага, пусть компилятор сам думает. C# получится тогда, или ПыХыПы |
|
#19
|
||||
|
||||
|
Цитата:
|
|
#20
|
||||
|
||||
|
Цитата:
|
|
#21
|
||||
|
||||
|
И не должны, так при создании динамического массива и Create не вызывается. Он просто не существует.
|
|
#22
|
||||
|
||||
|
Еще раз говорю, у них разная абстракция данных, массивы - это наследие из паскаля, в котором не было понятия объекта.
|
|
#23
|
||||
|
||||
|
Цитата:
Поскольку, как тут правильно заметили, динамические массивы могут использоваться и для невладеющих ссылок, достаточно было бы одного ключевого слова, чтобы показать, что ссылка владеющая. Скажем, пусть это будет class: Код:
type TObjects = array of class TObject; // первый вариант Цитата:
|
|
#24
|
||||
|
||||
|
Хорошо. Поставим задачу так:
У нас есть какие-то объекты, которые мы как-то создали. И есть массив. Динамический. Мы добавляем в него эти объекты. Созданные ранее. А потом удаляем из этого массива. Вопрос: объекты должны удалиться? Ответ - нет. Массив - в данном случае просто список чего угодно. array of integer - динамический массив чисел. array of string - динамический массив строк. array of TPoint - динамический массив точек на плоскости (при этом TPoint есть record, а не class). А array of TObject - это массив объектов. И программист сам должен заботиться о создании и уничтожении этих объектов. |
|
#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;Можно финалайзаррэй на свой подменить. Последний раз редактировалось M.A.D.M.A.N., 30.03.2014 в 09:00. |
|
#26
|
||||
|
||||
|
Кстати, попутно в ХЕ5 баг нашел, еще в пятницу на работе обнаружили странное поведение у TValues с объектами, дак вот, смысл в том, что дельфи ХЕ5 класс-наследник от TObject определяет как UString и пытается с ним как со строками работать, соответственно выдает ошибки
|
|
#27
|
||||
|
||||
|
да, странно что компилятор не вызывает конструкторы при инициализации динмассива объектов и деструкторы при финализации. как легко было б программистам
![]() |
|
#28
|
||||
|
||||
|
Цитата:
Цитата:
Загвоздка в том, что это мы с тобой знаем про интерфейсы, но не задавальщики вопросов на форумах. |
|
#29
|
||||
|
||||
|
Цитата:
|
|
#30
|
||||
|
||||
|
Цитата:
Цитата:
|