Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2011.08.14;
Скачать: CL | DM;

Вниз

заполнить список nil   Найти похожие ветки 

 
Дмитрий   (2011-05-06 17:01) [0]

у меня есть одномерный массив (FArrayLinkers) размера N. Нужно создать список объектов - TObjectList такого же размера как и массив, каждому айтему присвоив - nil. Сейчас это делаю в цикле. Это правильно или можно как-то иначе?

FLinkerItems := TObjectList.Create;
     for I := Low(FArrayLinkers) to High(FArrayLinkers)
       FLinkerItems.Add(nil);


 
RWolf ©   (2011-05-06 17:10) [1]

FLinkerItems := TObjectList.Create;
FLinkerItems.Count:=N;


 
Ega23 ©   (2011-05-06 17:24) [2]


> RWolf ©   (06.05.11 17:10) [1]

FLinkerItems.Count:=N;
неправда твоя, там не nil будет, там будет неизвестно что.


 
Ega23 ©   (2011-05-06 17:28) [3]


> Это правильно или можно как-то иначе?

По-идее быстрее будет
list.Count := N;
for i := 0 to N - 1 do
 list[i] := nil;

Хотя тут чёрт его знает. Тестить надо.


 
RWolf ©   (2011-05-06 17:31) [4]


> 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.


 
Palladin ©   (2011-05-06 17:33) [5]

ZeroMemory(list.List^, list.Count * SizeOf(Pointer));

)


 
Palladin ©   (2011-05-06 17:34) [6]

твоя правда

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) [7]


> Цитата из хелпа 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;



 
Ega23 ©   (2011-05-06 17:35) [8]

А, да. Не увидел
if NewCount > FCount then
    FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)

Был неправ, прошу прощения.


 
Palladin ©   (2011-05-06 17:35) [9]


> Ega23 ©   (06.05.11 17:34) [7]

не заметил )

if NewCount > FCount then
     FillChar(FList^[FCount], (NewCount - FCount) * SizeOf(Pointer), 0)


 
RWolf ©   (2011-05-06 17:36) [10]


> Ega23 ©   (06.05.11 17:34) [7]

ну так обнуляет же,
сначала вызывается SetCapacity(NewCount), потом FillChar.



Страницы: 1 вся ветка

Текущий архив: 2011.08.14;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.009 c
2-1302677107
MrBadge
2011-04-13 10:45
2011.08.14
Рандомный цвет


15-1303504190
Юрий
2011-04-23 00:29
2011.08.14
С днем рождения ! 23 апреля 2011 суббота


1-1261483261
StriderMan
2009-12-22 15:01
2011.08.14
SetBounds у Child ов TScrollBox а


15-1303459236
Дмитрий С
2011-04-22 12:00
2011.08.14
HDFury DVI-D->VGA


1-1261590906
Alex_C
2009-12-23 20:55
2011.08.14
Windows 7 64 bit и SetLength