![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
заполнить список nil
Дмитрий © (2011-05-06 17:01:00)у меня есть одномерный массив (FArrayLinkers) размера N. Нужно создать список объектов - TObjectList такого же размера как и массив, каждому айтему присвоив - nil. Сейчас это делаю в цикле. Это правильно или можно как-то иначе?
FLinkerItems := TObjectList.Create;
for I := Low(FArrayLinkers) to High(FArrayLinkers)
FLinkerItems.Add(nil);
RWolf (2011-05-06 17:36:00) [1]
> Ega23 © (06.05.11 17:34) [7]
ну так обнуляет же,
сначала вызывается SetCapacity(NewCount), потом FillChar.
Ega23 (2011-05-06 17:35:00) [2]А, да. Не увидел
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
Был неправ, прошу прощения.
Palladin (2011-05-06 17:35:00) [3]
> Ega23 © (06.05.11 17:34) [7]
не заметил )
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
Palladin (2011-05-06 17:34:00) [4]твоя правда
procedure TList.SetCount(NewCount: Integer);
var
I: Integer;
begin
if (NewCount < 0) or (NewCount > MaxListSize) then
Error(@SListCountError, NewCount);
if NewCount > FCapacity then
SetCapacity(NewCount);
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
else
for I := FCount - 1 downto NewCount do
Delete(I);
FCount := NewCount;
end;
Ega23 (2011-05-06 17:34:00) [5]
> Цитата из хелпа D7:
> Increasing the size of Count will add the necessary number
> of nil (Delphi) or NULL (C++) pointers to the end of the
> Items array.
D2010
procedure TList.SetCount(NewCount: Integer);
var
I: Integer;
Temp: Pointer;
begin
if (NewCount < 0) or (NewCount > MaxListSize) then
Error(@SListCountError, NewCount);
if NewCount <> FCount then
begin
if NewCount > FCapacity then
SetCapacity(NewCount);
if NewCount > FCount then
FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)
else
if ClassType <> TList then
begin
for I := FCount - 1 downto NewCount do
begin
Dec(FCount);
Temp := List^[I];
if Temp <> nil then
Notify(Temp, lnDeleted);
end;
end;
FCount := NewCount;
end;
end;
procedure TList.SetCapacity(NewCapacity: Integer);
begin
if (NewCapacity < FCount) or (NewCapacity > MaxListSize) then
Error(@SListCapacityError, NewCapacity);
if NewCapacity <> FCapacity then
begin
ReallocMem(FList, NewCapacity * SizeOf(Pointer)); // Вот оно
FCapacity := NewCapacity;
end;
end;
Palladin (2011-05-06 17:33:00) [6]
ZeroMemory(list.List^, list.Count * SizeOf(Pointer));
)
RWolf (2011-05-06 17:31:00) [7]
> Ega23 © (06.05.11 17:24) [2]
> неправда твоя, там не nil будет, там будет неизвестно что.
Цитата из хелпа D7:
Increasing the size of Count will add the necessary number of nil (Delphi) or NULL (C++) pointers to the end of the Items array.
Ega23 (2011-05-06 17:28:00) [8]
> Это правильно или можно как-то иначе?
По-идее быстрее будет
list.Count := N;
for i := 0 to N - 1 do
list[i] := nil;
Хотя тут чёрт его знает. Тестить надо.
Ega23 (2011-05-06 17:24:00) [9]
> RWolf © (06.05.11 17:10) [1]
FLinkerItems.Count:=N;
неправда твоя, там не nil будет, там будет неизвестно что.
RWolf (2011-05-06 17:10:00) [10]
FLinkerItems := TObjectList.Create;
FLinkerItems.Count:=N;