Главная страница
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
15-1303417791
Юрий
2011-04-22 00:29
2011.08.14
С днем рождения ! 22 апреля 2011 пятница


15-1303562654
И. Павел
2011-04-23 16:44
2011.08.14
Нужно ли так распинаться?


15-1301585177
R_R
2011-03-31 19:26
2011.08.14
Как в C# добавить поле в класс, которое заранее не объявлено?


2-1304482497
Moli
2011-05-04 08:14
2011.08.14
как переписать формулу с Q basik на Delphi?


15-1303457253
>|<
2011-04-22 11:27
2011.08.14
Посоветуйте компоненты для раскраски SQL