Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

заполнить список 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;


Наверх

Титульная страница Поиск, карта сайта Написать письмо